【问题标题】:Where clause in Dynamic sql动态sql中的where子句
【发布时间】:2017-06-19 19:38:25
【问题描述】:

我正在尝试获取 bank_id 为 01 的所有表。 我已经写了以下代码块

DECLARE

 cursor cBankId is
     select owner||'.'||table_name from all_tab_columns where column_name = 'BANK_ID';
        v_table     all_tab_columns.table_name%TYPE;
        vcount varchar2(50);

BEGIN

     open cBankId;
    loop
        fetch cBankId into v_table;
        exit when cBankId%notfound;

execute immediate 'select count(*) from ' || v_table into vcount || ' where bank_id  = 01';


IF vcount > 0 THEN
    DBMS_OUTPUT.PUT_LINE (v_table);
END IF;

end loop;
    close cBankId;

END;

我想知道如何将 where 子句放在执行立即语句中。 我收到错误 ORA-06550:第 15 行,第 67 列: PLS-00103:遇到符号“|”预期以下情况之一时:

。 ( , % ; return 返回使用

【问题讨论】:

    标签: oracle oracle12c


    【解决方案1】:

    您只需要更改编写查询部分的顺序。 使用动态 SQL 时,您需要这样的东西:

    SQL> declare
      2      v_table varchar2(30);
      3      vCount  number;
      4  begin
      5      v_table := 'dual';
      6      execute immediate 'select count(*) from ' || v_table  || ' where 1=1' into vcount;
      7      --
      8      dbms_output.put_line('vCount: ' || vCount);
      9  end;
     10
     11  /
    vCount: 1
    
    PL/SQL procedure successfully completed.
    

    即:execute immediate 'select ... from ... where ...' INTO ...;

    【讨论】:

      【解决方案2】:

      您不能动态使用变量作为表名,而是使用:

      DECLARE
      
      cursor cBankId is
       select owner||'.'||table_name from all_tab_columns where column_name = 'BANK_ID';
          v_table     all_tab_columns.table_name%TYPE;
          vcount varchar2(50);
          v_sql varchar2(1000);
      
      
      BEGIN
      
       open cBankId;
      loop
          fetch cBankId into v_table;
          exit when cBankId%notfound;
      
      v_sql := 'select count(*) from ' || v_table || ' into vcount where bank_id  = 01';   
      
      execute immediate v_sql;
      
      IF vcount > 0 THEN
          DBMS_OUTPUT.PUT_LINE (v_table);
      END IF;
      
      end loop;
          close cBankId;
      
      END;
      

      【讨论】:

      • 您可以使用变量作为表名。另外,这行得通吗?
      猜你喜欢
      • 2010-09-13
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多