显示 EXECUTE IMMEDIATE 语句的输出

NJM*_*JMR 0 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;
Run Code Online (Sandbox Code Playgroud)

execute immediate我想使用显示语句的输出DBMS_OUTPUT.PUT_LINE。可以这样做吗?

提前致谢。

Ale*_*ole 5

execute immediate您正在运行的语句没有本机输出。当您在客户端中截断表时,它通常会报告类似以下内容的信息:

Table truncated.
Run Code Online (Sandbox Code Playgroud)

或者

Table MY_TABLE truncated.
Run Code Online (Sandbox Code Playgroud)

或类似的;但这些消息是由运行命令的客户端生成的,而不是由数据库生成的。

您可以在程序中生成您想要的任何消息,例如:

...
    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;
...
Run Code Online (Sandbox Code Playgroud)

如果 truncate 语句由于任何原因失败,那么它将抛出异常并且不会到达该dbms_output行。

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

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