sql错误(-659)进入select语句所需的临时表

时间:2013-10-27 10:16:20

标签: sql stored-procedures informix

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

2 个答案:

答案 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 TYPEemp_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中添加它们。