2016-05-18 17 views
1

レコードをファイルに書き込もうとしていて、ファイルに書き込めるストアドプロシージャがありますが、問題は私の状態がこのようなときです。ELSIF REC.REC_STAT = 'DUPL'その後、ストアドプロシージャはそこに書き込むことはできませんし、他の手で以下のエラーが発生するこの場合は、REC.REC_STAT = 'NEW'ストアドプロシージャがそこに書き込むことができます。ストアドプロシージャは、Oracleにファイルに書き込むことができません

エラー

ORA-29283: invalid file operation 
ORA-06512: at "SYS.UTL_FILE", line 536 
ORA-29283: invalid file operation 
ORA-06512: at "PS_ADMIN.IRE_DE_DUP_PROC7", line 31 
ORA-06512: at line 9 

SPは次のとおりです。ここで

CREATE OR REPLACE PROCEDURE TEST_SP(Dy_File_Name IN  VARCHAR2, 
              SU_CD  IN  VARCHAR2, 
              EX_ID  IN  VARCHAR2, 
              DUP_FILE_NAME IN VARCHAR2 ) 

AS 


CLREF   SYS_REFCURSOR;  
UNQIUE_REC_FILE UTL_FILE.FILE_TYPE; 
DE_DUP_FILE  UTL_FILE.FILE_TYPE; 
OUT_DIR   VARCHAR2 (200) := 'DE_DUP_OUTPUT_NAME'; 
OUT_DE_DUP_DIR VARCHAR2 (300) := 'DE_DUP_DUPLICATES_NAME'; 



TYPE REC_TYP IS RECORD 

    (

     A varchar2(10), 
     B Varchar2(20), 
     C varchar2(10), 
     D varchar2(30), 
     E varchar2(30), 

    ) 

    REC REC_TYP; 
BEGIN 
    SELECT ABS(DBMS_RANDOM.RANDOM) INTO RNDOM_VAL FROM DUAL; 
    OUTPT_FILE := 'KF_OUTFILE_'||RNDOM_VAL||'.TXT';  
    UNQIUE_REC_FILE := UTL_FILE.FOPEN (OUT_DIR, OUTPT_FILE, 'W'); 

    UTL_FILE.PUT_LINE (UNQIUE_REC_FILE, 'this is test'); 

    OPEN CLREF FOR ('SELECT 

    s.AB AS A, 
    P.AB1 AS B, 
    s.AB2 AS C, 
    S.AB3 AS D, 
    S.AB4 AS E 

    CASE WHEN S.CK = 1 AND H.CK = 0 THEN ''DEL'' 
       WHEN S.CK = 1 AND H.CK IS NULL THEN ''DEL_IGNR'' 
       WHEN S.DETL_CLMNS_HASH <> H.DETL_CLMNS_HASH THEN ''UPDT'' 
       WHEN S.DETL_CLMNS_HASH = H.DETL_CLMNS_HASH THEN ''DUPL'' 
       WHEN H.DETL_CLMNS_HASH IS NULL THEN ''NEW'' 
       ELSE ''ERR'' END AS REC_STAT, 
      S.REC_TYP      AS RE_TYP,  
      S.DETL_CLMNS_HASH    AS DT_CLMNS_HASH, 
      S.KEY_CLMNS_HASH    AS KY_CLMNS_HASH  


     FROM 
      (SELECT stg.*, 
      row_number() over (partition BY key_clmns_hash, rx_dspnsd_dt, del_ind ORDER BY 1) AS RN 
      FROM ' || Dy_File_Name || ' stg 
     ) s 
     LEFT JOIN ps_pha p ON s.EX = p.EX 
     LEFT JOIN ps_rx_hist H 
     ON h.key_clmns_hash  = s.key_clmnS_hash 
     AND h.rx_dspnsd_dt   = s.rx_dspnsd_dt 
     AND s.sU = h.SU 
     WHERE s.RN     = 1'); 

    LOOP 

      FETCH CLREF INTO REC; 
      EXIT WHEN CLREF%NOTFOUND; --CLREF%COUNT 

       IF REC.REC_STAT = 'NEW' 
      THEN 


      UNIQUE_RECORDS:='"'|| REC.A || '"'||REC.B || '"|"' || REC.C || '"|' || substr(REC.D) || '|' || REC.E || '"'; 
      UTL_FILE.PUT_LINE (UNQIUE_REC_FILE,UNIQUE_RECORDS); 

     ELSIF REC.REC_STAT = 'DUPL' -- DUPLICATE 
      THEN 

        DE_DUP_FILE := UTL_FILE.FOPEN (OUT_DE_DUP_DIR, DUP_FILE_NAME, 'W');        

        DUP_RECORDS :='"'|| REC.A || '"'||REC.B || '"|"' || REC.C || '"|' || substr(REC.D) || '|' || REC.E || '"'; 

        UTL_FILE.PUT_LINE (DE_DUP_FILE, DUP_RECORDS); 

     END IF; 

    END LOOP; 

    UTL_FILE.FCLOSE (UNQIUE_REC_FILE); 
     UTL_FILE.FCLOSE (DE_DUP_FILE); 
END; 
+0

ファイルをループ内で開きます。多分これは問題です! – DirkNM

+0

エラーは 'UNQIUE_REC_FILE:= UTL_FILE.FOPEN(OUT_DIR、OUTPT_FILE、 'W');'という31行目です。なぜあなたはそれが後で失敗すると思いますか?実際のコードの31行目は何ですか?なぜ、ループ内で重複ファイルを開くのですか?それが失敗した場合、最初のDUPLかそれとも2番目のファイルですか?実際に何が起きているかを確認するには、デバッグを行う必要があります。 –

+0

@DirkNMループ外のファイルを開くと同じエラーが発生しているとします。 – user1363308

答えて

1

いくつかのポインタです。

  • 変数OUTPT_FILEおよびDUP_FILE_NAMEは宣言されていません。理想的には はコンパイルエラーを表示します。変数を宣言した場合は、変数DUP_FILE_NAMEの値を確認してください。それが空として渡されている場合は、問題を引き起こす可能性があります。
  • ループ内でDE_DUP_FILEを開いています。複数回開こうとすると、おそらく が原因の可能性があります。
  • 変数OUT_DE_DUP_DIRはコードのどこでも使用されていません。

改訂コードを参考にして、いくつかのコメントがあります。

  • DUP_FILE_NAMEを入力パラメータとして渡すので、 はこのパラメータに渡す値を知りたいと思っています。実際には、 は、すべてのパラメータについて の詳細を使用して、この手順を呼び出すためのスクリプト全体を共有できます。
  • DE_DUP_DUPLICATES_NAMEディレクトリが存在するかどうかを確認できますか。あなたは user_directoriesデータ辞書ビューでそれをチェックすることができます。
  • 一意のファイルが作成されているので、 DE_DUP_FILEをOUT_DE_DUP_DIRではなくOUT_DIRに変更してみてください。これにより、 ディレクトリにOUT_DE_DUP_DIRの ディレクトリに問題があるかどうかがわかります。
  • まだループ内のファイルを開いています。ループの外側に を開こうとするとよいでしょうか。
+0

申し訳ありませんがこれは私が多くの情報を共有していないコードを変更します、更新コードを参照してください。 – user1363308

関連する問題