Показать вывод инструкции EXECUTE IMMEDIATE - PullRequest
0 голосов
/ 14 мая 2018

У меня есть хранимая процедура для усечения таблицы, имя которой передается процедуре в качестве параметра.

create or replace procedure delete_data_from_table(table_id VARCHAR2)
is
    cursor table_cur is
        SELECT table_name FROM all_tables WHERE table_name LIKE '%' || table_id || '%';
    tab_name VARCHAR2(25);
BEGIN
    open  table_cur;
    LOOP
        FETCH table_cur into tab_name;
        exit when table_cur%notfound;
        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || tab_name;
    END LOOP;
    close table_cur;
END;

Я хочу отобразить вывод оператора execute immediate, используя DBMS_OUTPUT.PUT_LINE.Возможно ли это сделать?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

Нет собственного вывода из execute immediate или оператора, который вы выполняете.Когда вы усекаете таблицу в клиенте, она обычно сообщает что-то вроде:

Table truncated.

или

Table MY_TABLE truncated.

или аналогичные;но эти сообщения генерируются клиентом, выполняющим команду, а не базой данных.

Вы можете просто сгенерировать любое сообщение, которое хотите в своей процедуре, например:

...
    LOOP
        FETCH table_cur into tab_name;
        exit when table_cur%notfound;
        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || tab_name;
        DBMS_OUTPUT.PUT_LINE('Table ' || tab_name || ' truncated.');
    END LOOP;
...

Если оператор truncateпо какой-либо причине произойдет сбой, тогда он выдаст исключение и не достигнет строки * 1013.

Для других типов операторов вы можете дополнительно использовать SQL%ROWCOUNT, чтобы сообщить о количестве вставленных / обновленных / объединенных строк/ Удалено, чтобы имитировать то, что ваш клиент может показать для них, но это не относится к усечению.

Имейте в виду, что кто-то еще, выполняющий ваш код, может не иметь возможности отображать эти сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...