2008-10-08 19 views
5

我的目標是編寫一個存儲過程,可以將來自多行的所有字段值收集到一個輸出變量(可能是varchar(some_length))中。這可能看起來奇怪的解決方案,但我相當積極,它是我可以在這種情況下使用的唯一一個。我以前沒有使用過Firebird,並且存儲過程看起來與其他着名的數據庫系統不同。 我的火鳥是1.5和方言3(不知道這是什麼意思)。 所以也許有人可以幫助我一個算法的例子。Firebird存儲過程用於連接來自多行的所有字段值

回答

5

以下步驟做你的描述:

SET TERM !!; 
CREATE PROCEDURE concat_names 
    RETURNS (concat VARCHAR(2000)) 
AS 
DECLARE VARIABLE name VARCHAR(100); 
BEGIN 
    concat = ''; 
    FOR SELECT first_name || ' ' || last_name FROM employee INTO :name 
    DO BEGIN 
    concat = concat || name || ', '; 
    END 
END!! 
SET TERM ;!! 
EXECUTE PROCEDURE concat_names; 

但我懷疑這個解決方案的智慧。你怎麼知道VARCHAR對於你想要的數據集中的所有行足夠長?

運行查詢以逐行將結果返回給應用程序變得更加容易和安全。每種應用程序編程語言都有連接字符串的方法,但更重要的是,它們有更靈活的方法來管理數據的增長。

順便說一下,Firebird和InterBase中的「方言」是指引入的兼容模式,以便爲InterBase 5.x開發的應用程序可以與更高版本的InterBase和Firebird一起使用。這是大約十年前,和AFAIK今天有沒有必要使用任何超過方言低3

+0

如果使用火鳥2.1,你可以用列表聚集函數提供了文本BLOB結果。即沒有限制的varchar字段。 – 2008-10-08 19:42:32

0

你要測試空值串聯的時候,這裏是兩個領域的例子,它們之間的分隔符:

CREATE PROCEDURE CONCAT(
    F1 VARCHAR(385), 
    F2 VARCHAR(385), 
    SEPARATOR VARCHAR(10)) 
RETURNS (
    RESULT VARCHAR(780)) 
AS 
begin 

    if ((:f1 is not null) and (:f1 <> '')) then 
    result = :f1; 

    if ((:f2 is not null) and (:f2 <> '')) then 
    if ((result is not null) and (result <> '')) then 
     begin 
     if ((:separator is not null) and (separator <> '')) then 
      result = result||separator||f2; 
     else 
      result = result||f2; 
     end 
    else 
     result = f2; 

    suspend; 
end 
0

使用Firebird存儲過程返回多行非常容易。

不要使用:

execute procedure proc_name(value); 

而是使用:

select * from proc_name(value);