質問

単純な型を作成します。

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の第三の要素が移入されていることをアサートします。

あなたはあなたの最初の例でやろうとしていることは、インスタンスtmpObjectListの要素に一致するかどうかのテストです。 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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top