Как сохранить результат оператора SQL в переменную? - PullRequest
0 голосов
/ 23 сентября 2019

Я нахожусь в БД Oracle 12.2.

Я хочу написать процедуру, которая усекает таблицу и затем сохраняет результат вывода в другую таблицу, так что-то вроде этого:

CREATE OR REPLACE PROCEDURE truncate_my_table_and_save_result
IS
  variable_output varchar;
BEGIN
     TRUNCATE TABLE EMPLOYEES;
     variable_output := SQL%RESULT;
     insert into log_table (result_column) VALUES (variable_output);

   end;
/

но, конечно, variable_output: = SQL% RESULT;неверный синтаксический код, так что я должен использовать вместо этого?

ОБНОВЛЕНИЕ: Дело в том, что я действительно хочу перехватить ошибку, если она происходит в TRUNCATE (например, ресурс ORA-00054 NOWAIT).

1 Ответ

1 голос
/ 23 сентября 2019

Нет флага успеха в SQL или PL / SQL.Если это не удается, это вызывает исключение.

Таким образом, вы можете сделать это (очевидно, в зависимости от того, какой именно текст вы хотите записать) ....

CREATE OR REPLACE PROCEDURE truncate_my_table_and_save_result
IS
  variable_output varchar;
BEGIN

    -- Note we cannot write DDL in PL/SQL. Hence the dynamic SQL.
     execute immediate 'TRUNCATE TABLE EMPLOYEES';

     insert into log_table (result_column) VALUES ('Success!');

exception

  when others then
    /* I really want to catch an error if it occurs at TRUNCATE 
     (ORA-00054 resource NOWAIT for example) */
    insert into log_table (result_column) VALUES (SQLERRM);

end;
/

Если честно, я думаю, что этот поток представляет собой плохую практику.Он поглощает исключение, поэтому вызывающая программа не может узнать, что оператор не выполнен.Но если мы выдадим исключение, вставка будет откатана, поэтому нам нужно зафиксировать вставку:

    …
exception
  when others then
    insert into log_table (result_column) VALUES (SQLERRM);
    commit;
    raise;

end;
/

Но это большая проблема.В более общем смысле мы хотим, чтобы сообщения журнала сохранялись, несмотря на то, что происходит с программой, которая их вызывает, но без вмешательства в фактическую транзакцию.

Таким образом, минимально приемлемая реализация ведения журнала была бы:

create or replace procedure log_message (p_message_text in varchar2) is
    pragma autonomous_transaction:
begin
    insert into log_table (result_column) values (p_message_text);
    commit;
end log_message;
/

Но на самом деле вам следует рассмотреть возможность загрузки Logler Тайлера Мута , который ближе всего подходит к стандарту Oracleпакет регистрации.

...