Oracle PL/SQL执行立即内部循环(截断模式中所有表的过程)
我需要创建一个过程,该过程将从一个模式中的表中删除所有数据。我试过那样的东西Oracle PL/SQL执行立即内部循环(截断模式中所有表的过程),oracle,plsql,procedure,execute-immediate,Oracle,Plsql,Procedure,Execute Immediate,我需要创建一个过程,该过程将从一个模式中的表中删除所有数据。我试过那样的东西 CREATE OR REPLACE PROCEDURE CLEAR_ALL IS sql_truncate VARCHAR2(50); cursor c1 is SELECT table_name FROM all_tables WHERE owner = 'KARCHUDZ_S'; BEGIN sql_truncate := 'TRUNCATE TABLE :text_string'
CREATE OR REPLACE PROCEDURE CLEAR_ALL
IS
sql_truncate VARCHAR2(50);
cursor c1 is
SELECT table_name
FROM all_tables
WHERE owner = 'KARCHUDZ_S';
BEGIN
sql_truncate := 'TRUNCATE TABLE :text_string';
FOR table_name in c1
LOOP
EXECUTE IMMEDIATE sql_truncate USING table_name;
END LOOP;
END CLEAR_ALL;
但它给了我两个我无法理解和纠正的错误
错误(13,7):PL/SQL:语句被忽略
错误(13,44):PLS-00457:station必须是SQL类型您不能使用绑定变量(即您的
使用
子句)作为对象名称的占位符。如果可以,首先就不需要使用动态SQL。您必须使用串联或替换:
CREATE OR REPLACE PROCEDURE CLEAR_ALL
IS
sql_truncate CONSTANT VARCHAR2(50) := 'TRUNCATE TABLE [text_string]';
cursor c1 is
SELECT table_name
FROM all_tables
WHERE owner = 'KARCHUDZ_S';
BEGIN
FOR row in c1
LOOP
EXECUTE IMMEDIATE replace(sql_truncate, '[text_string]', row.table_name);
END LOOP;
END CLEAR_ALL;
为什么不直接生成语句并调用它,就像这样
CREATE OR REPLACE PROCEDURE CLEAR_ALL
IS
vs_statement VARCHAR2(100);
cursor c1 is
SELECT table_name
FROM all_tables
WHERE owner = 'KARCHUDZ_S';
BEGIN
FOR table_rec in c1
LOOP
vs_statement := 'TRUNCATE TABLE ' || table_rec.table_name;
EXECUTE IMMEDIATE vs_statement;
END LOOP;
END CLEAR_ALL;