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

时间:2011-12-22 01:48:57

标签: oracle oracle10g oracle11g oracle9i

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

成功时返回0

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

如果失败,则返回实际的错误代码。

如何更改以下程序以返回另一个参数说“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;

2 个答案:

答案 0 :(得分:7)

您想使用SQLERRM函数。

这是你的代码:

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;

答案 1 :(得分:3)

您可以尝试使用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;