Возвращаемое сообщение с кодом ошибки в Oracle Stored Proc - PullRequest
3 голосов
/ 22 декабря 2011

Следующая процедура (в Oracle 11g выпуск 1) принимает sql в качестве параметра и возвращает его код возврата.

Возвращает 0 в случае успеха

Возвращает 1, если не выполняется обновление или удаление не выполняется

Возвращает действительный код ошибки в случае ошибки.

Как я могу изменить приведенную ниже процедуру, чтобы вернуть мне другой выходной параметр, скажем "return_message", который будет содержать краткое описание внутреннего сообщения об ошибке оракула? В случае успеха, он должен сказать «успех», а в случае, если не было выполнено удаление / обновление, он должен сказать «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 ]

8 голосов
/ 22 декабря 2011

Вы хотите использовать функцию 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;
3 голосов
/ 22 декабря 2011

Вы можете попробовать использовать 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;
...