فايربيرد الإجراء المخزن لوصل كافة قيم الحقول من صفوف متعددة
-
06-07-2019 - |
سؤال
وهدفي هو لكتابة بروك المخزنة التي يمكن أن تجمع كافة قيم الحقول من صفوف متعددة في متغير الإخراج واحدة واحدة (ربما VARCHAR (some_length)). قد يبدو الحل غريب ولكني إيجابي جدا في واحدة فقط يمكنني استخدامها في ذلك ايم الوضع في. أنا لم تستخدم فايربيرد قبل وprocs المخزنة تبدو مختلفة من وسيلة في أنظمة ديسيبل الأخرى المعروفة. بلدي فايربيرد 1.5 واللهجة 3 (لست متأكدا ما يعنيه). ولذلك ربما يكون شخص يمكن ان يساعدني مع مثال الخوارزمية.
المحلول
والإجراء التالي يفعل ما تصفون:
SET TERM !!;
CREATE PROCEDURE concat_names
RETURNS (concat VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(100);
BEGIN
concat = '';
FOR SELECT first_name || ' ' || last_name FROM employee INTO :name
DO BEGIN
concat = concat || name || ', ';
END
END!!
SET TERM ;!!
EXECUTE PROCEDURE concat_names;
ولكن أنا التشكيك في حكمة هذا الحل. كيف يمكنك أن تعرف VARCHAR طويلة بما فيه الكفاية لجميع الصفوف في مجموعة البيانات المطلوبة؟
وانه من الاسهل بكثير وأكثر أمنا لتشغيل استعلام لإرجاع النتيجة إلى صف طلب من صف واحد. كل لغة برمجة التطبيقات لديها وسائل لسلسلة السلاسل، ولكن الأهم لديهم أساليب أكثر مرونة لإدارة نمو البيانات.
وبالمناسبة، "لهجة" في فايربيرد وينترباسي يشير إلى وضع التوافق التي تم تقديمها بحيث التطبيقات التي تم تطويرها لينترباسي 5.X يمكن أن تعمل مع الإصدارات الأحدث من ينترباسي وفايربيرد. كان ذلك قبل عشر سنوات تقريبا، وAFAIK ليس هناك حاجة اليوم إلى استخدام أي شيء أقل من لهجة 3.
نصائح أخرى
لديك لاختبار القيم الخالية عندما وصل، وهنا مثال للحقلين والفاصل بينهما:
CREATE PROCEDURE CONCAT(
F1 VARCHAR(385),
F2 VARCHAR(385),
SEPARATOR VARCHAR(10))
RETURNS (
RESULT VARCHAR(780))
AS
begin
if ((:f1 is not null) and (:f1 <> '')) then
result = :f1;
if ((:f2 is not null) and (:f2 <> '')) then
if ((result is not null) and (result <> '')) then
begin
if ((:separator is not null) and (separator <> '')) then
result = result||separator||f2;
else
result = result||f2;
end
else
result = f2;
suspend;
end
وبالعودة صفوف متعددة باستخدام إجراءات فايربيرد المخزنة سهل جدا جدا.
لا تستخدم:
execute procedure proc_name(value);
وبدلا من ذلك استخدام:
select * from proc_name(value);