2

10gR2 でスタック データ構造を実装したいと考えています。

しかし、私がやろうとすると:

TYPE Con​​tainerArray AS VARRAY(25) OF XDB.DBMS_XMLDOM.DOMNODE を作成または置換します。

私は得る

「スキーマ レベルの型に、XDB.DBMS_XMLDOM への不正な参照があります。」

これは、Oracle では、パッケージ レベルの型を参照するスキーマ レベルの型を作成できないためです。

パッケージ内に型を作成することで、この問題を解決できます。

TYPE ContainerArray AS VARRAY(25) OF XDB.DBMS_XMLDOM.DOMNODE;

ただし、オブジェクトを作成しようとすると、パッケージ レベルの型を参照できません。

CREATE TYPE DOMNode_Stack AS OBJECT ( 
   max_size INTEGER, 
   top      INTEGER,
   position ContainerArray,
   MEMBER PROCEDURE initialize,
   MEMBER FUNCTION full RETURN BOOLEAN,
   MEMBER FUNCTION empty RETURN BOOLEAN,
   MEMBER PROCEDURE push (n IN INTEGER),
   MEMBER PROCEDURE pop (n OUT INTEGER)
);

そして、私は取得するため、パッケージ内にオブジェクトタイプを作成できません

「このコンテキストではオブジェクトはサポートされていません。」

この問題を解決する方法について何か考えはありますか?

4

1 に答える 1

1

OBJECTのようなSQLレベルのオブジェクトは、属性でSQLタイプのみを参照できます。

パッケージ仕様が表示された場合:

TYPE DOMNode IS RECORD (id RAW(13));

したがって、次のSQL配列を作成できます

SQL> CREATE or replace TYPE ContainerArray AS VARRAY(25) OF raw(13);
  2  /

Type created.

次に、オブジェクトに入れます

position ContainerArray

これは機能します。参照するときは、ローカル変数v_domxml_dom.domnodeを割り当てるだけです。begin v_dom.id:=その時点で処理している配列インデックス値。

Oracleをアップグレードする場合は、DOMNODEの構造が変更されていないことを確認する必要があることに注意してください。

編集:ここにサンプルがあります:

SQL> set serverout on
SQL> create or replace type containerarray as varray(25) of raw(13);
  2  /

Type created.

SQL> create type domnode_stack as object (
  2     position containerarray,
  3     member procedure initialize,
  4     member procedure print_node_names
  5  );
  6  /

Type created.

SQL> CREATE TYPE body DOMNode_Stack
  2  as
  3    member procedure initialize
  4    is
  5      v_dom dbms_xmldom.DOMNode;
  6      v_doc dbms_xmldom.domdocument;
  7      v_nl  dbms_xmldom.DOMNodeList;
  8    begin
  9      position := containerarray();
 10      v_doc := dbms_xmldom.newDOMDocument(xmltype('<root><foo>test</foo><foo2>test2</foo2></root>')); -- just some summy data.
 11      v_nl  := dbms_xmldom.getElementsByTagName(v_doc, '*');
 12      for idx in 0..dbms_xmldom.getLength(v_nl)-1 loop
 13        v_dom := DBMS_XMLDOM.item(v_nl, idx);
 14        position.extend;
 15        position(position.last) := v_dom.id;
 16      end loop;
 17    end;
 18
 19    member procedure print_node_names
 20    is
 21      v_dom dbms_xmldom.DOMNode;
 22    begin
 23      for idx in 1..position.count
 24      loop
 25        v_dom.id := position(idx);
 26        dbms_output.put_line(dbms_xmldom.getnodename(v_dom)||'='||dbms_xmldom.getnodevalue(dbms_xmldom.getfirstchild(v_dom)));
 27      end loop;
 28    end;
 29  end;
 30  /

Type body created.

SQL> show errors type body DOMNode_Stack
No errors.
SQL> declare
  2    o_domnode DOMNode_Stack := DOMNode_Stack(null);
  3  begin
  4    o_domnode.initialize();
  5    o_domnode.print_node_names();
  6  end;
  7  /
root=
foo=test
foo2=test2

PL/SQL procedure successfully completed.

重要な点は次のとおりです。

DBMS_XMLDOMからSQLタイプに割り当てるには、v_dom.idを使用します。

13 v_dom:= DBMS_XMLDOM.item(v_nl、idx); 14 position.extend; 15 position(position.last):= v_dom.id;

逆転するとき:

23 for idx in 1..position.count 24 loop 25 v_dom.id:= position(idx);

つまり、ID部分(レコード自体ではなく、エラーが発生する)を割り当て直します。

于 2012-11-12T22:06:40.053 に答える