2016-06-07 7 views
-1

배열에 요소를 추가하려고 할 때 초기화되지 않은 컬렉션 예외에 대한 참조를 얻고 있습니다. 제 전화 코드에서 언급 한대로 어레이를 초기화하는 올바른 방법입니까?배열 PLSQL을 사용하여 초기화되지 않은 컬렉션 예외에 대한 참조

CREATE OR REPLACE TYPE SCHEMA.STRARRAY AS TABLE OF VARCHAR2 (255); 

CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE 
(
FILEARRAY IN STRARRAY, 
DUPARRAY OUT STRARRAY) 
IS 
dupCount NUMBER; 
fileName VARCHAR2 (50); 
fileId NUMBER; 
dupfileName VARCHAR2(50); 
BEGIN 
for i in 1 .. FILEARRAY.count 
    loop 
    fileName := FILEARRAY(i); 


    SELECT COUNT (T.FILEID), T.FILEID INTO dupCount,fileId FROM TB_COMPANY T, TB_COMPANY S 
    WHERE T.FILEID=S.FILEID 
    AND T.RPDT_ORI_FLE_NM = fileName AND T.RPDT_STA_CD IN ('PASS', 'FAIL') 
    GROUP BY T.FILEID; 


    IF dupCount>1 
    THEN 
    SELECT RPDT_ORI_FLE_NM INTO dupfileName FROM TB_RDTE_COMPANY_HDR_DT 
    WHERE RPDT_STA_CD IN ('PR15','PR16') AND RPDT_FLE_ID=fileId 
    AND RPDT_ORI_FLE_NM != fileName; 
    DBMS_OUTPUT.PUT_LINE(dupfileName); 
    DUPARRAY(DUPARRAY.LAST +1) :=dupfileName; --Here is the exception. 
    END IF; 
    end loop; 
EXCEPTION 
WHEN OTHERS THEN 
     PR_RDTE_ERRORS('PR_VALIDATE', SQLERRM); 
     ROLLBACK; 

END; 
/

전화 번호 :

DECLARE 
DUPARRAY STRARRAY:=STRARRAY(); 


BEGIN 
PR_VALIDATE  (STRARRAY('abc.txt'),DUPARRAY); 
END; 

답변

2

DUPARRAY.LAST 배열의 마지막 요소의 인덱스 (어레이의 마지막 비 NULL 값하지 인덱스)를 얻을 것이다 - 그렇다면 DUPARRAY.LAST + 1을 사용하면 항상 배열 범위를 초과합니다.

또한 배열을 확장하지 않았으므로 추가 요소를 추가해야합니다.

그래서 이런 식으로 뭔가 :

CREATE OR REPLACE PROCEDURE PR_VALIDATE 
(
    FILEARRAY IN STRARRAY, 
    DUPARRAY OUT STRARRAY 
) 
IS 
dupCount NUMBER; 
fileName VARCHAR2 (50); 
dupfileName VARCHAR2(50); 
fileId NUMBER; 
BEGIN 
    DUPARRAY := STRARRAY(); 

    for i in 1 .. FILEARRAY.count loop 
    fileName := FILEARRAY(i); 

    SELECT COUNT (T.FILEID), T.FILEID 
    INTO dupCount,fileId 
    FROM TB_COMPANY T 
      INNER JOIN TB_COMPANY S 
      ON T.FILEID=S.FILEID 
    WHERE T.RPDT_ORI_FLE_NM = fileName 
    AND T.RPDT_STA_CD IN ('PASS', 'FAIL') 
    GROUP BY T.FILEID; 

    IF dupCount>1 THEN 
     SELECT RPDT_ORI_FLE_NM 
     INTO dupfileName 
     FROM TB_RDTE_COMPANY_HDR_DT 
     WHERE RPDT_STA_CD IN ('PR15','PR16') 
     AND RPDT_FLE_ID=fileId 
     AND RPDT_ORI_FLE_NM != fileName; 

     DBMS_OUTPUT.PUT_LINE(dupfileName); 

     DUPARRAY.EXTEND; 
     DUPARRAY(DUPARRAY.LAST) :=dupfileName; 
    END IF; 
    end loop; 
END; 
/
을 또한 (호출 코드 대신에) 절차 안에 DUPARRRY를 초기화 할 필요가

DUPARRAY.EXTEND; 
DUPARRAY(DUPARRAY.LAST) :=dupfileName; 

을 :

당신은 할 필요가

전화 번호 :

DECLARE 
    DUPARRAY STRARRAY; 
BEGIN 
    PR_VALIDATE(STRARRAY('abc.txt'),DUPARRAY); 
END; 
/
+0

감사합니다. 확장 및 DUPARRAY.LAST를 추가 한 후에도 동일한 예외가 발생합니다. :(내 전화 코드에서 뭔가 잘못 되었나요? – Karthik

+0

@ Karthik 절차의 4 번째 줄에 여분의 쉼표가 있습니다. – MT0

+0

예 ... 실수를 복사하고 있습니다 ... 쉼표는 지금 내 절차에 없습니다 ... 편집 없음 errors..only 런타임 오류 .. 내 질문을 편집 할 것입니다 .. 그 점에 대해 감사합니다.하지만 어떻게 든 그 오류를 해결할 수 없습니다. – Karthik

관련 문제