سؤال

أحاول كتابة إجراء مخزن لتسلسل صفوف متعددة من النص معًا لإعادته كسلسلة واحدة. فمثلا:

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

يمكنك تحقيق نفس النتيجة دون تخزين 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

قد يكون هذا ذا اهتمام.

*مأخوذة من صفحة مرجع Firebird هنا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top