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で質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Access VBAで行ラベルが定義さ...
-
SQLサーバで和暦から西暦に変換...
-
エクセル 日付による並べ替え...
-
Accessのマクロでモジュールを...
-
エクセルVBAでUserFormを起動し...
-
Statement ignored というエラー
-
エクセルVBAが対応できるプログ...
-
bcp in でエラー
-
likeとsubstrの使いわけについて
-
Accessの数値から時間に変換す...
-
SSIS 変数の値をSQL実行タスク...
-
sqlplusでヘッダーが付かない
-
【Excel VBA】 WorksheetやRa...
-
全角空白のTRIMができない...
-
SQLで部分的にGROUP BYしたいとき
-
VBA プロシージャの名前の取得
-
ODBCリンクの際にACCESSでは読...
-
SPOOLのファイル名
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
PL/SQLのOPEN cursor_name FOR...
-
自動連番でカラムを更新したい
-
ORA-00904:無効な識別子の回避...
-
PL/SQL カーソルのFROM句にカー...
-
mysqlのcase文で複数の条件を指...
-
PL/SQLにて、マスタから取得し...
-
カーソルループ内部でログを出力
-
[Oracle9i]PL/SQLでFETCHしても...
-
PL/SQLでの参照
-
PL/SQLプログラムの書き方がわ...
-
【PL/SQL】CURSOR ・・・ IS SE...
-
【PL/SQL】LOOPした動的SQLにて...
-
カーソルフェッチにて、最終レ...
-
アルゴリズムの実装方法
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
おすすめ情報