我创建了一个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;
为什么返回没有值的函数?
修改 收到评论的反馈后,我编辑了函数,现在将值插入表中,并返回时间戳值。如果插入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;
我该如何解决这个问题?
答案 0 :(得分:1)
除function
块之外,exception
似乎没有任何问题。我能够使用您使用的表名和列名来模拟场景,并且它工作得非常好。如果还有其他问题,例如缺少表,序列则不会为您编译。因此,失败的唯一原因是您的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 (..,..,..);
答案 1 :(得分:0)
您的函数中存在一些异常导致函数命中异常块。您的异常块中没有return语句,因此错误。添加RAISE语句以查看导致异常的原因。