التحقق إذا كان جمع عنصر موجود في أوراكل
-
20-09-2019 - |
سؤال
لقد خلق نوع بسيط:
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>