如何动态构建查询

Sat*_*esh 1 sql oracle plsql dynamic plsqldeveloper

我正在创建一个这样的查询:

v_sql:=' SELECT abc FROM '||v_table||' 
         WHERE area IN ('''||v_area||''') 
           AND (
                ('''||p_supp_nbr||''' IS NULL) 
                OR 
                supplr_vn IN ('''||p_supp_nbr||''')
               )
Run Code Online (Sandbox Code Playgroud)

现在,当p_supp_nbrNULL那么它不是索取.

我是这样的:

((''IS NULL) OR (supplr_vn =''))

它在桌子上的检查空间

但我希望((NULL IS NULL) OR (supplr_vn =NULL))条件无效

Ton*_*ews 7

不要那样做!您冒着SQL注入问题的风险.使用绑定变量:

v_sql:= 'SELECT abc FROM '||v_table||
        ' WHERE area = :v_area
           AND (
                :p_supp_nbr IS NULL
                OR 
                supplr_vn = :p_supp_nbr
               )
Run Code Online (Sandbox Code Playgroud)

当然,既然您知道在生成动态SQL时该值是否为null,您可以改为:

v_sql:= 'SELECT abc FROM '||v_table||' 
         WHERE area = :v_area';
IF p_supp_nbr IS NULL THEN
    v_sql := v_sql || ' AND :p_supp_nbr IS NULL';
ELSE
    v_sql := v_sql || ' AND supplr_vn = :p_supp_nbr';
END IF;
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都可以在运行时绑定值,如下所示:

OPEN my_refcursor FOR v_sql USING v_area, p_supp_nbr;
Run Code Online (Sandbox Code Playgroud)

  • @glh我应该在我的回答中解释:是的,它在逻辑上是多余的,但Native Dynamic SQL仅在绑定变量的数量固定时起作用,因此我们需要在查询中引用:p_supp_nbr我们是否使用它. (2认同)