Firebird 2.1 الإجراء المخزن لتسلسل النص على صفوف متعددة
-
28-09-2019 - |
سؤال
أحاول كتابة إجراء مخزن لتسلسل صفوف متعددة من النص معًا لإعادته كسلسلة واحدة. فمثلا:
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 هنا