سؤال

لقد خلق نوع بسيط:

create or replace TYPE SIMPLE_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));

اختبار بسيط:

DECLARE
   TYPE ObjectList IS TABLE OF SIMPLE_TYPE;
   tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');
   o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));
BEGIN
   IF tmp.EXISTS(tmp) THEN
    dbms_output.put_line('OK, exists.');
   END IF;
END;

أحصل على استثناء:الثابتة والمتنقلة-00302:العنصر 'وجود' يجب التصريح عن

ولكن هذا المثال العمل:

DECLARE
   TYPE NumList IS TABLE OF INTEGER;
   n NumList := NumList(1,3,5,7);
BEGIN
   n.DELETE(2);
   IF n.EXISTS(1) THEN
      dbms_output.put_line('OK, element #1 exists.');
   END IF;
   IF n.EXISTS(3) = FALSE THEN
      dbms_output.put_line('OK, element #2 has been deleted.');
   END IF;
   IF n.EXISTS(99) = FALSE THEN
      dbms_output.put_line('OK, element #99 does not exist at all.');
   END IF;
END;

هل من الممكن تنفيذ أسلوب موجود في SIMPLE_TYPE النوع ؟

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

المحلول

tmp SIMPLE_TYPEE := SIMPLE_TYPE(1, 'a');

…

IF tmp.EXISTS(tmp) THEN

تعلن tmp كما SIMPLE_TYPE, لا ObjectList.

SIMPLE_TYPE هو العددية نوع, لا مجموعة.

ربما أردت أن تحقق o.EXISTS بدلا من ذلك (وهو ObjectList)?

تحديث:

EXISTS عندما يطبق على مجموعة تأخذ عدد صحيح مؤشر كحجة و الشيكات إذا كان عنصر مع هذا المؤشر موجود (لا قيمة لها).

للتحقق من أن SIMPLE_TYPE(1, 'a') موجود في الجدول الخاص بك, عليك التالية:

إنشاء ObjectList في القاموس:

CREATE TYPE ObjectList IS TABLE OF SIMPLE_TYPE;

إصدار SELECT الاستعلام:

DECLARE
        tmp SIMPLE_TYPE := SIMPLE_TYPE(1, 'a');
        o ObjectList := new ObjectList(SIMPLE_TYPE(2, 'a'), SIMPLE_TYPE(3, 'a'));
        myid INT;
BEGIN
        SELECT  1
        INTO    myid
        FROM    TABLE(o) q
        WHERE   SIMPLE_TYPE(q.id, q.name) = tmp
                AND rownum = 1;
        IF (myid = 1) THEN
                dbms_output.put_line('OK, exists.');
        END IF;
END;

نصائح أخرى

وكما في حالات وثائق ، EXISTS() اختبارات لوجود إدخال مرقمة في مجموعة. وهذا هو، ويؤكد array.exists(3) أن العنصر الثالث من array يتم تعبئة.

ما تحاول القيام به في المثال الأول هو اختبار ما إذا كان tmp المثال مباريات عنصر في ObjectList. من 10G فصاعدا يمكننا القيام بذلك باستخدام بناء الجملة MEMBER OF. للأسف، من أجل جعل هذا العمل علينا أن نعلن طريقة MAP، وهو عالي الكعب نوعا ما، وسوف تحصل على مزعج نوعا ما إذا كان الكائن لديه الكثير من الصفات.

SQL> create or replace type simple_type as object
  2       ( id number
  3         , name varchar2(30)
  4         , map member function compare return varchar2);
  5  /

Type created.

SQL>
SQL> create or replace type body simple_type as
  2       map member function compare return varchar2
  3       is
  4          return_value integer;
  5       begin
  6          return to_char(id, '0000000')||name;
  7       end compare;
  8  end;
  9  /

Type body created.

SQL>

وتشغيل المثال ...

SQL> set serveroutput on size unlimited
SQL>
SQL> declare
  2      type objectlist is table of simple_type;
  3      tmp simple_type := simple_type(1, 'a');
  4      o objectlist := new objectlist(simple_type(2, 'a'), simple_type(3, 'a'));
  5  begin
  6      if tmp MEMBER OF o then
  7          dbms_output.put_line('ok, exists.');
  8      else
  9          dbms_output.put_line('search me');
 10      end if;
 11  end;
 12  /
search me

PL/SQL procedure successfully completed.

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