2017-02-14 39 views
4

我想知道是否能夠在火鳥1.5返回一個SELECT查詢中找到多於一個的行,象下面這樣:是否有可能在Firebird的存儲過程中返回多行?

| FIELD1 | FIELD 2 | 
-------------------- 
| 1.00 | 1  | 
| 2.00 | 2  | 
| 3.00 | 3  | 

SET TERM /; 

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2; 
END/ 

EXECUTE PROCEDURE TEST/ 

SET TERM ;/ 

假設該查詢返回多於一個的結果/行,下面的錯誤被拋出:

語句失敗,SQLCODE = -811

單中多行選擇

顯然,Firebird的引擎不允許我在一個變量中返回多個值。我正在開發一個Python軟件,我想根據程序TEST,以元組的形式獲得,例如,類似於[(1.00,1),(2.00,2),(3.00,3)]的Python。我正在使用kinterbasdb模塊來連接GDB。

有沒有辦法做到這一點?

+0

請檢查http://stackoverflow.com/questions/34900648/how-to-execute-procedure-returning-resultset-in-firebird – Tajinder

+0

出於好奇:你爲什麼還在使用kinterbasdb?它已被[FDB](https://pypi.python.org/pypi/fdb/)和[firebirdsql](https://pypi.python.org/pypi/firebirdsql)等驅動程序取代。 –

回答

3

你需要什麼叫做「可選擇的存儲過程」。基本上,你必須更改您的代碼是這樣的:

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    for SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2 
    do SUSPEND; 
END 

,並調用過程以SELECT,像這樣:

SELECT * FROM TEST; 

祝你好運!

+0

另請參閱https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-storedprocs.html#fblangref25-psql-storedprocs-types –

4

火鳥具有兩個types of stored procedures

  • 可執行程序產生最多一個行,以及使用被執行:

    execute procedure <procedurename> 
    
  • 可選程序,可以產生多個行並使用被執行:

    select * from <procedurename> 
    

    或帶參數:

    select * from <procedurename>(param, ...) 
    

可選擇的程序包含SUSPEND關鍵字輸出該行,並等待下一個取指令。這個關鍵字的存在是唯一區分這兩種類型的東西。

警告:可以使用execute procedure進行可選過程,但在這種情況下,它只會生成一行,並且在生成第一行之後執行將結束:SUSPEND之後的其餘存儲過程將會不被執行!它也曾經可以從可執行的存儲過程中「選擇」,但在Firebird 3中不再可能。

錯誤的具體原因「在單多行選擇」是行:

SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2; 

select ... into ...語句只允許生產單行(又名一個單獨選擇)。如果您期望多行,則需要使用for select ... into ... do,它允許您遍歷結果行。然後

suspend相結合,這將導致:

CREATE OR ALTER PROCEDURE TEST 
RETURNS (VARIABLE1 DOUBLE PRECISION, VARIABLE2 INTEGER) 
AS 
BEGIN 
    FOR SELECT FIELD1, FIELD2 FROM TABLE INTO :VARIABLE1, :VARIABLE2 
    DO 
    BEGIN 
     SUSPEND; 
    END 
END 

BEGIN ... END - 阻塞在技術上是沒有必要的,但我更喜歡這裏始終使用塊。

您可以再與執行此:

select variable1, variable2 from test; 
相關問題