Stored procedures Firebird 2.1用于连接多行文本的存储过程

Stored procedures Firebird 2.1用于连接多行文本的存储过程,stored-procedures,concatenation,firebird,firebird2.1,Stored Procedures,Concatenation,Firebird,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 (

我试图编写一个存储过程,将多行文本连接在一起,以作为单个字符串返回。例如:

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;
然而,当我跑步时:

select concat from concat_names(1);
它总是返回零行


有什么想法吗?

你忘了暂停。您的进程应该如下所示:

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 ;!!
您可以在不存储过程的情况下获得相同的结果。使用列表聚合函数:

SELECT LIST(text, '') FROM TEST where id=:iID 

列表的第二个参数是分隔符。如果您仅使用字段名调用列表,则逗号“,”将用于分隔值。

如果字段测试可能为空,并且您不希望将整个结果设置为空,则使用以下命令非常有用:

 CONCAT = CONCAT || coalesce(name,'');
而不是

CONCAT = CONCAT || name;

在不使用存储过程和Firebird 2.5版本的情况下,列表聚合函数将返回“列中非空值的逗号分隔字符串串联”*。使用前面提到的测试表,SQL

SELECT LIST(TEXT)
    FROM TEST
返回

一号线,二号线,三号线

这可能会引起一些兴趣


*取自Firebird参考页Hi Andrei,挂起位起作用,但列表不起作用,因为无法保证Select语句返回行的顺序。如果按SEQ列排序,则需要按它分组,这样就不会返回正确的结果。我已经试过这样做,认为这样会更有效率。顺便问一下,你是GBS的Andrei K吗?对不起,GSB的邮购错了。黄金软件,白俄罗斯