显示EXECUTE IMMEDIATE语句的输出

时间:2018-05-14 16:25:40

标签: sql oracle plsql

我有一个存储过程来截断名称作为参数传递给过程的表。

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 :(得分:4)

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语句因任何原因失败,那么它将抛出异常并且它不会到达dbms_output行。

对于其他语句类型,您可以选择使用SQL%ROWCOUNT来报告插入/更新/合并/删除的行数,以模仿客户端可能为这些行显示的内容,但这并不适用于截断。

请记住,运行代码的其他人可能没有显示已启用的消息。