存储过程读取xml文件实例:
 1PROCEDURE EXECUTE_DATESERV IS
 2  BEGIN
 3    DECLARE
 4      DIR         VARCHAR2(50);
 5      SERVFILE    VARCHAR2(20);
 6      V_XP        XMLPARSER.PARSER;
 7      V_DOC       XMLDOM.DOMDOCUMENT;
 8      V_MAPPINGS  XMLDOM.DOMNODELIST;
 9      V_MAPLEN    NUMBER(3);
10      V_TABLE     XMLDOM.DOMNODELIST;
11      V_TABLELEN  NUMBER(3);
12      V_FIELD     XMLDOM.DOMNODELIST;
13      V_MAPITEM   XMLDOM.DOMNODE;
14      V_TABLEITEM XMLDOM.DOMNODE;     NNM         XMLDOM.DOMNAMEDNODEMAP;
15      V_BO        VARCHAR2(20);
16      V_VALID     VARCHAR2(20);
17      V_FIELDID   VARCHAR2(20);
18      V_BOOLEAN   NUMBER(2);
19      V_TEXT      VARCHAR2(200);
20    BEGIN
21      DIR      := 'c:\temp';
22      SERVFILE := 'a.xml';
23      V_XP     := XMLPARSER.NEWPARSER;
24      XMLPARSER.SETVALIDATIONMODE(V_XP, FALSE);
25      XMLPARSER.SETBASEDIR(V_XP, DIR);
26      XMLPARSER.PARSE(V_XP, DIR || '\' || SERVFILE);
27      V_DOC := XMLPARSER.GETDOCUMENT(V_XP);
28      XMLPARSER.FREEPARSER(V_XP);
29      V_MAPPINGS := XMLDOM.GETELEMENTSBYTAGNAME(V_DOC, 'mappings');
30      V_MAPLEN   := XMLDOM.GETLENGTH(V_MAPPINGS);
31      FOR V_I IN 0 .. V_MAPLEN - 1 LOOP
32        V_MAPITEM  := XMLDOM.ITEM(V_MAPPINGS, V_I);
33        V_TABLE    := XMLDOM.GETCHILDNODES(V_MAPITEM);
34        V_TABLELEN := XMLDOM.GETLENGTH(V_TABLE);
35        FOR V_J IN 0 .. V_TABLELEN - 1 LOOP
36          V_TABLEITEM := XMLDOM.ITEM(V_TABLE, V_J);
37          IF XMLDOM.GETNODENAME(V_TABLEITEM) = 'table' THEN
38            NNM  := XMLDOM.GETATTRIBUTES(V_TABLEITEM);
39            V_BO := XMLDOM.GETNODEVALUE(XMLDOM.ITEM(NNM, 0));
40          END IF;
41          V_FIELD   := XMLDOM.GETCHILDNODES(V_TABLEITEM);
42          V_FIELDID := XMLDOM.GETNODEVALUE(XMLDOM.GETFIRSTCHILD(XMLDOM.ITEM(V_FIELD,
43                                                                            0)));
44          V_VALID   := XMLDOM.GETNODEVALUE(XMLDOM.GETFIRSTCHILD(XMLDOM.ITEM(V_FIELD,
45                                                                            1)));
46          PRO_SZH_SEQ.UPDATE_ENDDATE(V_BO,
47                                     V_FIELDID,
48                                     V_VALID,
49                                     V_BOOLEAN,
50                                     V_TEXT);
51          IF V_BOOLEAN <> 1 THEN
52            EXECUTE_INSERT_ERROR('pk_szh_date.excute_dateserv error :' ||
53                                 V_TEXT);
54          END IF;
55        END LOOP;
56      END LOOP;
57      XMLDOM.FREEDOCUMENT(V_DOC);
58    END;
59    NULL;
60  END EXECUTE_DATESERV;执行到26行,出错,错误是
ORA-31001:路径名”C:\temp\new.xml"无效
ORA-06512: "SYS.XDBURITYPE", 行11
ORA-06512: "XDB.DBMS_XSLPROCESSOR", 行142
ORA-29280: 无效的目录路径我用的是oracle 11,客户端,服务器端字符集都是JAPANESE_JAPAN.JA16SJISTILDE,os 日语winxp,还需要做什么设置吗?为啥有这个错误啊?请高手指教。

解决方案 »

  1.   

    把XMLPARSER.PARSE(V_XP, DIR  ¦ ¦ '\'  ¦ ¦ SERVFILE); 
    改为:
    XMLPARSER.PARSE(V_XP, DIR  ¦ ¦ '\\'  ¦ ¦ SERVFILE); 
      

  2.   

    请问“把XMLPARSER.PARSE(V_XP, DIR  ¦ ¦ '\'  ¦ ¦ SERVFILE);  ”
    报无效路径,后来这个是怎么改好的啊
    大哥我也碰到这个问题??
      

  3.   

    改成DIR:= 'C:\TEMP';试试。
    注意用大写
      

  4.   

    唔,是不是我的做法有问题呢?
    我使用PL/SQL的test 存储过程的。
    按照楼上的改写为大写的路径格式之后,编译停滞,像是死锁似的....test命令窗口,不能关闭,提示脚本正在运行,可是运行了好久也没有反应,也不能break该test脚本。强制关闭pl/sql也关闭不了,必须在sessin里面kill才可以。
    我都要晕了。咋回事啊?下方提示excuting,但是不能运行这么长时间吧?
      

  5.   

    SELECT T.* FROM V$PARAMETER T WHERE UPPER(NAME) = 'UTL_FILE_DIR'
    用这SQL找一下,看看选出的路径包含不包含你的用的。
    我知道一般的过程读取文件的路径必须是这个SQL取出来的路径,
    没写过XML方面的,不知道是不是也受相同的限制。
      

  6.   

    楼上所说的,是对于UTLopen方式读取xml的,是需要定于directory的。
    主要是,我看到有人使用oralce9i,就可以执行以上代码,但是使用oracle10以上版本就不可执行。但是 oracle 的文档中并无有什么区别.....