【问题标题】:PL/SQL EXECUTE IMMEDIATE inside LOOP (procedure to truncate all tables in schema)PL/SQL EXECUTE IMMEDIATE inside LOOP(截断模式中所有表的过程)
【发布时间】:2015-01-31 04:57:08
【问题描述】:

我需要创建一个过程,该过程将从一个模式中的表中删除所有数据。我尝试这样的事情

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:语句被忽略

Error(13,44): PLS-00457: 语句必须是 SQL

【问题讨论】:

    标签: oracle plsql procedure execute-immediate


    【解决方案1】:

    您不能使用绑定变量(即您的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;
    

    【讨论】:

      【解决方案2】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 2021-04-15
        • 1970-01-01
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        相关资源
        最近更新 更多