2016-06-06 1 views
0

PLSQL을 처음 사용합니다. 배열을 반복하는 프로 시저를 만들려고합니다.PLSQL : 루프를 사용하는 동안 저장된 프로 시저에 IF가있는 경우

나의 요구 사항은 테이블에 값 중 하나가 없으면 FAILARRAY에 추가해야하며, 그렇지 않으면 PASSARRAY에 추가해야합니다.

처리 된 데이터도 예외가 발견되지 않고 루프에서 벗어나 루프의 다음 값이 다시 반복되지 않습니다.

여기에 명령이 존재하는 경우 사용할 수있는 방법이 있습니까? 도와주세요.

CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE 
(
FILEARRAY IN STRARRAY, 
PASSARRAY OUT STRARRAY, 
FAILARRAY OUT STRARRAY, 
) 
IS 
--DECLARE 
fileName VARCHAR2 (50); 
fileId NUMBER; 

BEGIN 
    for i in 1 .. FILEARRAY.count 
     loop 
     fileName := FILEARRAY(i); 
     DBMS_OUTPUT.put_line (FILEARRAY (i)); 
     SELECT FILEID into fileId FROM TABLE_NAME WHERE FILENAME=fileName; 
     end loop 
END; 
+0

'FILEARRAY.exists (i) then'' ... end if;'를 사용할 수 있습니까? 이 방법에 대한 Oracle 설명서는 [여기] (http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#CJAEFFID)입니다. –

+0

사실 파일 배열에 값이 있는지 확인하고 싶지 않습니다. 데이터베이스 테이블에 항목이 있는지 확인해야합니다. 일반적인 경우에는 예외 데이터 처리를 사용하여 처리했습니다. 하지만 제 경우에는 배열에 8 개의 값이 있습니다. 그리고 세 번째 값에 대해서는 테이블에 데이터가 없습니다. 그것은 예외 블록에 올 것이다. 이제는 4 번째에서 8 번째 값을 반복 할 수 없을 것입니다. – Karthik

답변

1

예외를 처리하고 있지만 예외를 피할 필요가 있습니다. 시도 :

SELECT NVL(FILEID, "<Put Something here or leave it empty") FROM TABLE_NAME WHERE FILENAME=fileName; 

그런 식으로 선택 항목에 null 값이 있으면 대신 ""이 표시됩니다. 그런 다음 SELECT가 ""를 반환하는지 확인하고 FAILARRAY를 채우면 그렇지 않으면 PASSARRAY를 채 웁니다.

+0

고마워요. 내가 이것을 확인하고 작동하면 업데이트됩니다. – Karthik

1
CREATE OR REPLACE PROCEDURE SCHEMA.PR_VALIDATE(
    FILEARRAY IN STRARRAY, 
    PASSARRAY OUT STRARRAY, 
    FAILARRAY OUT STRARRAY) 
IS 
    fileName VARCHAR2 (50); 
    l_n_count NUMBER; 
    l_n_file_id NUMBER; 
BEGIN 
    FOR i IN 1 .. FILEARRAY.count 
    LOOP 
    fileName := FILEARRAY(i); 
    DBMS_OUTPUT.put_line (FILEARRAY(i)); 
    SELECT COUNT(FILEID) INTO l_n_count FROM TABLE_NAME WHERE FILENAME=fileName; 
    IF l_n_count =0 THEN 
     failarray(i):='No Value Found'; 
    elsif l_n_count=1 THEN 
     SELECT FILEID INTO l_n_file_id FROM TABLE_NAME WHERE FILENAME=fileName; 
     Passarray(i):=l_n_file_id; 
    END IF; 
    END LOOP; 
END; 
/
+0

예,이 생각하지만, 같은 쿼리를 다시 실행해야 할 것처럼 보일 것입니다. 한 번 확인하고 한 번 값을 확인합니다. 권리? – Karthik

+0

이것이 필요한 경우 :) –

1

난 당신이 루프 내에서 예외 처리기를 포함하여 PL/SQL BEGIN ... END 블록을 가질 수 있음을 실현하지 않은 생각한다. 실제로 PL/SQL 문을 사용할 수있는 모든 곳에서 블록을 만들 수 있습니다.

코드에 예외 처리기가 포함되어 있지만 예외 처리기를 언급합니다. 코드가 '루프에서 빠져 나온다'는 말처럼, 나는 단지 for 루프 외부에 있다고 가정 할 수 있습니다. 그러나 용이 for 루프 내부에, 예를 들면, 예외 핸들러와 블록을 추가 할 수

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

     -- Inner block starts at the line below: 
     BEGIN 
      SELECT FILEID into fileId FROM TABLE_NAME WHERE FILENAME=fileName; 
      -- TODO add to PASSARRAY 
     EXCEPTION 
      WHEN NO_DATA_FOUND THEN 
       -- TODO add to FAILARRAY 
     END; 

    end loop 
END; 

이쪽 거기 FILEARRAY 8 개 값이며, 데이터가 제 3 값에 대한 테이블에서 발견되지 않으면 루프를 종료하지 않고 NO_DATA_FOUND 예외가 catch되면 루프가 FILEARRAY의 네 번째 값으로 진행됩니다.

관련 문제