質問

複数の行のテキストを連結して単一の文字列として返すためのストアドプロシージャを作成しようとしています。例えば:

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 

リストの2番目のパラメーターは区切り文字です。フィールド名のみでリストを呼び出すと、comma 'は、値を分離するために使用されます。

他のヒント

この場合、フィールドテストはベンナルを使用でき、結果全体をnullするように設定したくありません。使用すると便利です。

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

それ以外の

CONCAT = CONCAT || name;

保存されたProcを利用せず、バージョンFirebird 2.5を使用しないと、 リスト 集約関数は、「列内の非ヌル値のコンマ分離された文字列の連結」*を返します。前述のテストテーブル、SQLを使用します

SELECT LIST(TEXT)
    FROM TEST

戻り値

1行目、2行目、3行目

これは興味深いかもしれません。

*Firebirdリファレンスページから取得 ここ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top