كيف يمكن ملء متغير من نوع البيانات الذي تم إنشاؤه داخل Oracle PL/SQL؟

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

سؤال

في أوراكل ، قمت بإنشاء نوع بيانات:

TABLE of VARCHAR2(200)

أريد أن يكون لدي متغير من هذا النوع ضمن إجراء مخزن (محدد محليًا ، وليس كجدول فعلي في DB) وملء البيانات.

توضح بعض العينات عبر الإنترنت كيف يمكنني استخدام نوعي إذا تم ملؤه وتمريره كمعلمة إلى الإجراء المخزن:

SELECT column_value currVal FROM table(pMyPassedParameter)

ومع ذلك ، فإن ما أريده هو ملءه خلال رمز PL/SQL نفسه ، مع عبارات إدراج.

أي شخص يعرف بناء جملة هذا؟

تحرير: يجب أن أوضح: يتم إدخال بيانات المصدر الخاصة بي كمعلمة varchar2 تم تمريرها إلى الإجراء المخزن: سلسلة فاصلة (مثل الفاصلة) المحددة. أنا بالفعل أكرر من خلال السلسلة المحددة للحصول على كل قيمة منفصلة - أود إدراج كل واحد في النوع الخاص بي حتى أتمكن من معاملته كجدول لبقية المنطق.

هل كانت مفيدة؟

المحلول

"أريد أن تملأه خلال رمز PL/SQL نفسه ، مع عبارات إدراج"

إنه مثل ملء أي متغير PL/SQL آخر: يجب أن نستخدمه. فقط لأننا نلول صفوفًا متعددة نحتاج إلى استخدام بناء جملة التجميع بالجملة.

declare
    l_array your_nested_table_type;
begin
    select col1
    bulk collect into l_array
    from t72;
end;
/

إذا كانت مجموعة النتيجة تُرجع الكثير من السجلات ، فمن الجيد استخدام شرط الحد داخل الحلقة. وذلك لأن مجموعات PL/SQL - تمامًا مثل كل متغير PL/SQL - يتم الاحتفاظ بها في ذاكرة الجلسة. لذلك لا نريد أن يصبح الصفيف كبيرًا جدًا ، وإلا فقد ينفجر PGA. اكتشف المزيد.

تعديل

"لقد قمت بتحرير السؤال لتوضيح ما أريده على وجه التحديد"

تنهد رمز السلسلة هو مشكلة مختلفة تماما. سبق أن نشرت حلول في اثنين من المواضيع. إذا كنت تستخدم 9i أو في وقت سابق الاستخدام هذا النهج. خلاف ذلك استخدام هذا الحل Regex (في الواقع هذا يقسم السلسلة إلى رموز رقمية ، ولكن من السهل تحويل إلى أحرف).

تحرير 2

"أريد فقط أن أكون قادرًا على استخدام النوع" داخليًا "(ضمن الإجراء المخزن) عن طريق إضافة قيم إليه. هل هذا شيء يمكنني القيام به مع الرابط الأول؟"

بالتأكيد. لما لا؟

SQL> declare
  2      local_array tok_tbl;
  3  begin
  4      local_array := parser.my_parse('Keith Pellig,Peter Wakeman,Ted Bentley,Eleanor Stevens');
  5      local_array.extend();
  6      local_array(5) := 'Reese Verrick';
  7      for i in local_array.first()..local_array.last()
  8      loop
  9          dbms_output.put_line(local_array(i));
 10      end loop;
 11  end;
 12  /
Keith Pellig
Peter Wakeman
Ted Bentley
Eleanor Stevens
Reese Verrick

PL/SQL procedure successfully completed.

SQL>

لقد قمت هنا بإعادة استخدام نوع SQL الخاص بي ، لكنه سيعمل أيضًا إذا كان الأمر كذلك TOK_TBL تم إعلانها في حزمة PL/SQL بدلاً من ذلك.

نصائح أخرى

لا تذكر ما إذا كان النوع الذي قمت بإنشائه هو نوع SQL أو نوع PL/SQL. يتم استخدامها بشكل مشابه في PL/SQL ، لذا سأفترض أنك قمت بإنشاء نوع SQL مع أمر مثل هذا:

SQL> CREATE TYPE tab_varchar IS TABLE of VARCHAR2(200);
  2  /

Type created

هذا هو المائدة المتداخلة. اكتشف كيفية معالجة المجموعات في PL/SQL في الوثائق ، على سبيل المثال:

SQL> DECLARE
  2     lt tab_varchar;
  3  BEGIN
  4     /* initialization */
  5     lt := tab_varchar('a', 'b', 'c');
  6     /* adding elements */
  7     lt.extend(1);
  8     lt(4) := 'd';
  9     FOR i IN lt.FIRST .. lt.LAST LOOP
 10        dbms_output.put_line('lt(' || i || ')=' || lt(i));
 11     END LOOP;
 12  END;
 13  /

lt(1)=a
lt(2)=b
lt(3)=c
lt(4)=d
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top