여기에 제가 작성한 스크립트가 있으며 EXCEPTION 블록에 이상한 구문 오류가 있습니다. 예외 블록을 제거하면 스크립트가 제대로 컴파일됩니다. 하지만 곧 내가 그것을 다시는일부 구문 오류 - 찾을 수 없습니다.
LOOP
BEGIN
SAVEPOINT check_point;
EXIT WHEN DBMS_SQL.FETCH_ROWS (cursor_handle) = 0;
DBMS_SQL.COLUMN_VALUE (cursor_handle, 1, cc , col_err, actual_len);
DBMS_SQL.COLUMN_VALUE (cursor_handle, 2, di, col_err, actual_len);
IF INSTR (cc, '_') <> 0 THEN
cc := Trim (cc);
cc := Upper(cc);
cc := substr(cc,4,2);
EXECUTE IMMEDIATE 'UPDATE ' || dest || ' SET cc = :v1 WHERE di = :v2'
USING cc, di;
if SQL%ROWCOUNT > 0 THEN
inserts := inserts + 1;
counter := counter + 1;
IF counter > 500 THEN
counter := 0;
COMMIT;
END IF;
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dups := dups+1;
ROLLBACK TO check_point;
WHEN VALUE_ERROR THEN
valerr := valerr +1;
ROLLBACK TO check_point;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('errno: ' || TO_CHAR(SQLCODE) || ' Msg: ' || SQLERRM);
otherexc := otherexc +1;
IF otherexc > 50 THEN
EXIT;
END IF;
ROLLBACK TO check_point;
END IF;
END;
END LOOP;
내가 질문 등의 종류를 물어은 매우 성가신 알고있는 스크립트를 여기에 나에게 오류
Error(58,11): PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following: (begin case declare else elsif end exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
을 제공입니다 쓸하지만 난 오류가 무엇인지 알아낼 수 없습니까 그. 나는 Pl/SQL에서 lehman입니다.
그래, 알아 냈어. 예외 블록은 루프의 마지막 블록이어야합니다. 이 ** IF INSTR ** statment 및 EXCEPTION 블록이 해당 IF 문에 있습니다. 그래서 나는 예외 블록의 시작 바로 전에 IF 문을 끝내었고 오류는 사라졌습니다. 누군가이 개념을 설명하는 데 마음을 댈 수 있습니까? –
'EXCEPTION'은 블록의 마지막 부분이어야하지만'EXECUTE IMMEDIATE'에만 적용하고자한다면'BEGIN' /'END' 블록 안의'*'안에' IF INSTR ... END IF' 부분. 그것은 아마 당신이 원하는 것이 아닙니다. –
감사합니다. 어떻게 대답 할 수 있을까요? 대답 : –