あなたにとってのゴールデンタイムはいつですか?

下記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;

A 回答 (2件)

タイプミスがありました。


一行目のVARですが・・
VAR WCOUNT NUMEBR => VAR WCOUNT NUMBER

SQL*PLUS上なら、特別な作業を必要とせずに、バインド変数は使えるはずです。
    • good
    • 0

投稿された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;
/
--ここまで

カーソルループの中で、コミットしてるのは、気になったのですが、そのままにしています。
また、スクリプトファイル中での空行は気をつけた方がいいですよ。

この回答への補足

返信ありがとうございます
早速訂正し、SQLplus上にて実行したところ

SP2-0552: バインド変数”WCOUNT”が宣言されていません。

のエラーがでてしまいました
バインド変数を利用するのに何か設定がいるのでしょうか

補足日時:2009/12/30 15:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報