oracle 如何生成带通用条件的动态SQL语句

qni6mghb  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(186)

我正在尝试生成具有一般条件的动态SQL语句。根据某些条件,将在where子句中添加不同的其他条件。
我想做这样的事:

declare
    v_sql varchar2(500);
    a number;
    v_dummy number := 1;
begin
    v_sql := 'delete tab_1 where v_dummy = 1 ';
    if a = 1 
       then v_sql := v_sql || ' and col_1 = 1';
       else v_sql := v_sql || ' and col_2 = 3';
    end if;
    execute immediate v_sql;
    dbms_output.put_line(v_sql);
end;

引发的错误为:
ORA-00904:“V_假人”:无效标识符
有谁能告诉我如何处理这种情况吗?问题在于第一个条件(v_dummy = 1)的定义,我需要添加它才能将“and”操作数用于第二个条件。
谢谢你,

zzzyeukh

zzzyeukh1#

使用绑定变量:

declare
    v_sql varchar2(500);
    a number;
    v_dummy number := 1;
begin
    v_sql := 'delete tab_1 where :v_dummy = 1 ';
    if a = 1 
       then v_sql := v_sql || ' and col_1 = 1';
       else v_sql := v_sql || ' and col_2 = 3';
    end if;
    execute immediate v_sql USING v_dummy;
    dbms_output.put_line(v_sql);
end;
/

或者因为它的计算结果为1 = 1,所以可以省略它:

declare
    v_sql varchar2(500);
    a number;
begin
    v_sql := 'delete tab_1';
    if a = 1 
       then v_sql := v_sql || ' where col_1 = 1';
       else v_sql := v_sql || ' where col_2 = 3';
    end if;
    execute immediate v_sql;
    dbms_output.put_line(v_sql);
end;
/
u7up0aaq

u7up0aaq2#

如果您可能需要多个条件(不在代码中),则可以设置初始条件,只需输入col_1 = col_1。根本不需要伪变量,您可以选择添加更多条件:

declare
    v_sql varchar2(500);
    a number;
begin
    v_sql := 'delete tab_1 where col_1 = col_1 ';
    if a = 1 then 
        v_sql := v_sql || ' and col_1 = 1';
    else 
        v_sql := v_sql || ' and col_2 = 3';
    end if;
    execute immediate v_sql;
    dbms_output.put_line(v_sql);
end;

相关问题