Могу ли я получить многострочное сообщение об ошибке в PL / SQL? - PullRequest
2 голосов
/ 02 мая 2020

Я выполняю следующее предложение в конце моего сценария:

BEGIN IF :MAIN_ERR_ID = 'Y' THEN
    RAISE_APPLICATION_ERROR(-20000, :ERR_MSG); END IF; END; / 

И я хочу, чтобы моя ошибка была настолько подробной, насколько это возможно, поэтому это:

¡ERROR! JDE Error: There is a Primary Key Duplicate. Execute the following sentence: SELECT * FROM TESTDTA.F4311Z1 WHERE (SZEDUS, SZEDBT, SZEDTN, SZEDLN) IN ((TOR-ELP, FVIDAL100000004, FVIDAL100000004

В настоящее время я получаю следующий вывод:

BEGIN IF :MAIN_ERR_ID = 'Y' THEN
    RAISE_APPLICATION_ERROR(-20000, :ERR_MSG, FALSE);
    RAISE_APPLICATION_ERROR(-20000, :ERR_MSG, TRUE); END IF; END;
Error at line 336
ORA-20000: ¡ERROR! JDE Error: There is a Primary Key Duplicate. Execute the following sentence: SELECT * FROM TESTDTA.F4311Z1 WHERE (SZEDUS, SZEDBT, SZEDTN, SZEDLN) IN ((TOR-ELP, FVIDAL100000004, FVIDAL100000004
ORA-06512: at line 2

Как разделить сообщение об ошибке на несколько строк, не добавляя слишком много кода?

BEGIN IF :MAIN_ERR_ID = 'Y' THEN
    RAISE_APPLICATION_ERROR(-20000, :ERR_MSG, FALSE);
    RAISE_APPLICATION_ERROR(-20000, :ERR_MSG, TRUE); END IF; END;
Error at line 336
ORA-20000: ¡ERROR! JDE Error: There is a Primary Key Duplicate.
ORA-20001: Execute the following sentence:
ORA-20002: SELECT * FROM TESTDTA.F4311Z1 WHERE (SZEDUS, SZEDBT, SZEDTN, SZEDLN) IN ((TOR-ELP, FVIDAL100000004, FVIDAL100000004
ORA-06512: at line 2

1 Ответ

3 голосов
/ 02 мая 2020

Может как то так?

SQL> declare
  2    l_ename emp.ename%type;
  3    l_msg   varchar2(500);
  4  begin
  5    -- this will raise too-many-rows
  6    select e.ename
  7      into l_ename
  8      from emp e
  9      where e.deptno = 10;
 10
 11  exception
 12    when too_many_rows then
 13      l_msg := 'There are too many employees '                    || chr(10) ||
 14               lpad('. ', 11, '.') || 'working in department 10.' || chr(10) ||
 15               lpad('. ', 11, '.') || 'Run SELECT * FROM EMP WHERE DEPTNO = 10';
 16      raise_application_error (-20000, l_msg);
 17  end;
 18  /
declare
*
ERROR at line 1:
ORA-20000: There are too many employees
.......... working in department 10.
.......... Run SELECT * FROM EMP WHERE DEPTNO = 10
ORA-06512: at line 16


SQL>
...