아래 프로 시저를 실행하려고하는데, 코드의 DBMS_OUTPUT이 프로 시저의 익명 블록을 실행하고 p_code에 NULL을 전달하는 경우 디코드 함수에서 Null 값을 사용하지 않습니다. P_code의 위치에 표현이 누락 된 오류를 표시하고 공백을 표시합니다.동적 SQL 디코드가 null 값을 취하지 않음
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;
즉시 테이블 만들기를 중지하십시오. 성능과 디자인에 문제가 있습니다. – zaratustra
'P_FLAG' 인자가 없으므로 컴파일되지 않습니다. 그게 추가되면 그것은 확인을 실행하고 당신이 말한 오류가 아니라 출력을 표시합니다. 'EXECUTE IMMEDIATE'를 시도해 보면 디코드에서'P_CODE'가 범위를 벗어나므로 ORA-00904 유효하지 않은 식별자가 생길 것입니다. 동적 SQL 문자열에 프로 시저 인수 값이 표시되지 않습니다. 실제 오류를 생성하는 실제 코드를 표시하면 도움이됩니다. (왜 동적 인 SQL을 사용하여 왜 테이블을 생성하는 것이 좋지 않은지 잘 모르겠다. GTT가있는 것처럼 보이기 때문에 그 작업 방법을 알아야한다.) –
주석 주셔서 감사합니다. @ Zaratustra 동적 테이블 생성은 요청이 순차적으로 호출되는 대신 스레드 될 수 있으므로 중요합니다. –