0

次の SQL を実行すると、SELECT INTO 行でエラー ORA-06550 が発生します。

DECLARE 
  new_type INTEGER;
  cur_idCardProfileId DECIMAL;

  CURSOR IDCardProfileCursor
   IS
    SELECT idcardprofileid FROM idcard;    
BEGIN
  FOR cur_idCardProfileId IN IDCardProfileCursor
  LOOP
    SELECT cardtype INTO new_type FROM idcardprofile WHERE idcardprofileid = cur_idCardProfileId;
  END LOOP;        
END;

idcardprofileid (テーブル 'idcard') と idcardprofileid (テーブル 'idcardprofile') は両方ともタイプ DECIMAL です。

もう手がかりがありません... よろしくお願いします。

4

2 に答える 2

3

カーソル行を間違って参照しています。これは、同じ名前で宣言した値よりcur_idCardProfileIdも優先されます。DECIMALここではまったく使用されません。

カーソルから値を参照するときは、列名と行変数名を使用する必要があります。あいまいさを避けるために、短い名前curとテーブル エイリアスを使用すると、次のことができます。

DECLARE 
  new_type INTEGER;

  CURSOR IDCardProfileCursor
   IS
    SELECT idcardprofileid FROM idcard;    
BEGIN
  FOR cur IN IDCardProfileCursor
  LOOP
    SELECT cardtype INTO new_type
    FROM idcardprofile i
    WHERE i.idcardprofileid = cur.idcardprofileid;
  END LOOP;        
END;
/

もちろん、通常、このようなループ内で select を実行することはありません。カーソルを 2 つのテーブルに結合する方が効率的です。

于 2014-06-25T14:45:35.613 に答える
1

ORA-06550 は、構文が正しくない場合に発生するコンパイル エラーです。通常、行番号とエラーの理由がメッセージに記載されています。

あなたの質問に来ます:

匿名ブロックにいくつかの構文エラーがあります。

a.) cur_idCardProfileId を宣言する必要はありません。b.) カーソル セットによって返された列を参照するときは、<loop_variable>.column_name表記法を使用するSelect Into必要 があります。cur_idCardProfileId.idcardprofileid

ブロックに変更を加えました。変更されたブロックを以下に示します。

     DECLARE 
      new_type INTEGER;
    --  cur_idCardProfileId DECIMAL;

     CURSOR IDCardProfileCursor
     IS
     SELECT idcardprofileid FROM idcard;    
      BEGIN
        FOR cur_idCardProfileId IN IDCardProfileCursor
        LOOP
          SELECT cardtype 
          INTO new_type 
          FROM idcardprofile 
          WHERE idcardprofileid = cur_idCardProfileId.idcardprofileid; --Replaced   cur_idCardProfileId with cur_idCardProfileId.idcardprofileid
    END LOOP;        
    END;

それが役に立てば幸い

ヴィシャド

于 2014-06-25T14:44:44.603 に答える