【发布时间】:2009-01-16 17:33:22
【问题描述】:
我有一个返回两列和多行的 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'))
但这仍然不起作用。
【问题讨论】:
-
感谢您的清理和补充信息。
-
问题:iYear 和 sSess 是程序的输入吗?问题:sess_sort() 过程是做什么的?您似乎想要两行数据?我怀疑它可以简化为一个单一的查询,需要一些小心 - 不需要任何中间临时表。
-
观察:我很确定临时表是为什么不能在 SQL 语句中使用 curr_sess() 过程的原因 - 额外的表会混淆处理。
-
反问:实际上,双 RETURN 只是一个错字,不是吗?因为它会返回两次相同的值,然后遍历循环并返回接下来的两行两次。还是您有其他处理方式?
标签: sql stored-procedures informix temp-tables