3

次のコードを使用して、PL/SQL プロシージャを使用して XML ファイルを作成しようとしています。

create or replace directory temp_dir as 'C:\XML';
grant read, write on directory temp_dir to hr;

DECLARE
      doc  DBMS_XMLDOM.DOMDocument;
      xdata  XMLTYPE;

      CURSOR xmlcur IS
      SELECT xmlelement("Employee",XMLAttributes('http://www.w3.org/2001/XMLSchema' AS "xmlns:xsi",
                                    'http://www.oracle.com/Employee.xsd' AS "xsi:nonamespaceSchemaLocation")
                                ,xmlelement("EmployeeNumber",e.employee_id)
                                ,xmlelement("EmployeeName",e.first_name)
                               ,xmlelement("Department",xmlelement("DepartmentName",d.department_name)
                                                       ,xmlelement("Location",d.location_id)
                                          )
                    )
      FROM   employees e
      ,departments d
     WHERE  e.department_id=d.department_id;

   BEGIN
     OPEN xmlcur;
     FETCH xmlcur INTO xdata;
     CLOSE xmlcur;
     doc := DBMS_XMLDOM.NewDOMDocument(xdata);
     DBMS_XMLDOM.WRITETOFILE(doc, 'temp_dir/myXML1.xml');
     EXCEPTION
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20002,'Error writing out XML.');
   END;

しかし、私は次のエラーを受け取っています:-

Line 185: ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "XDB.DBMS_XSLPROCESSOR", line 217
ORA-29280: invalid directory path
ORA-29280: invalid directory path
ORA-06512: at "XDB.DBMS_XMLDOM", line 5292
ORA-06512: at line 23

私が間違っていること。

4

1 に答える 1

4

まず、データベース サーバー上のファイルに書き込もうとしていますね。クライアント マシン上のファイルではありませんか? c:\xmlサーバーではなく、クライアントマシンに存在する可能性のあるディレクトリのようです。

DBMS_XMLDOMドキュメントの状態

注: データベースを起動する前に、init.ORA ファイル内の読み取り元および書き込み先のディレクトリを指定する必要があります。例: UTL_FILE_DIR=/mypath/insidemypath。

読み取り元および書き込み先のファイルは、サーバーのファイル システム上にある必要があります。

DBMS_XMLDOMディレクトリオブジェクトをサポートしていないようです。UTL_FILE_DIRまだ古いパラメーターに依存しているようです。

getClobVal()個人的には、メソッドを使用して XMLType を CLOB に変換clob2fileし、パッケージ内のプロシージャを使用DBMS_XSLPROCESSORしてそれを書き出すと思います。

DBMS_XSLProcessor.Clob2File( 
  xdata.getClobVal(),
  'TEMP_DIR',
  'myXML1.xml' );

私のシステムで動作する

SQL> ed
Wrote file afiedt.buf

  1  DECLARE
  2    xdata  XMLTYPE;
  3    CURSOR xmlcur IS
  4    SELECT xmlelement("Employee",
  5                      XMLAttributes('http://www.w3.org/2001/XMLSchema' AS "xmlns:xsi",
  6                                    'http://www.oracle.com/Employee.xsd' AS "xsi:nonamespaceSchemaLocation")
  7                     ,xmlelement("EmployeeNumber",e.employee_id)
  8                     ,xmlelement("EmployeeName",e.first_name)
  9                     ,xmlelement("Department",
 10                                 xmlelement("DepartmentName",d.department_name)
 11                                ,xmlelement("Location",d.location_id)
 12                                )
 13                      )
 14    FROM   employees e
 15          ,departments d
 16    WHERE  e.department_id=d.department_id;
 17  BEGIN
 18    OPEN xmlcur;
 19    FETCH xmlcur INTO xdata;
 20    CLOSE xmlcur;
 21    DBMS_XSLProcessor.Clob2File(
 22        xdata.getClobVal(),
 23        'TEMP_DIR',
 24        'myXML1.xml' );
 25*    END;
SQL> /

PL/SQL procedure successfully completed.

最初の行だけでなく、カーソルからすべてのデータを実際にフェッチしたい場合は、ループが必要になります

SQL> ed
Wrote file afiedt.buf

  1  DECLARE
  2    xdata  XMLTYPE;
  3    CURSOR xmlcur IS
  4    SELECT xmlelement("Employee",
  5                      XMLAttributes('http://www.w3.org/2001/XMLSchema' AS "xmlns:xsi",
  6                                    'http://www.oracle.com/Employee.xsd' AS "xsi:nonamespaceSchemaLocation")
  7                     ,xmlelement("EmployeeNumber",e.employee_id)
  8                     ,xmlelement("EmployeeName",e.first_name)
  9                     ,xmlelement("Department",
 10                                 xmlelement("DepartmentName",d.department_name)
 11                                ,xmlelement("Location",d.location_id)
 12                                )
 13                      )
 14    FROM   employees e
 15          ,departments d
 16    WHERE  e.department_id=d.department_id;
 17    l_clob clob;
 18  BEGIN
 19    dbms_lob.createtemporary( l_clob, true );
 20    OPEN xmlcur;
 21    LOOP
 22      FETCH xmlcur INTO xdata;
 23      EXIT WHEN xmlcur%notfound;
 24      l_clob := l_clob || xdata.getClobVal();
 25    END LOOP;
 26    DBMS_XSLProcessor.Clob2File(
 27      l_clob,
 28      'TEMP_DIR',
 29      'myXML1.xml' );
 30    CLOSE xmlcur;
 31* END;
SQL> /

PL/SQL procedure successfully completed.
于 2013-04-03T23:02:32.193 に答える