2016-05-18 5 views
1

У меня есть хранимая процедура, где я пытаюсь записать записи в файлы и умею записывать в файлы, но проблема в том, что мое состояние похоже на это ELSIF REC.REC_STAT = «DUPL», то хранимая процедура не может там написать и получить ошибку ниже, с другой стороны. В этом случае IF 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

Ошибка говорит строка 31, которая является 'UNQIUE_REC_FILE: = UTL_FILE.FOPEN (OUT_DIR, OUTPT_FILE, 'W');'. Почему вы думаете, что это не удается позже - что такое строка 31 в вашем реальном коде? И почему вы открываете дублирующийся файл внутри цикла - если он сработает, то это на первом DUPL или втором? Вам нужно выполнить некоторую отладку, чтобы проверить, что на самом деле происходит. –

+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_DIR вместо OUT_DE_DUP_DIR. Это может помочь понять, есть ли проблема с каталогом OUT_DE_DUP_DIR .
  • Вы все еще открываете файл в цикле. Можете ли вы попробовать открыть его вне цикла.
+0

Извините, это код изменения. Я не сообщал много информации, см. Код обновления. – user1363308