Oracle PL/SQL函数返回的值未打印出来

Oracle PL/SQL函数返回的值未打印出来,oracle,plsql,Oracle,Plsql,我编写了一个PL/SQL函数,该函数根据员工id更新工资,并将秒表作为从天到秒的间隔返回 调用时,它会更新工资,但我也希望它打印出秒表值。如何实现这一目标?我试着添加这行dbms\u output.put\u行(秒表)但该函数仍然只是更新工资,而不打印秒表值 CREATE OR REPLACE function myfunction1(e_empno_in IN NUMBER, e_sal_in IN NUMBER) RETURN INTERVAL DAY TO SECOND IS e_em

我编写了一个PL/SQL函数,该函数根据员工id更新工资,并将秒表作为从天到秒的间隔返回

调用时,它会更新工资,但我也希望它打印出秒表值。如何实现这一目标?我试着添加这行
dbms\u output.put\u行(秒表)
但该函数仍然只是更新工资,而不打印秒表值

CREATE OR REPLACE function myfunction1(e_empno_in IN NUMBER, e_sal_in IN NUMBER)

RETURN INTERVAL DAY TO SECOND
IS 
e_empno emp.empno%TYPE := e_empno_in;
e_sal emp.sal%TYPE := e_sal_in;

thestart TIMESTAMP;
stopwatch INTERVAL DAY TO SECOND;

BEGIN
    SELECT current_timestamp INTO thestart FROM dual;
    UPDATE emp SET sal = e_sal WHERE empno = e_empno;
    IF SQL%ROWCOUNT = 0 THEN
        raise_application_error (-10001, 'No row found for id ' || e_empno);
    END IF;
    SELECT current_timestamp-thestart INTO stopwatch FROM dual;
RETURN stopwatch;
dbms_output.put_line(stopwatch); --> *trying to print out stopwatch value*

END;
调用函数:

BEGIN
dbms_output.put_line(myfunction1(7654, 2559));
END;

您需要
DBMS\u输出。在
RETURN
语句之前放置\u行。 您也不需要使用SQL来获取当前时间(可以在PL/SQL中完成),也不需要重新分配输入参数以将其用作绑定变量

CREATE function myfunction1(
  e_empno_in IN emp.empno%TYPE,
  e_sal_in   IN emp.sal%TYPE
)
RETURN INTERVAL DAY TO SECOND
IS 
  thestart  TIMESTAMP := CURRENT_TIMESTAMP;
  stopwatch INTERVAL DAY TO SECOND;
BEGIN
  UPDATE emp
  SET   sal   = e_sal_in
  WHERE empno = e_empno_in;

  IF SQL%ROWCOUNT = 0 THEN
      raise_application_error (-10001, 'No row found for id ' || e_empno_in );
  END IF;

  stopwatch := CURRENT_TIMESTAMP - thestart;

  DBMS_OUTPUT.PUT_LINE(stopwatch);

  RETURN stopwatch;
END;
/

您需要
DBMS\u输出。在
RETURN
语句之前放置\u行。 您也不需要使用SQL来获取当前时间(可以在PL/SQL中完成),也不需要重新分配输入参数以将其用作绑定变量

CREATE function myfunction1(
  e_empno_in IN emp.empno%TYPE,
  e_sal_in   IN emp.sal%TYPE
)
RETURN INTERVAL DAY TO SECOND
IS 
  thestart  TIMESTAMP := CURRENT_TIMESTAMP;
  stopwatch INTERVAL DAY TO SECOND;
BEGIN
  UPDATE emp
  SET   sal   = e_sal_in
  WHERE empno = e_empno_in;

  IF SQL%ROWCOUNT = 0 THEN
      raise_application_error (-10001, 'No row found for id ' || e_empno_in );
  END IF;

  stopwatch := CURRENT_TIMESTAMP - thestart;

  DBMS_OUTPUT.PUT_LINE(stopwatch);

  RETURN stopwatch;
END;
/

除非我走远了,否则它会在返回处结束。将Put_行调用放在返回之前。您是从SQL*Plus运行此操作的吗?如果是这样,您可能需要将终端输出设置为。。。加上@sefth所说的。是的,
dbms\u输出
行无法访问。如果启用了PL/SQL警告,您将获得
PLW-06002:无法访问的代码
。我认为代码正常,但我没有看到异常
块,这将捕获可能的错误。替换行
dbms\u输出。放置\u行(秒表)
异常,当其他人然后dbms_输出时。put_行('Error'| | SQLCODE);然后再运行一次。我怀疑更新没有发生使用
raise_application_error(-20001,“找不到id的行”|| e_empno)`,as-10001不是引发应用程序错误的用户保留号码!除非我走远了,否则它会在返回处结束。将Put_行调用放在返回之前。您是从SQL*Plus运行此操作的吗?如果是这样,您可能需要将终端输出设置为。。。加上@sefth所说的。是的,
dbms\u输出
行无法访问。如果启用了PL/SQL警告,您将获得
PLW-06002:无法访问的代码
。我认为代码正常,但我没有看到异常
块,这将捕获可能的错误。替换行
dbms\u输出。放置\u行(秒表)
异常,当其他人然后dbms_输出时。put_行('Error'| | SQLCODE);然后再运行一次。我怀疑更新没有发生使用
raise_application_error(-20001,“找不到id的行”|| e_empno)`,as-10001不是引发应用程序错误的用户保留号码!有了这个解决方案,下一个问题(OP)是,“为什么这是一个函数而不是一个过程”?除了在屏幕上显示返回值外,还对返回值进行了什么处理?顺便说一句,即使在
dbms\u output.put\u行(秒表)上有一个无法访问的代码
,该函数仍在
dbms\u输出中调用,该输出应输出
stopwatch
值。@MT0我可能遗漏了什么。。我已经根据你的建议编辑了这个函数。但是在我运行了下面的语句之后,
begindbms_output.put_line(myfunction1(55557787));结束表中的薪资值会更新,但未打印出秒表值。使用此解决方案,下一个问题(OP)是,“为什么这是一个函数而不是一个过程”?除了在屏幕上显示返回值外,还对返回值进行了什么处理?顺便说一句,即使在
dbms\u output.put\u行(秒表)上有一个无法访问的代码
,该函数仍在
dbms\u输出中调用,该输出应输出
stopwatch
值。@MT0我可能遗漏了什么。。我已经根据你的建议编辑了这个函数。但是在我运行了下面的语句之后,
begindbms_output.put_line(myfunction1(55557787));结束表中的薪资值更新,但未打印出
秒表
值。