我尝试创建一个简单的存储过程,它应该返回一个数据集作为select语句的结果。像这样:
CREATE PROCEDURE rr_reward()
SELECT a.emp_num,a.emp_name
FROM emp_data a
WHERE a.active_code = 1
END PROCEDURE
但是我收到以下错误:
sql错误(-659)进入select语句所需的临时表
答案 0 :(得分:1)
错误a subquery returned not exactly one row
是因为您的查询返回了一个集合,而不是单行,the answer in the linked question assumes。
虽然问题的主旨与您的问题无关,但the very fine answer given by Jonathan in this question显示了可以满足您需求的存储过程的结构。
基本上,您定义与ROW TYPE
和emp_num
列对应的emp_name
,然后将结果作为该类型的MULTISET
返回。
但我必须诚实,我看不出SP有什么理由可以做到这一点。一行VIEW
:
CREATE VIEW active_emp (emp_num, emp_data)
AS SELECT emp_num, emp_name
FROM emp_data
WHERE active_code = 1;
似乎更符合逻辑和实用。
答案 1 :(得分:1)
查看手册“返回简历”,他们做了神奇......
实施例1)
哪个更简单...
CREATE FUNCTION teste_p2( pParam CHAR(100) DEFAULT '%') RETURNING CHAR(20) AS tabname
DEFINE vSql CHAR(500);
DEFINE vTab CHAR(20);
FOREACH select tabname into vTab
from systables where tabname like pParam
RETURN vTab WITH RESUME;
END FOREACH;
END FUNCTION;
实施例2)
更复杂
CREATE FUNCTION teste_p1( pParam CHAR(100) DEFAULT '%')
RETURNING CHAR(20) AS tabname
DEFINE vSql CHAR(500);
DEFINE vTab CHAR(20);
LET vSql='select tabname from systables where tabname like ? ';
LET vTab='';
PREPARE sts1 FROM vSql;
DECLARE cur1 CURSOR FOR sts1;
OPEN cur1 USING pParam;
LOOP
FETCH cur1 INTO vTab ;
IF SQLCODE = 100 THEN exit; END IF;
RETURN vTab WITH RESUME;
END LOOP;
CLOSE cur1;
FREE cur1;
FREE sts1;
END FUNCTION
然后你这样打电话:
select * from table(teste_p2('systab%')) as t(column);
如果您需要返回更多字段...只需在RETURNING声明和RETURN WITH RESUME中添加它们。