• 締切済み

PLSQLの識別子エラー

下記PLSQLを実行した時に(sqlplus上で、@XXXX.SQLと実行) WCOUNT :=WCOUNT + 1; エラー PLS-00201: 識別子WCOUNTを宣言してください のエラーがでます 宣言をしているのですがわからず、お助けください また、他にもこのエラーを処置したあとに問題と なりそうな箇所があれば指摘お願いします -やろうとしてること (1)テーブルA を、男子を出席順に読み込んでその読み込んだ順番に 1から番号をふり、テーブルBへ新規追加する (2)テーブルAからテーブルBに新規追加していない女子を、出席順に読み込んで 1から番号をふり、テーブルBへ新規追加する (3)テーブルBのKEYは順番のみ (4)テーブルBのINSERT分は、今後機能追加する予定なのでNOT IN使用する -組んだPL/SQL(2つのINSETを1つのファイルに記述しています) DECLARE WCOUNT number; CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA  ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (r.順番, r.名前,r.出席番号) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOO; / END; DECLARE CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA A WHERE A.出席番号 NOT IN (SELECT B.出席番号 FROM テーブルB B) ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (順番, 名前) VALUES (WCOUNT,r.名前); COMMIT; WCOUNT :=WCOUNT + 1; END LOOP; / END;

みんなの回答

回答No.2

タイプミスがありました。 一行目のVARですが・・ VAR WCOUNT NUMEBR => VAR WCOUNT NUMBER SQL*PLUS上なら、特別な作業を必要とせずに、バインド変数は使えるはずです。

回答No.1

投稿されたSQLは、明らかな転記ミスと思しき箇所があるので、 何が転記ミスで、何が本来の問題点なのか区別が付かないのですが・・ declare ~(a)~ begin ~(b)~ end; / declare ~(c)~ begin ~(d)~ end; / という一連のスクリプトの場合、(a)で定義した変数は、(b)で有効ですが、 別の無名ブロックである(d)では、利用できません。改めて(c)で定義する必要があります。 無名ブロック間で変数を共有する場合、declareで定義するPL/SQL変数ではなく、 バインド変数を使います。(SQL*PLUSのVARコマンド参照) --ここから VAR WCOUNT NUMEBR DECLARE CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (r.順番, r.名前,r.出席番号) VALUES (:WCOUNT,r.名前); COMMIT; :WCOUNT := :WCOUNT + 1; END LOOP; END; / DECLARE CURSOR カーソル IS SELECT 出席番号,名前,成績 FROM テーブルA A WHERE A.出席番号 NOT IN (SELECT B.出席番号 FROM テーブルB B) ORDER BY 出席番号; BEGIN FOR r IN カーソル LOOP INSERT INTO テーブルB (順番, 名前) VALUES (:WCOUNT,r.名前); COMMIT; :WCOUNT := :WCOUNT + 1; END LOOP; END; / --ここまで カーソルループの中で、コミットしてるのは、気になったのですが、そのままにしています。 また、スクリプトファイル中での空行は気をつけた方がいいですよ。

bancho_033
質問者

補足

返信ありがとうございます 早速訂正し、SQLplus上にて実行したところ SP2-0552: バインド変数”WCOUNT”が宣言されていません。 のエラーがでてしまいました バインド変数を利用するのに何か設定がいるのでしょうか