Можно ли передать в JAVA тип DBMS_XMLDOM.DomNode

Dimastyi
Дата: 22.09.2004 12:18:47
Добрый день!

Появилась необходимость обращаться из PL/SQL к методам классов, написанных на JAVA.
Не могу додуматься, как же туда передать и вернуть объект, соответствующий элементу
DOM-дерева разобранного XML-документа.

Например, есть Java класс:


create or replace and compile java source named test as

package XMLUtilsPack;

import org.w3c.dom.*;
import oracle.sql.*;

public class XMLUtils
{
public static String GetNodeName( Node node_p )
{
node_p.normalize();
return node_p.getNodeName();
}

public static String GetNodeName( oracle.sql.RAW node_p )
{
((Node)node_p).normalize();
return ((Node)node_p).getNodeName();
}

public static Node SetNodeValue( Node node_p, String value_p )
{
node_p.setNodeValue( value_p );
return node_p;
}
}


В ORACLE для узла дерева есть тип DBMS_XMLDOM.DOMNode. Это структура,
содержащая одно поле id типа raw. Теперь надо этот узел передать в JAVA.
Но вот как?
Написал обертку для обращения к JAVA:

create or replace function GetNodeName( node_p in raw ) return string
is language java
name 'XMLUtilsPack.XMLUtils.GetNodeName( oracle.sql.RAW ) returns java.lang.String';


Теперь через нее пытаюсь обратиться к методу JAVA класса и передать туда узел
дерева.


declare
p dbms_xmlparser.Parser;
doc dbms_xmldom.DOMDocument;
n dbms_xmldom.DOMNode;
nl dbms_xmldom.DOMNodeList;
len number;

begin
----------------------------------------------------------------------------
p := dbms_xmlparser.newParser();
----------------------------------------------------------------------------
dbms_xmlparser.parseBuffer( p, '<doc><title>TheTitle</title></doc>' );
doc := dbms_xmlparser.getDocument( p );
nl := dbms_xmldom.getElementsByTagName( doc, '*' );
len := dbms_xmldom.getLength( nl );
----------------------------------------------------------------------------
for i in 0..len-1 loop
n := dbms_xmldom.item( nl, i );
dbms_output.put( 'Node name is "' || getNodeName(n.id) || '" ' );
end loop;
----------------------------------------------------------------------------
dbms_xmldom.freeDocument( doc );
dbms_xmlparser.freeParser( p );
----------------------------------------------------------------------------
end;



В результате имею ошибку:

ORA-29532: вызов Java прерван неустановленным исключением Java: java.lang.ClassCastException

Понятно, что из-за несоответствия типов, но вот как это сделать? Можно ли вообще как-то
состыковать Оракловый тип DOMNode и Javавский org.w3c.dom.Node?

С уважением, Дмитрий.
Cactus
Дата: 23.09.2004 09:57:21
Зачем так делать?
Смысла нет.


Посмотри

Oracle9i JDBC Developer's Guide and Reference
Release 2 (9.2)
Part Number A96654-01
7
Accessing and Manipulating Oracle Data

и там
Datum rawdatum = ors.getOracleObject(1);


Про
org.w3c.dom.Node <-> oracle.xml.parser.v2.XMLNode;
посмотри примеры в ORACLE_HOME/xdk/demo/java/parser/dom/*.java