
OracleのPL/SQLで
FOR .. LOOP内にて動的SQLを使い
SELECTしてきた値を順次FETCHして配列に格納していきたいのですが、
LOOPの1件目のみFETCHがされて2件目以降は全てNULLになってしまいます。SQL文は間違っていません。DBMS_SQL.LAST_ROW_COUNTで1件以上の検索結果があることも確認済みです。
なぜでしょう?教えて下さい!
EXECUTE IMMEDIATEをLOOP内で使うことに問題あり?
簡略化した例です。p_noにはすでに文字列格納済みと見てください。
txtsql VARCHAR2(1000); -- 動的SQL
mkin INTEGER;
fornum1 INTEGER;
max_count INTEGER; -- ループされる最大件数
TYPE type_mkin IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER;
TYPE type_pno IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER;
mkin type_mkin;
p_no type_pno;
BEGIN
FOR fornum1 IN 1 .. max_count LOOP
txtsql := 'SELECT SUM(TPSV_NO) '
|| ' FROM ACTV
|| ' WHERE PRI_NO= '
|| p_no(fornum1);
EXECUTE IMMEDIATE txtsql INTO mkin(fornum1);
DBMS_OUTPUT.PUT_LINE(mkin(fornum1));
END LOOP;
END;
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
とりあえず、明らかにダメな(変な?)ところは・・
>txtsql := 'SELECT SUM(TPSV_NO) '
>|| ' FROM ACTV
>|| ' WHERE PRI_NO= '
>|| p_no(fornum1);
の部分で、できあがるSQLテキストが、文字列を'で囲ってないことでしょうか。
txtsql := 'SELECT SUM(TPSV_NO) '
|| ' FROM ACTV
|| ' WHERE PRI_NO= '
|| ''' || p_no(fornum1) || ''';
とする必要があると思います。(p_noの定義属性からの想像ですが)
なお、execute immediate自体は、loopの中でも問題はありません。
効率云々の点では問題はあると思いますけどね。
No.1
- 回答日時:
PL/SQLのデバッグとしてよく使う手ですが、WORKのファイルを用意して作成したSQLをファイルにINSERTしてみてはどうですか?
問題の切り分けにつながるとおもいますけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カーソル定義での条件分岐
-
PL/SQLでのSQL文法
-
【PL/SQL】LOOPした動的SQLにて...
-
Statement ignored というエラー
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
sqlplusでヘッダーが付かない
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
callで順に実行されるプロシー...
-
sqlplusのspoolで空白行出現
-
SQLの結果に納得できません。ど...
-
ROW_NUMBER()を使用したデータ取得
-
ストアドプロシジャからストア...
-
DB2のSELECTでカンマ編集につい...
-
SQLserver算術オーバーフロ...
-
PL/SQL exceptionを呼び出すには?
-
Accessで年月日のデータ...
-
SQLで部分的にGROUP BYしたいとき
-
ODBCリンクの際にACCESSでは読...
-
日付型なら変数の先頭になん...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
カーソル定義での条件分岐
-
自動連番でカラムを更新したい
-
Texの枠囲み調節
-
PL/SQLのOPEN cursor_name FOR...
-
ORA-00904:無効な識別子の回避...
-
カーソルループ内部でログを出力
-
PL/SQL カーソルのFROM句にカー...
-
【PL/SQL】LOOPした動的SQLにて...
-
カーソルで集合関数を使った場...
-
ROW_NUMBER BY PL/SQL
-
【PL/SQL】CURSOR ・・・ IS SE...
-
mysqlのcase文で複数の条件を指...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
キャッシュを使わずにSELECTを...
-
callで順に実行されるプロシー...
-
ODBCリンクの際にACCESSでは読...
おすすめ情報