Oracle にコレクション要素が存在するかどうかを確認する
-
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;
例外が発生します:PLS-00302:コンポーネント「EXISTS」を宣言する必要があります
しかし、この例は機能します:
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型でEXISTSメソッドを実装することは可能でしょうか?
解決
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;
他のヒント
<のhref = "http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/collections.htm#CIHIEBJC" のrel = "noreferrer" タイトル= "OracleのPL / SQLとして、言語ガイド」>ドキュメントの状態は、コレクション内の番号のエントリが存在するかどうかEXISTS(
)のテストをを。つまり、array.exists(3)
はarray
の第三の要素が移入されていることをアサートします。
あなたはあなたの最初の例でやろうとしていることは、インスタンスtmp
はObjectList
の要素に一致するかどうかのテストです。 10グラムから以降、私たちは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>