首页 文章

调用PL / SQL函数时出错

提问于
浏览
0

我创建了一个PL / SQL函数,该函数应该在 new_dept_new 序列的帮助下向表中添加给定数量的记录,我在调用函数时遇到错误:

BEGIN
dbms_output.put_line(myfunction3(3, 'OPERATIONS', 'NEW YORK'));
END;

Error report -
ORA-06503: PL/SQL: Function returned without value

功能:

CREATE OR REPLACE FUNCTION myfunction3(
records_count_in IN NUMBER, dept_name_in IN dept.dname%TYPE, loc_name_in IN dept.loc%TYPE)

RETURN INTERVAL DAY TO SECOND
IS 
thestart  TIMESTAMP := CURRENT_TIMESTAMP;
stopwatch INTERVAL DAY TO SECOND;
records_count NUMBER := records_count_in;
dept_name dept.dname%TYPE := dept_name_in;
loc_name dept.loc%TYPE := loc_name_in;

BEGIN
    FOR i IN 1..records_count LOOP
        INSERT INTO dept VALUES(new_dept_new.nextval, dept_name || TO_CHAR(new_dept_new.currval), loc_name || TO_CHAR(new_dept_new.currval));
COMMIT;
END LOOP;
    stopwatch := CURRENT_TIMESTAMP - thestart;
    DBMS_OUTPUT.PUT_LINE('Time for processing function: ');
RETURN stopwatch;
EXCEPTION WHEN OTHERS 
    THEN dbms_output.put_line('ERROR Processing Request for Department: ' || dept_name_in);
END;

为什么返回的函数没有值?

EDIT: 收到评论的反馈后,我编辑了函数,现在将值插入表中,并返回时间戳值 . 如果插入0行,我还希望引发应用程序错误 .

所以我做了以下事情:

CREATE OR REPLACE FUNCTION myfunction3(
records_count_in IN NUMBER, dept_name_in IN dept.dname%TYPE, loc_name_in IN dept.loc%TYPE)

RETURN INTERVAL DAY TO SECOND
IS 
thestart  TIMESTAMP := CURRENT_TIMESTAMP;
stopwatch INTERVAL DAY TO SECOND;
records_count NUMBER := records_count_in;
dept_name dept.dname%TYPE := dept_name_in;
loc_name dept.loc%TYPE := loc_name_in;

BEGIN
    FOR i IN 1..records_count LOOP
        INSERT INTO dept (deptno, dname, loc) 
        VALUES(new_dept_new.nextval, dept_name || TO_CHAR(new_dept_new.currval), loc_name || TO_CHAR(new_dept_new.currval));
    IF SQL%ROWCOUNT = 0 THEN
    raise_application_error (-20001, 'ERROR Processing Request for Department: ' || dept_name_in);
    END IF;
END LOOP;
    stopwatch := CURRENT_TIMESTAMP - thestart;
    DBMS_OUTPUT.PUT_LINE('Time for processing function: ');
RETURN stopwatch;
END;

但是,如果我调用这样的函数并插入零记录,我没有得到我的自定义错误消息 .

BEGIN dbms_output.put_line(myfunction3(0, 'DEV_OPS', 'NEW YORK')); END;

我怎样才能解决这个问题?

2 回答

  • 0

    函数中有一些异常导致函数命中异常块 . 您的异常块中没有return语句,因此也没有错误 . 添加RAISE语句以查看导致异常的原因 .

  • 1

    除了 exception 块之外,您的 function 似乎没有任何问题 . 我能够使用您使用的表和列名称来模拟场景,并且它工作得很好 . 如果还有其他问题,例如缺少表,序列则不会为您编译 . 因此,它失败的唯一原因是你的 insert 陈述 . 它可能是约束违规,值的长度超过列长度限制等 .

    您可以通过添加 raise 语句在异常块中稍作更改 . 这将帮助您识别调用程序中的实际错误 .

    EXCEPTION WHEN OTHERS 
        THEN dbms_output.put_line('ERROR Processing Request for Department: ' || dept_name_in);
    RAISE;
    

    另外,从不运行类似的插入语句

    INSERT INTO dept VALUES (...)
    

    它不是一个好的编码实践,很难知道它将插入哪个顺序,特别是当有很多列时 .

    始终明确提及列

    INSERT INTO dept ( dept_id,dname,loc)  VALUES (..,..,..);
    

相关问题