【问题标题】:Cant retrieve error from procedure in PL/SQL无法从 PL/SQL 中的过程中检索错误
【发布时间】:2012-12-24 01:33:52
【问题描述】:

我开始使用 PL/SQL 并学习如何编写 proceduresexceptions,但我似乎无法掌握如何显示错误。该过程很简单,它只应该做简单的数学运算,如下所示:

create or replace
procedure get_simple_math
  (n_num1 in number,
   n_num2 in number,
   n_answer out number,
   n_err_code out number,
   n_err_msg out varchar2)
as
begin
  n_answer := (n_num1 / n_num2);
  dbms_output.put_line('Answer is '||n_answer);

  n_err_code := 0;
exception
  when others
  then
    n_err_code := SQLCODE;
    n_err_msg := 'Error in get_simple_math '||SQLERRM;
    raise_application_error (-20002,n_err_msg);
end get_simple_math;

正如你所看到的,它没什么特别的,但我一辈子都无法让block 运行:

set serveroutput on
declare
  n_answer number := 0;
  n_err_code number;
  n_err_msg varchar2;
begin
  get_simple_math(10,5,n_answer);
end;

我假设我需要声明设置为out 的变量,这就是它们存在的原因。我还尝试将它们添加到 procedure 执行如下:

get_simple_math(10,5,n_answer,n_err_code,n_err_msg);

但这似乎并没有解决问题,所以我只是在寻找一些帮助来解决这个问题。提前致谢。

【问题讨论】:

  • 始终发布错误,以便人们知道目标是什么。在这种情况下,一些橡胶闪避应该会有所帮助。错误是 "ORA-06550: line 4, column 13: PLS-00215: String length constraints must be in range (1 .. 32767)",它告诉你问题的确切位置在您的呼叫代码。

标签: exception plsql procedure


【解决方案1】:

运行这个,你会得到答案:

declare
  n_answer number := 0;
  n_err_code number;
  --> n_err_msg varchar2; -- Incorrect
  n_err_msg varchar2(300);     -- Correct
begin
  --> get_simple_math(10,5,n_answer); -- Incorrect call to proc...
  get_simple_math(10,5,n_answer, n_err_code, n_err_msg); -- add out parameters
end;
/

程序部分的一般建议:使用 substr - 可选:

  n_err_msg := 'Error in get_simple_math '||substr(SQLERRM, 1, 250);

【讨论】:

  • 好的,非常感谢,不声明n_err_msg 变量有多大是个愚蠢的错误。感谢您的帮助。
  • @glh 是的,我本来打算但在工作中遇到了一些事情。
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2012-11-19
相关资源
最近更新 更多