アプリ版:「スタンプのみでお礼する」機能のリリースについて

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件)

とりあえず、明らかにダメな(変な?)ところは・・



>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の中でも問題はありません。
効率云々の点では問題はあると思いますけどね。
    • good
    • 0

PL/SQLのデバッグとしてよく使う手ですが、WORKのファイルを用意して作成したSQLをファイルにINSERTしてみてはどうですか?


問題の切り分けにつながるとおもいますけど。
    • good
    • 0

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