我有一个返回两列和多行的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()进行查找。
我试图将该函数重写为一个查询。这是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'))
但那仍然无效。
答案 0 :(得分:4)
一种可能性是存储过程。另一个(在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工具在运行时命名临时表,但这是可能的。
请注意,访问临时表的存储过程在重用时会被重新优化 - 使用的表与上次不同(因为它是临时表),因此查询计划没有那么多帮助。 / p>
答案 1 :(得分:0)
这可能是因为'drop table'在此上下文中使用的过程中不是有效语句? http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.sqls.doc/ids_sqs_1755.htm#ids_sqs_1755