动态sql解码没有取空值

时间:2014-09-16 09:17:41

标签: oracle stored-procedures dynamic-sql

我正在尝试运行以下过程,代码的DBMS_OUTPUT在Decode函数中没有取Null值,即如果我运行过程的匿名块并在p_code中传递NULL,则会给出错误表达式错误并显示空白在P_code的位置。

create or replace 
    PROCEDURE PROC_ORDER_VIOLATION_new_1(
        P_TYPE          NUMBER,
        P_CODE          VARCHAR2,
        REQUEST_ID IN VARCHAR2,
        USER_ID    IN VARCHAR2,
        V_OUT OUT VARCHAR2 )
    IS
    Begin

    EXECUTE IMMEDIATE 'CREATE TABLE '||REQUEST_ID|| ' AS SELECT * FROM GTT_ORDER_VIOLATION_TAB_NEW WHERE 1=2';

    --EXECUTE IMMEDIATE 
    dbms_output.put_line('INSERT
      INTO '||REQUEST_ID||
        ' (
          O_ID,
          PARTNER_TYPE_NAME,
          COMPANY_NAME,
          PARTNER_CODE,
          PO_NUMBER,
          PO_STATUS,
          PO_SUBMIT_DATE,
          PO_APPROVAL_DATE,
          ORDERING_RATIO_FLAG
        )'||
      ' SELECT O.ID,
        pt.name,
        PP.COMPANY_NAME,
        PP.CODE,
        O.ORDER_NUMBER,
        O.STATUS,
        O.SUBMIT_DATE,
        O.APPROVAL_DATE,
        O.ORDERING_RATIO_FLAG '||
       'FROM ORDERS O,
        PARTNERPROFILE PP,partnertype pt '||
      'WHERE PP.TYPE_ID                   ='||P_TYPE||
      ' AND O.ORDERING_RATIO_FLAG          ='||P_FLAG||
      ' AND PP.ID                          =O.TO_PARTNER_ID
      and pt.id=pp.type_id 
      AND DECODE(P_CODE,NULL,''1'',PP.CODE)= DECODE(P_CODE,NULL,''1'',P_CODE)');--here the dbms_output gives nothing at place of p_code
    end;

1 个答案:

答案 0 :(得分:0)

您展示的代码不会产生您说的错误;缺少P_FLAG参数会忽略dbms_output工作,而execute immediate获取ORA-00904则p_code超出范围。因此,当您执行代码并连接p_code值时,我推断您确实得到了ORA-00936缺少的表达式,如:

AND DECODE('||P_CODE||',NULL,''1'',PP.CODE)= DECODE('||P_CODE||',NULL,''1'','||P_CODE||')';

p_code为空时会转为:

AND DECODE(,NULL,'1',PP.CODE)= DECODE(,NULL,'1',)

...因此错误。

所以你需要解释字符串生成中的p_code

AND '|| CASE WHEN P_CODE IS NULL THEN '''1''' ELSE 'PP.CODE' END ||
  '='''||NVL(P_CODE, 1)||'''';

p_code为null时,生成的代码将获得:

AND '1'='1'

p_code不为空时,传递说SOME_VALUE,生成的代码将获得:

AND PP.CODE='SOME_VALUE'

虽然我可能在p_code为空时忽略整个条款,而不是冗余的重言式。