在Oracle PL/SQL中的EXECUTE IMMEDIATE中输出字符串

在Oracle PL/SQL中的EXECUTE IMMEDIATE中输出字符串,oracle,plsql,Oracle,Plsql,我试图将循环变量用作字符串,并将其直接用于PL/SQL循环中的EXECUTE IMMEDIATE。这是我的密码: BEGIN FOR i IN ( SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%' ) LOOP vqs := 'DROP TABLE'||i||'' EXECUTE IMMEDIATE

我试图将循环变量用作字符串,并将其直接用于PL/SQL循环中的EXECUTE IMMEDIATE。这是我的密码:

BEGIN
    FOR i IN (
        SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%'
    )
    LOOP
        vqs := 'DROP TABLE'||i||''
        EXECUTE IMMEDIATE vqs;
    END LOOP;
END;
但我得到了一个错误:

Error report -
ORA-06550: line 4, column 1:
PLS-00103: Encountered the symbol "EXECUTE" when expecting one of the following:

   * & = - + ; < / > at in is mod remainder not rem
   <an exponent (**)> <> or != or ~= >= <= <> and or like like2
   like4 likec between || member submultiset
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

您的语法错误,请重试

DECALRE    
   vqs VARCHAR2(100);
BEGIN
   FOR i IN (SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%') LOOP
      vqs := 'DROP TABLE '||i.table_name;
      EXECUTE IMMEDIATE vqs;
   END LOOP;
END;
甚至更简单

BEGIN
   FOR i IN (SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%') LOOP
      EXECUTE IMMEDIATE 'DROP TABLE '||i.table_name;
   END LOOP;
END;

您的语法错误,请重试

DECALRE    
   vqs VARCHAR2(100);
BEGIN
   FOR i IN (SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%') LOOP
      vqs := 'DROP TABLE '||i.table_name;
      EXECUTE IMMEDIATE vqs;
   END LOOP;
END;
甚至更简单

BEGIN
   FOR i IN (SELECT table_name FROM user_tables WHERE LOWER(table_name) LIKE 'tblequityreturnstest_%') LOOP
      EXECUTE IMMEDIATE 'DROP TABLE '||i.table_name;
   END LOOP;
END;

是的,我预料到了。我假设您的代码只是一个片段;从用户表d中选择d.table_name中的i开始,其中LOWERd.table_name如'tblequityreturnstest_u%'循环vqs:='SET TIMING ON;选择a.Ticker,flannreturndataa.EquityReturn,| | | | | | | | |作为AnnReturn FROM | | | i.table | | | a.Ticker ORDER BY 1;取消计时;立即执行VQ;端环;结束/对于类似的情况,在游标中构造所需的DDL可能更简单,或者向游标添加一个伪列并按程序在循环中填充该列,而不是声明一个单独的变量。顺便说一句,您不需要为新的字符串变量指定null,因为默认情况下它已经为null。@MuditSharma如果您有其他代码,请将其添加到问题中或开始一个新的问题。刚刚注意到动态SQL字符串中的设置时间,这是一个SQL*Plus命令。SQL*Plus是一个独立的命令行工具,PL/SQL不能承载它或其他任何东西。我假设您的代码只是一个片段;从用户表d中选择d.table_name中的i开始,其中LOWERd.table_name如'tblequityreturnstest_u%'循环vqs:='SET TIMING ON;选择a.Ticker,flannreturndataa.EquityReturn,| | | | | | | | |作为AnnReturn FROM | | | i.table | | | a.Ticker ORDER BY 1;取消计时;立即执行VQ;端环;结束/对于类似的情况,在游标中构造所需的DDL可能更简单,或者向游标添加一个伪列并按程序在循环中填充该列,而不是声明一个单独的变量。顺便说一句,您不需要为新的字符串变量指定null,因为默认情况下它已经为null。@MuditSharma如果您有其他代码,请将其添加到问题中或开始一个新的问题。刚刚注意到动态SQL字符串中的设置时间,这是一个SQL*Plus命令。SQL*Plus是一个独立的命令行工具,PL/SQL不能承载它,或者其他任何东西。问题真的与输出有关吗?此外,您不应该在问题标题中包含标签。问题是否确实与输出有关?此外,您不应在问题标题中包含标签。