فايربيرد الإجراء المخزن لوصل كافة قيم الحقول من صفوف متعددة

StackOverflow https://stackoverflow.com/questions/183675

سؤال

وهدفي هو لكتابة بروك المخزنة التي يمكن أن تجمع كافة قيم الحقول من صفوف متعددة في متغير الإخراج واحدة واحدة (ربما 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top