2017-05-01 6 views
0
create or replace PROCEDURE P_STAGE_LOAD(
    in_S IN VARCHAR2, 
    in_D  IN VARCHAR2, 
    in_T IN VARCHAR2) 
IS 
v_ERRM VARCHAR2(32000); 
BEGIN 
    IF in_TBL_NAME ='TRAN_CUSTOMER' THEN 
    EXECUTE immediate 'INSERT INTO TRAN_CUSTOMER 
     (CUSTOMER_ID,AUTH_ID,OTHER_ID,TRAN_TYPE,AUDIT_TS)  
     SELECT CUSTOMER_ID,AUTH_ID,OTHER_ID,NVL(TRAN_TYPE,'PRIMARY'), 
     SYSDATE 
    FROM '||in_S||'.'||in_T||'@'||in_D; 
    EXECUTE immediate 'COMMIT'; 

実行時にInvalid Identifierというエラーが発生します。しかし、SELECTクエリは単独でうまく動作します。 NULLTRAN_TYPEとし、NULLのときにはPRIMARYとなるようにデコードします。 対象テーブルTRAN_CUSTOMERには、NOT NULLの列が入ります。EXECUTE IMMEDIATE SELECTでNVLを使用中に無効な識別子エラーが発生する

には何か不足しているものがありますか?

+0

「END IF」と「END」部分はどこですか?また、エラーの原因となっている行と、エラーコードの正確なエラーは何か。 – Utsav

+0

その行にあるCUSTOMER_ID、AUTH_ID、OTHER_ID、NVL(TRAN_TYPE、 'PRIMARY')、 –

+0

'nvl'を削除して' tran_type'を使うとどうなりますか? – Utsav

答えて

1

PRIMARYには2つの一重引用符を使用する必要があります。最初の一重引用符はEXECUTE IMMEDIATE文字列で終わるためです。

次のような行を使用してください。

EXECUTE immediate 'INSERT INTO TRAN_CUSTOMER 
     (CUSTOMER_ID,AUTH_ID,OTHER_ID,TRAN_TYPE,AUDIT_TS)  
     SELECT CUSTOMER_ID,AUTH_ID,OTHER_ID,NVL(TRAN_TYPE,''PRIMARY''), 
     SYSDATE 
    FROM '||in_S||'.'||in_T||'@'||in_D; 
+0

私は2つの一重引用符を使用しようとし、FROMの後でそれを終了しました。エラー –

+0

あなたが試した声明とエラー – Utsav

関連する問題