2

2 つの列と複数の行を返す Informix ストアド プロシージャがあります。「EXECUTE FUNCTION curr_sess(2009,'SP')」は問題なく使用できますが、結果を一時テーブルに取得するにはどうすればよいですか。

編集: バージョン 10.00.HC5 を使用しています


Jonathan Leffler のアイデアをテストしてもうまくいきませんでした。

EXECUTE FUNCTION curr_sess(2009,'SP')

正常に動作します。それから私はやった

CREATE TEMP TABLE t12(yr smallint, sess char(4));

でもやってみると

INSERT INTO t12 EXECUTE FUNCTION curr_sess(2009,'SP');

うまくいきません。「SPL ルーチンの不正な SQL ステートメント」というメッセージが表示されます。エラー。


curr_sess のソース

begin procedure

DEFINE _yr smallint;
DEFINE _sess char(4);

SELECT
    DISTINCT
    sess_vw.yr,
    sess_vw.sess,
    sess_vw.sess_sort
FROM
    sess_vw
ORDER BY
    sess_vw.sess_sort DESC
INTO temp tmp_sess WITH NO LOG;

SELECT
    FIRST 1
    tmp_sess.yr,
    tmp_sess.sess
FROM
    tmp_sess
WHERE
    tmp_sess.sess_sort = sess_sort(iYear,sSess)
INTO temp tmp_final WITH NO LOG;

FOREACH cursor1 FOR
    SELECT
        tmp_final.yr,
        tmp_final.sess
    INTO
        _yr,
        _sess
    FROM
         tmp_final
    RETURN _yr, _sess WITH RESUME;
END FOREACH;

DROP TABLE tmp_sess;
DROP TABLE tmp_final;

end procedure

編集: sess_sort() はルックアップを行います。

関数を 1 つのクエリとして書き直そうとしました。ここに next_sess があります:

SELECT
    FIRST 1
    sess_vw.sess_sort
FROM
    sess_vw
WHERE
    sess_vw.sess_sort > sess_sort(2009,'SP')
ORDER BY
    sess_vw.sess_sort ASC

IBM の誰かが私に電子メールを送り、次のようなものを使用することを提案しました。

SELECT
    *
FROM
    TABLE(next_sess(2009,'SP'))

しかし、それでもうまくいきませんでした。

4

2 に答える 2

4

1 つの可能性は、ストアド プロシージャです。別のもの (IDS 11.50.FC1 でテスト済み) は、動作するかどうかわかりませんでしたが、次のとおりです。

CREATE PROCEDURE r12() RETURNING INT, INT;
   RETURN 1, 2 WITH RESUME;
   RETURN 2, 3 WITH RESUME;
END PROCEDURE;

CREATE TEMP TABLE t12(c1 INT, c2 INT);

INSERT INTO t12 EXECUTE PROCEDURE r12();

最後の行が重要です。


上記のようにストアド プロシージャを実行できないことがわかった場合 (許可されていない SQL ステートメントが含まれているため)、別の方法でストアド プロシージャを使用する必要があります。嬉しい驚きでした):

CREATE TEMP TABLE t12(yr smallint, sess char(4));

CREATE PROCEDURE curr_sess(yearnum SMALLINT, sesscode CHAR(2))
    RETURNING SMALLINT AS yr, CHAR(4) AS sess;
    RETURN yearnum, (sesscode || 'AD') WITH RESUME;
    RETURN yearnum, (sesscode || 'BC') WITH RESUME;
END PROCEDURE;

CREATE PROCEDURE r12(yearnum SMALLINT, sesscode CHAR(2))
    DEFINE yr SMALLINT;
    DEFINE sess CHAR(4);
    FOREACH EXECUTE PROCEDURE curr_sess(yearnum, sesscode) INTO yr, sess
    INSERT INTO t12 VALUES(yr, sess);
    END FOREACH;
END PROCEDURE;

EXECUTE PROCEDURE r12(2009,'SP');

SELECT * from t12;

一時テーブルの作成をストアド プロシージャに組み込むことができます。一時テーブルと同じ名前の既存のテーブルを削除するように手配することもできます (例外処理を使用します)。IDS 10.00 を使用している場合、一時テーブルの名前が固定されています。11.50 で動的 SQL 機能を使用して実行時に一時テーブルに名前を付けることは (私には) 推奨されていませんが、可能です。

一時テーブルにアクセスするストアド プロシージャは、再利用時に再最適化されることに注意してください。使用されるテーブルは前回と同じではないため (一時テーブルであるため)、クエリ プランはそれほど役に立ちません。

于 2009-01-17T03:59:40.780 に答える
0

おそらく、このコンテキストで使用されるプロシージャで「テーブルのドロップ」が有効なステートメントではないため、それは失敗しますか? http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.sqls.doc/ids_sqs_1755.htm#ids_sqs_1755

于 2009-01-28T10:36:19.553 に答える