Firebird 2.1存储过程连接多行上的文本

wil*_*sdb 3 firebird stored-procedures concatenation firebird2.1

我正在尝试编写一个存储过程来连接多行文本以将其作为单个字符串返回.例如:

CREATE TABLE TEST (
 ID INTEGER,
 SEQ INTEGER,
 TEXT VARCHAR(255));

COMMIT;

INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 1, "LINE 1");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 2, "LINE 2");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 3, "LINE 3");

COMMIT;

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
END!!
SET TERM ;!!

commit;
Run Code Online (Sandbox Code Playgroud)

但是,当我跑:

select concat from concat_names(1);
Run Code Online (Sandbox Code Playgroud)

它总是返回零行.

有任何想法吗?

And*_*jeŭ 8

你忘记了SUSPEND.你的proc应该是这样的:

SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
  RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
  CONCAT = '';
  FOR SELECT TEXT FROM TEST where id=:iID INTO :name
  DO BEGIN
    CONCAT = CONCAT || name;
  END
  SUSPEND;
END!!
SET TERM ;!!
Run Code Online (Sandbox Code Playgroud)

没有存储过程,您可以获得相同的结果.使用LIST聚合函数:

SELECT LIST(text, '') FROM TEST where id=:iID 
Run Code Online (Sandbox Code Playgroud)

LIST的第二个参数是分隔符.如果仅使用字段名称调用LIST,则逗号','将用于分隔值.