2013-10-27 65 views
1

我嘗試創建一個簡單的存儲過程,它應該返回一個數據集作爲select語句的結果。像這樣:SQL錯誤(-659)到選擇語句所需的臨時表中

CREATE PROCEDURE rr_reward() 

SELECT a.emp_num,a.emp_name 
FROM emp_data a 
WHERE a.active_code = 1 

END PROCEDURE 

,但我得到了以下錯誤:

sql error (-659) into temp table required for select statement

+0

這是關於MySQL服務器的問題嗎?和女巫版的DBMS? –

+2

[爲什麼此SQL存儲過程要求創建臨時表才能使其工作(返回結果)?](http://stackoverflow.com/questions/7343187/why-does-this-sql-storage -procedure-require-that-a-temp-table-be-created-for-it-t) –

+0

@juergend:我試着回答這個問題,但我得到這個錯誤:'一個子查詢不是eaxctly返回一行' –

回答

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做這件事。 A VIEW沿線:

CREATE VIEW active_emp (emp_num, emp_data) 
    AS SELECT emp_num, emp_name 
     FROM emp_data 
     WHERE active_code = 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中添加它們即可。