错误从PLSQL过程

问题描述:

我试图读取使用XMLParser的包PLSQL过程一个xml读取XML,我得到这个错误错误从PLSQL过程

 
ORA-31020: The operation is not allowed, Reason: Not supported 
ORA-06512: at "XDB.DBMS_XMLPARSER", line 395 
ORA-06512: at "SYS.DOMSAMPLE", line 75 
ORA-06512: at line 2 

DOMSAMPLE是我的程序名称,也没有说明是否有在行数字75,下一行包含p := xmlparser.newParser

有人可以帮我解决这个问题。或者建议一种简单的方法来读取plsql中的xml。

你已经提供了很少的关于你在做什么的细节,所以恐怕我只能猜测。

我无法重现您的错误消息,但我只尝试了几件事情。也许你错误地调用了Oracle XML API?也许你试图解析的XML文档有些奇怪吗?恐怕我不知道,因为您没有给我们提供您的DOMSAMPLE程序的源代码以及您试图解析的XML文档。

我不敢相信你的程序的第75行是空行。该过程的第75行还是包含该过程的文件的第75行?

以下是使用DBMS_XMLPARSERDBMS_XMLDOM的示例。它只是读出给定的XML字符串的根元素的名称:

SET SERVEROUTPUT ON; 

DECLARE 
    p dbms_xmlparser.parser; 
    d dbms_xmldom.domdocument; 
    e dbms_xmldom.domelement; 
BEGIN 
    p := dbms_xmlparser.newParser; 
    dbms_xmlparser.parseBuffer(p, '<thisIsATest />'); 
    d := dbms_xmlparser.getDocument(p); 
    e := dbms_xmldom.getDocumentElement(d); 
    dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e)); 
END; 
/

当我运行这个它给我的输出Tag name is thisIsATest

至于更简单的方法来读取XML,there's one in a question I answered earlier。我不知道这是否会对你有所帮助,因为我对你想要达到的目标知之甚少。

最后,请不要在SYS架构中创建对象。

编辑:在您的评论中,你提到你正在使用dbms_xmlparser.parse而不是dbms_xmlparser.parseBuffer。我在dbms_xmlparser.parse上玩了一次,并在最终找到有效的东西之前多次点击相同的“无效资源句柄或路径名”错误。以下是我设法工作的内容;这可能是比你想要的更好的解决方案。

在您可以使用Oracle执行任何文件I/O之前,似乎包括使用dbms_xmlparser.parse,您必须先创建一个Oracle'目录'。 Oracle中的目录对应于文件系统上的目录。请注意,这是运行Oracle数据库的计算机上的文件系统。如果XML文件不在同一文件系统上(例如,Oracle数据库位于服务器上,并且XML文件位于开发PC上),则除非您先将该文件传输到目录,否则您将无法使用dbms_xmlparser.parse在数据库服务器的文件系统上。

我将通过创建对应于我的文件系统目录中的Oracle目录开始:

 
SQL> create or replace directory ora_dir as '/home/luke/ora_dir'; 

Directory created. 

我在这里使用Linux。如果您使用Windows,请随意扭转斜杠的方向。

我们继续之前,让我们快速浏览一下XML文件,我们会阅读:

 
SQL> host cat /home/luke/ora_dir/example.xml 
<?xml version="1.0" ?> 
<root> 
    <child /> 
</root> 

在SQL * Plus,host发送行的其余部分的外壳,或cmd.exe在Windows上。在Windows上,您还可以使用type而不是cat

最后,这里有一个PL/SQL块读取这个XML文件:

 
SQL> set serveroutput on 
SQL> DECLARE 
    2  p dbms_xmlparser.parser; 
    3  d dbms_xmldom.domdocument; 
    4  e dbms_xmldom.domelement; 
    5 BEGIN 
    6  p := dbms_xmlparser.newParser; 
    7  dbms_xmlparser.setBaseDir(p, 'ORA_DIR'); 
    8  dbms_xmlparser.parse(p, 'example.xml'); 
    9  d := dbms_xmlparser.getDocument(p); 
10  e := dbms_xmldom.getDocumentElement(d); 
11  dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e)); 
12 END; 
13/
Tag name is root 

PL/SQL procedure successfully completed. 

SQL> 

该块,并进一步一升上来之间的唯一区别是,那个叫dbms_xmlparser.parseBuffer行已被替换两行。这两行中的第一行呼叫dbms_xmlparser.setBaseDir为解析器设置基本目录,第二行使用相对于此目录的文件名调用dbms_xmlparser.parse

编辑2:您的代码,这是不完全工作,你所希望的,而且你编辑成我的回答,如下:

create or replace procedure printElements(doc xmldom.DOMDocument) is 
nl xmldom.DOMNodeList; 
len number; 
n xmldom.DOMNode; 
e xmldom.DOMElement; 
nodeval varchar2(100); 
begin 
    -- get all elements 
    nl := xmldom.getElementsByTagName(doc, '*'); 
    len := xmldom.getLength(nl); 
    -- loop through elements 
    for i in 0..len-1 loop 
     n := xmldom.item(nl, i); 
     e := xmldom.makeElement(n => n); 
     dbms_output.put(xmldom.getNodeName(n) || ' '); 
     nodeval := xmldom.getNodeValue(n); 
     -- here nodeval i am getting as null, what mistake am doing? 
     dbms_output.put_line(' Value: '|| nodeval); 

    end loop; 

    dbms_output.put_line(''); 
end printElements; 

这显然是返回所有的值正如三条意见中的最后一条所建议的那样。

引述a previous answer of mine on a similar question

在XML DOM,元素没有任何 '价值' 可言。元素节点包含Text节点作为子节点,并且这些节点包含所需的值。

所以,尽量用替换线

 nodeval := xmldom.getNodeValue(n); 

 nodeval := xmldom.getNodeValue(xmldom.getFirstChild(n)); 
+0

太感谢你了,它真的帮了我... – Navin 2011-05-03 05:46:40

+0

在上面的代码片段,你写的东西,我我用dbms_xmlparser.parse(p,'c:/Desktop/family.xml')替换了dbms_xmlparser.parseBuffer,它给了我一个错误的无效资源句柄或路径名'c:/Desktop/famil.xml'。 xml文件是 - Sarah Bob Joanne Jim Navin 2011-05-03 06:29:46

+0

@Navin:您的XML文档看起来不错。查看我的编辑,查看使用'dbms_xmlparser.parse'的示例。 – 2011-05-03 22:05:34