简体   繁体   English

如何动态建立查询

[英]How to build the query dynamically

I am creating a query like this: 我正在创建这样的查询:

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

Now when the p_supp_nbr is NULL then its not taking. 现在,当p_supp_nbrNULL时,则不接收。

I get like this: 我得到这样的:

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

Its checking space in the table 表格中的检查空间

but i want ((NULL IS NULL) OR (supplr_vn =NULL)) so that condition bcomes ineffective 但我想要((NULL IS NULL) OR (supplr_vn =NULL))以便条件bcom无效

Don't do that! 不要那样做! You risk SQL Injection issues. 您冒着SQL注入问题的风险。 Use bind variables: 使用绑定变量:

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

Of course since you know at the point of generating the dynamic SQL whether the value is null you could instead do this: 当然,由于您知道生成动态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;

Either way you can then bind the values at runtime like this: 无论哪种方式,您都可以像下面这样在运行时绑定值:

OPEN my_refcursor FOR v_sql USING v_area, p_supp_nbr;

Try this: 尝试这个:

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

General Oracle example: 一般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;
/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM