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

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);

它总是返回零行。

有任何想法吗?

有帮助吗?

解决方案

你忘记了暂停。您的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 ;!!

您无需存储Proc即可达到相同的结果。使用列表汇总函数:

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

列表的第二个参数是定界符。如果您仅使用字段名称调用列表,则将使用逗号',将用于分离值。

其他提示

在这种情况下,现场测试可以BEN NULL,并且您不想设置整个结果,将使用:

 CONCAT = CONCAT || coalesce(name,'');

代替

CONCAT = CONCAT || name;

不使用存储的Proc并使用版本Firebird 2.5, 列表 聚合函数将返回“列中非零值的逗号分隔字符串串联”*。使用上述测试表,SQL

SELECT LIST(TEXT)
    FROM TEST

返回

第1行,第2行,第3行

这可能引起人们的兴趣。

*取自火鸟参考页面 这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top