1

我尝试创建一个简单的存储过程,它应该作为 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 语句所需的临时表

4

2 回答 2

1

该错误a subquery returned not exactly one row是因为您的查询返回一个集合,而不是单行,链接问题中的答案假定为

尽管问题的主旨与您的问题无关,但乔纳森在此问题中给出的非常好的答案显示了可以满足您要求的存储过程的结构。

基本上,您定义ROW TYPE与您的emp_numemp_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;

似乎更合乎逻辑和实用。

于 2013-10-28T08:19:30.557 回答
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。

于 2013-10-28T22:41:03.400 回答