2

我需要创建一个过程,该过程将从一个模式中的表中删除所有数据。我尝试类似的东西

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:语句必须是 SQL 类型 <--(这个错误我必须翻译,因为我使用具有波兰语语言的 University Oracle 11g 基础)

4

2 回答 2

7

为什么不像这样生成语句并调用它?

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;
于 2014-12-02T20:27:34.777 回答
4

您不能使用绑定变量(即您的using子句)作为对象名称的占位符。如果可以,您一开始就不需要使用动态 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;
于 2014-12-02T20:18:52.950 回答