- 締切済み
【PL/SQL】LOOPした動的SQLにてFETCHができない
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;
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
とりあえず、明らかにダメな(変な?)ところは・・ >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の中でも問題はありません。 効率云々の点では問題はあると思いますけどね。
- 7colors
- ベストアンサー率25% (29/114)
PL/SQLのデバッグとしてよく使う手ですが、WORKのファイルを用意して作成したSQLをファイルにINSERTしてみてはどうですか? 問題の切り分けにつながるとおもいますけど。