我需要将XML数据传输到Oracle表中
我正在尝试将数据从XML文件导入Oracle中的表。我在用蟾蜍 我也遵循了以下Oracle论坛主题: XML文件如下所示(Example2.XML;与论坛中刚更改名称的站点相同): 创建表和目录后,我运行以下操作:我需要将XML数据传输到Oracle表中,xml,oracle,oracle11g,Xml,Oracle,Oracle11g,我正在尝试将数据从XML文件导入Oracle中的表。我在用蟾蜍 我也遵循了以下Oracle论坛主题: XML文件如下所示(Example2.XML;与论坛中刚更改名称的站点相同): 创建表和目录后,我运行以下操作: DECLARE acct_doc xmltype := xmltype( bfilename('test_direc','Example2.xml'), nls_charset_id('AL32UTF8') ); BEGIN insert into xxrp_acct_d
DECLARE
acct_doc xmltype := xmltype( bfilename('test_direc','Example2.xml'), nls_charset_id('AL32UTF8') );
BEGIN
insert into xxrp_acct_details (status_code, status_remarks, segment_number, remarks)
select x.*
from xmltable(
'for $i in /ACCOUNT_HEADER_ACK/HEADER
return
for $j in $i/following-sibling::DETAILS[1]/DETAIL
return element r {$i, $j}'
passing acct_doc
columns status_code number path 'HEADER/STATUS_CODE',
status_remarks varchar2(100) path 'HEADER/STATUS_REMARKS',
segment_number number path 'DETAIL/SEGMENT_NUMBER',
remarks varchar2(100) path 'DETAIL/REMARKS'
) x
;
END;
运行此操作时,我得到的错误如下:
ORA-22285: non-existent directory or file for FILEOPEN operation
ORA-06512: at "SYS.XMLTYPE", line 296
ORA-06512: at line 3
我不明白我做错了什么
我觉得控制文件可能是个问题,因为我没有创建任何文件
========================================================
在我以前的代码中,问题是连接没有正确构建。
我现在做的是将整个XML存储到声明中的一个文件中,并调用它。
但是,我遇到了以下错误:
ORA-06550:第14行第19列:
PLS-00382:表达式类型错误
我以这种方式更改了代码:
DECLARE
v_outputfile UTL_FILE.FILE_TYPE:=UTL_FILE.FOPEN('\home\apradh01\','Example2.xml','w');
BEGIN
insert into xxrp_acct_details (status_code, status_remarks, segment_number, remarks)
select x.*
from xmltable(
'for $i in /ACCOUNT_HEADER_ACK/HEADER
return
for $j in $i/following-sibling::DETAILS[1]/DETAIL
return element r {$i, $j}'
passing XMLTYPE(v_outputfile)
columns status_code number path 'HEADER/STATUS_CODE',
status_remarks varchar2(100) path 'HEADER/STATUS_REMARKS',
segment_number number path 'DETAIL/SEGMENT_NUMBER',
remarks varchar2(100) path 'DETAIL/REMARKS'
) x
;
END;
=================================================
好的,所以存在一些连接问题,我确定这是因为当我修改代码时(即不是从文件中读取XML内容,而是手动输入),它工作正常:
DECLARE
BEGIN
insert into xxrp_acct_details (status_code, status_remarks, segment_number, remarks)
select x.*
from xmltable(
'for $i in /ACCOUNT_HEADER_ACK/HEADER
return
for $j in $i/following-sibling::DETAILS[1]/DETAIL
return element r {$i, $j}'
passing XMLTYPE('<?xml version="1.0"?>
<ACCOUNT_HEADER_ACK>
<HEADER>
<STATUS_CODE>100</STATUS_CODE>
<STATUS_REMARKS>check</STATUS_REMARKS>
</HEADER>
<DETAILS>
<DETAIL>
<SEGMENT_NUMBER>2</SEGMENT_NUMBER>
<REMARKS>rp polytechnic</REMARKS>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>3</SEGMENT_NUMBER>
<REMARKS>rp polytechnic administration</REMARKS>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>4</SEGMENT_NUMBER>
<REMARKS>rp polytechnic finance</REMARKS>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>5</SEGMENT_NUMBER>
<REMARKS>rp polytechnic logistics</REMARKS>
</DETAIL>
</DETAILS>
<HEADER>
<STATUS_CODE>500</STATUS_CODE>
<STATUS_REMARKS>process exception</STATUS_REMARKS>
</HEADER>
<DETAILS>
<DETAIL>
<SEGMENT_NUMBER>20</SEGMENT_NUMBER>
<REMARKS> base polytechnic</REMARKS>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>30</SEGMENT_NUMBER>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>40</SEGMENT_NUMBER>
<REMARKS> base polytechnic finance</REMARKS>
</DETAIL>
<DETAIL>
<SEGMENT_NUMBER>50</SEGMENT_NUMBER>
<REMARKS> base polytechnic logistics</REMARKS>
</DETAIL>
</DETAILS>
</ACCOUNT_HEADER_ACK>'
)
columns status_code number path 'HEADER/STATUS_CODE',
status_remarks varchar2(100) path 'HEADER/STATUS_REMARKS',
segment_number number path 'DETAIL/SEGMENT_NUMBER',
remarks varchar2(100) path 'DETAIL/REMARKS'
) x
;
END;
任何建议…您使用
创建目录测试\u direc…
创建目录,这意味着您使用了一个不带引号的标识符,这很好;但这意味着它以大写名称存储在数据字典中。如果您查询所有目录
查看为测试目录
。因此,当您将目录名作为字符串传递时,需要使用大写名称:
bfilename('TEST_DIREC','Example2.xml')
除此之外,你所展示的一切都是有效的;不过,您实际上并不需要PL/SQL块,您可以使用普通的SQL insert语句,直接在passing
子句中提供文件:
passing xmltype( bfilename('TEST_DIREC','Example2.xml'), nls_charset_id('AL32UTF8') )
这假定您所指向的目录,C:\Documents and Settings\adeb01\Desktop
,与数据库本身运行在同一台机器上,并且Oracle可以看到它。您只能访问服务器上的目录,而不能访问连接到服务器的任何客户端上的目录,这是安全模型的一部分。发件人:
目录对象为服务器文件系统上的目录指定别名
。。。无论哪个帐户运行Oracle数据库,都必须具有访问该目录的操作系统权限,如果该目录位于您的个人帐户下,则可能不是这样
如果文件当前在您的电脑上,而数据库在其他地方,则需要将文件复制到服务器上,复制到Oracle有权访问的目录中,并创建指向该服务器目录的Oracle目录对象。是本地电脑上运行的数据库,或者在其他地方的服务器上?它运行在服务器上我知道你可能会得到什么,我给出的是我的本地机器的路径而不是服务器的路径…但不是那样。我正在客户端的远程计算机上工作…我已经给出了远程计算机的路径,数据库服务器上是否存在路径
C:\Documents and Settings\adeb01\Desktop
?每个人都可以访问它,或者至少可以访问Oracle运行的任何帐户?(我不是100%确定在Windows下如何工作,我只是意识到!)。主目录通常是受限的。@AmritaDeb-我已经用一条关于文件位置的注释更新了答案。它必须在服务器上,而不是本地PC上,很抱歉。我修改了我的目录以包含我修改了我的目录:create or replace directory test\u direc as'\home\apradh01\
Oracle可以访问此目录…但我仍然面临同样的问题您是否已将目录对象的权限授予运行插入的用户?
acct_doc xmltype := xmltype( bfilename('TEST_DIR','acct.xml'), nls_charset_id('AL32UTF8') );
bfilename('TEST_DIREC','Example2.xml')
passing xmltype( bfilename('TEST_DIREC','Example2.xml'), nls_charset_id('AL32UTF8') )