Oracle 存储过程中错误代码的返回消息

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8598601/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 00:31:05  来源:igfitidea点击:

Return Message of Error code in Oracle Stored Proc

oracleoracle10goracle11goracle9i

提问by Mike

The below procedure (in Oracle 11g release 1) accepts a sql as a parameter & returns its return code.

以下过程(在 Oracle 11g 第 1 版中)接受 sql 作为参数并返回其返回代码。

Returns 0 if success

如果成功则返回 0

Returns 1 if no update or no delete performs

如果没有更新或没有执行删除,则返回 1

Returns actual error code in case of failure.

失败时返回实际的错误代码。

How can I change below procedure to return me another out param say "return_message" which will contain short description of oracle internal error message? In case of success, it should say "success" and in case no delete/updates performed, it should say "nochange"

如何更改以下程序以返回另一个输出参数“return_message”,其中将包含对 oracle 内部错误消息的简短描述?如果成功,它应该说“成功”,如果没有执行删除/更新,它应该说“nochange”

CREATE OR REPLACE PROCEDURE "demo"."run_demo"(v_sql IN VARCHAR2, return_code OUT number)
AS

i number;

BEGIN
   return_code := 0;
   execute immediate v_sql;
   i := sql%rowcount;

   IF (i<1)
     THEN return_code := 1;
   END IF;

EXCEPTION  
   WHEN OTHERS THEN
   return_code := SQLCODE;
END;

回答by Daniel Haviv

You want to use the SQLERRM function.

您想使用 SQLERRM 函数。

Here's your code:

这是你的代码:

CREATE OR REPLACE PROCEDURE "demo"."run_demo"(v_sql IN VARCHAR2, return_code OUT number, return_message out varchar2)
AS

i number;

BEGIN
   return_code := 0;
   execute immediate v_sql;
   i := sql%rowcount;

   IF (i<1)
     THEN return_code := 1;
   END IF;

EXCEPTION  
   WHEN OTHERS THEN
   return_message := SQLERRM;
   return_code := SQLCODE;
END;

回答by John Doyle

You can try using SQLERRM to return the message. E.g.,

您可以尝试使用 SQLERRM 返回消息。例如,

create or replace procedure RUN_DEMO(V_SQL in varchar2, RETURN_CODE out number, RETURN_MSG out varchar2) as
  I                                number;
begin
  RETURN_CODE := 0;

  execute immediate V_SQL;

  I := sql%rowcount;

  if (I < 1) then
    RETURN_CODE := 1;
  end if;
exception
  when others then
    RETURN_CODE := sqlcode;
    RETURN_MSG := sqlerrm;
end;