动态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 中动态构建 WHERE 子句,无需硬解析即可执行