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

Posted

技术标签:

【中文标题】sql 错误 (-659) 进入 select 语句所需的临时表【英文标题】:sql error (-659) into temp table required for select statement 【发布时间】:2013-10-27 10:16:20 【问题描述】:

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

【问题讨论】:

这个问题是关于 mysql 服务器的吗? DBMS 的女巫版本? Why does this SQL stored procedure require that a temp table be created for it to work (return results)?的可能重复 @juergend :我尝试按照该问题的回答,但我收到此错误:a subquery returned not eaxctly one row 我已经很久没有使用 Informix 了,但是认为要返回多行,您必须实际查看多个返回。见dbaspot.com/informix/… 只是我不想使用循环! 【参考方案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_numemp_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;

似乎更合乎逻辑和实用。

【讨论】:

【参考方案2】:

查看手册中的“return with resume”,他们会变魔术......

示例 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。

【讨论】:

以上是关于sql 错误 (-659) 进入 select 语句所需的临时表的主要内容,如果未能解决你的问题,请参考以下文章

Day659.Stream API -Java业务开发常见错误

SQL注入测试平台 SQLol -2.SELECT注入测试

SQL学习之组合查询(UNION)

优化sql嵌套查询,使用CTE语法

MySQL的select语句

SQL语句的效率问题