2014-09-16 3 views
-1

아래 프로 시저를 실행하려고하는데, 코드의 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; 
+1

즉시 테이블 만들기를 중지하십시오. 성능과 디자인에 문제가 있습니다. – zaratustra

+0

'P_FLAG' 인자가 없으므로 컴파일되지 않습니다. 그게 추가되면 그것은 확인을 실행하고 당신이 말한 오류가 아니라 출력을 표시합니다. 'EXECUTE IMMEDIATE'를 시도해 보면 디코드에서'P_CODE'가 범위를 벗어나므로 ORA-00904 유효하지 않은 식별자가 생길 것입니다. 동적 SQL 문자열에 프로 시저 인수 값이 표시되지 않습니다. 실제 오류를 생성하는 실제 코드를 표시하면 도움이됩니다. (왜 동적 인 SQL을 사용하여 왜 테이블을 생성하는 것이 좋지 않은지 잘 모르겠다. GTT가있는 것처럼 보이기 때문에 그 작업 방법을 알아야한다.) –

+0

주석 주셔서 감사합니다. @ Zaratustra 동적 테이블 생성은 요청이 순차적으로 호출되는 대신 스레드 될 수 있으므로 중요합니다. –

답변

0

위 코드는 사용자가 말한 오류를 생성하지 않습니다. 누락 된 P_FLAG 매개 변수는 dbms_output 작동을 무시하고 execute immediatep_code이 범위를 벗어남에 따라 ORA-00904를 얻습니다. 그래서 난 당신이 코드를 실행하고 연결될 때 실제로 ORA-00936없는 표현을 가지고 있음을 추론 p_code 값, 같은 :

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

. .. 그러므로 오류.

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

가 null 생성 된 코드 가져 p_code가되는 경우 : p_code가 null이 아닌 경우

AND '1'='1' 

은 통과 SOME_VALUE의 말을

그래서 당신은 문자열 생성에 p_code를 해석 할 필요가 생성 된 코드는 다음과 같습니다.

AND PP.CODE='SOME_VALUE' 

p_code이 null 인 경우 전체 절을 생략 할 수 있지만 중복 동어 형을 갖는 것보다는 유용합니다.

+0

오, 실제로 작동 :) 감사 톤! –

관련 문제