动态sql中的where子句

Posted

技术标签:

【中文标题】动态sql中的where子句【英文标题】:Where clause in Dynamic sql 【发布时间】: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 返回使用

【问题讨论】:

【参考方案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;

【讨论】:

您可以使用变量作为表名。另外,这行得通吗?

以上是关于动态sql中的where子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:动态 where 子句

动态 SQL WHERE 子句生成

如何在sql中创建动态where子句?

在 SQL 中动态构建 WHERE 子句,无需硬解析即可执行

从搜索表单动态构建 WHERE 子句时如何防止 SQL 注入?

如何使用 SQL 格式的动态 where 子句制作谓词