我正在尝试运行以下过程,代码的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;
答案 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
为空时忽略整个条款,而不是冗余的重言式。