我有一个存储过程来截断表,该表的名称作为参数传递给该过程。
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。可以这样做吗?
提前致谢。
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报告插入/更新/合并/删除的行数来模拟客户端可能显示的内容,但这不适用于截断。
请记住,运行您的代码的其他人可能没有启用这些消息的显示。