2012-01-03 13 views
1

クエリPL/SQLのコンパイル・エラー更新

DECLARE 
    v_vendor_id NUMBER; 
BEGIN 
    FOR vp_rec IN (SELECT * FROM vpprocess) 
    LOOP 
     SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid; 
     EXCEPTION 
      WHEN no_data_found THEN SELECT 0 INTO v_vendor_id FROM dual; 
     UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid; 
    END; 
    END LOOP; 
END; 

エラーメッセージ

Error starting at line 1 in command: 
DECLARE 
    v_vendor_id NUMBER; 
BEGIN 
    FOR vp_rec IN (SELECT * FROM vpprocess) 
    LOOP 
     SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid; 
     EXCEPTION 
      WHEN no_data_found THEN SELECT 0 INTO v_vendor_id FROM dual; 
     UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid; 
    END; 
    END LOOP; 
END; 
Error report: 
ORA-06550: line 7, column 9: 
PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following: 

    begin case declare 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> << 
    close current delete fetch lock insert open rollback 
    savepoint set sql execute commit forall merge pipe 
ORA-06550: line 11, column 7: 
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: 

    ; 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

答えて

2

中にあなたのFORループの間違った構文を使用しています。エラーメッセージは、何が間違っているかを正確に伝えます。単語の代わりにBEGIN PUT LOOP

個人的なルールとして、特定のコードブロックにのみ例外をトラップする必要がある場合など、ごくわずかな例外を除いて、PL/SQLでBEGINを使用することはありません。そのコードは、または何でも。

OPの編集に基づいて編集:これはそのようなケースの1つと思われます。以下を試してください:

DECLARE 
    v_vendor_id NUMBER; 
BEGIN 
    FOR vp_rec IN (SELECT * FROM vpprocess) 
    LOOP 
    BEGIN 
     SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid; 
     EXCEPTION 
      WHEN no_data_found THEN v_vendor_id := 0; 
     END; 
     UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid; 
    /* END; has been removed */ 
    END LOOP; 
END; 
+0

Dan:私はLOOPを置き換えようとしましたが、それは助けになりませんでした。私はエラーと同様にクエリを更新しています。 –

+1

私の回答を更新しました。私はオラクルを私の目の前にはもはや持っていないので、これは推測です。しかし、基本的に 'EXCEPTION WHEN'はブロックスコープの機能なので、例外をトラップしたいステートメント(あなたの場合は単一のステートメント)の周りにインナーブロックを作成する必要があります。 – Dan

関連する問題