1

次のようなクエリを作成しています。

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||''')
               )

今でp_supp_nbrNULL、それは取られていません。

私はこのようになります:

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

テーブル内のチェックスペース

しかし、私((NULL IS NULL) OR (supplr_vn =NULL))は条件が無効になるようにしたい

4

3 に答える 3

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
               )

もちろん、動的 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;

どちらの方法でも、次のように実行時に値をバインドできます。

OPEN my_refcursor FOR v_sql USING v_area, p_supp_nbr;
于 2013-01-17T11:11:50.330 に答える
1

これを試して:

v_sql:=' SELECT abc FROM '||v_table||'
WHERE area IN ('''||v_area||''') 
  AND (('''||p_supp_nbr||''' IS NULL) 
  OR supplr_vn IN ('''||NVL(p_supp_nbr, 'NULL')||'''))
于 2013-01-17T11:05:56.643 に答える
0

一般的な Oracle の例:

DECLARE
  v_sql1        VARCHAR2(200);
  v_sql2        VARCHAR2(200);
  v_tab_name    VARCHAR2(200):= 'scott.emp';
  v_listCol     VARCHAR2(200):= 'job';
  v_list        VARCHAR2(200):= '''MANAGER'', ''CLERK''';
 --
  v_colName     VARCHAR2(200):= 'comm';
  v_comm        NUMBER:= 1400;
BEGIN
  v_sql1:= 'SELECT * FROM '|| v_tab_name ||' WHERE '||v_listCol ||' IN (:v)';
  v_sql2:= 'SELECT * FROM '|| v_tab_name ||' WHERE ('||v_colName ||' = :v OR '||v_colName ||' IS NULL)';
 --
  EXECUTE IMMEDIATE v_sql1 USING v_list;
    dbms_output.put_line(v_sql1);
 --
  EXECUTE IMMEDIATE v_sql2 USING v_comm;
  dbms_output.put_line(v_sql2);
END;
/
于 2013-01-17T15:26:40.097 に答える