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