我尝试创建一个简单的存储过程,它应该作为 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 语句所需的临时表
我尝试创建一个简单的存储过程,它应该作为 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 语句所需的临时表
该错误a subquery returned not exactly one row
是因为您的查询返回一个集合,而不是单行,链接问题中的答案假定为。
尽管问题的主旨与您的问题无关,但乔纳森在此问题中给出的非常好的答案显示了可以满足您要求的存储过程的结构。
基本上,您定义ROW TYPE
与您的emp_num
和emp_name
列相对应的 a,然后将您的结果返回MULTISET
为该类型的 a。
但我必须说实话,我看不出有什么理由让 SP 这样做。沿着VIEW
线:
CREATE VIEW active_emp (emp_num, emp_data)
AS SELECT emp_num, emp_name
FROM emp_data
WHERE active_code = 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。