【问题标题】:sql error (-659) into temp table required for select statementsql 错误 (-659) 进入 select 语句所需的临时表
【发布时间】: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 语句所需的临时表

【问题讨论】:

标签: sql stored-procedures 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。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2019-12-10
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多