如何使用sqlloader导入xml文件到Oracle数据库? 想请教一下大家,如何使用sqlloader导入xml文件到Oracle数据库?想就使用oracle的工具,不用其他程序实现请大家帮忙!谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 xml文件?需要分别导入到不同字段,还是把该文件所有内容都导入一lob字段?另外,XML文件好象没有固定格式吧。我是指如果多字段,之间需要有统一的分隔符。 是要分别倒是不同的字段的,不是整个内容导入一个lob字段中,能实现吗?谢谢 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程 学校里要求做个题,题目要求是写出将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。已知格式xml文件如下:<?xml version="1.0"?><PEOPLE> <PERSON PERSONID="E01"> <NAME>Tony Blair</NAME> <ADDRESS>10 Downing Street, London, UK</ADDRESS> <TEL>(061) 98765</TEL><FAX>(061) 98768</FAX> <EMAIL>[email protected]</EMAIL> </PERSON> <PERSON PERSONID="E02"> <NAME>Bill Clinton</NAME> <ADDRESS>White House, USA</ADDRESS> <TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX> <EMAIL>[email protected]</EMAIL> </PERSON> <PERSON PERSONID="E03"> <NAME>Tom Cruise</NAME> <ADDRESS>57 Jumbo Street, New York, USA</ADDRESS> <TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX> <EMAIL>[email protected]</EMAIL> </PERSON> <PERSON PERSONID="E04"> <NAME>Linda Goodman</NAME> <ADDRESS>78 Crax Lane, London, UK</ADDRESS> <TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX> <EMAIL>[email protected]</EMAIL> </PERSON></PEOPLE>于是写出过程如下:--建表CREATE TABLE PEOPLE( PERSONID VARCHAR2(10) PRIMARY KEY, NAME VARCHAR2(20), ADDRESS VARCHAR2(60), TEL VARCHAR2(20), FAX VARCHAR2(20), EMAIL VARCHAR2(40));--从xml文件载入数据保存到数据库的过程 create or replace procedure xml2db(xmlfile varchar2) as p xmlparser.Parser; doc xmldom.DOMDocument; n xmldom.DOMNode; nl xmldom.DOMNodeList; len number; --根据PERSON结点生成插入SQL语句的过程 function insertsql(node xmldom.DOMNode) return varchar2 is n xmldom.DOMNode; nl xmldom.DOMNodeList; len number; nnm xmldom.DOMNamedNodeMap; isql varchar2(200); begin --取得PERSON结点所有属性 nnm := xmldom.getAttributes(node); isql := 'insert into people values('; isql := isql || ''''; --取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中 isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0)); isql := isql || ''''; --取得PERSON结点下的所有结点,准备遍历 nl := xmldom.getChildNodes(node); len := xmldom.getLength(nl); for i in 0..len-1 loop --取出第i个结点 n := xmldom.item(nl,i); isql := isql || ','; isql := isql || ''''; --将结点的文本值取出并拼接到SQL语句中 isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n)); isql := isql || ''''; end loop; isql := isql || ')'; return isql; end insertsql;begin p := xmlparser.newParser; xmlparser.parse(p,xmlfile); --转换xml文件成DOM对像 doc := xmlparser.getDocument(p); xmlparser.freeParser(p); --取出所有PERSON元素 nl := xmldom.getElementsByTagName(doc,'PERSON'); len := xmldom.getLength(nl); --清空people表的内容 delete from people; for i in 0..len-1 loop --取出第i个PERSON元素 n := xmldom.item(nl,i); --执行插入该PERSON元素所用的SQL语句 execute immediate insertsql(n); end loop; commit; xmldom.freeDocument(doc);end xml2db;/--将数据库中的数据导出成xml文件的过程 create or replace procedure db2xml(xmlfile varchar2) as doc xmldom.DOMDocument; ret xmldom.DOMNode; peoplenode xmldom.DOMNode; --遍历整个people表的游标 ------------- --将people表中一行记录转换为元素 --并插入到DOM文档对像根结点PEOPLE下的过程 procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode, v_pid varchar2,v_name varchar2,v_addr varchar2, v_tel varchar2,v_fax varchar2,v_email varchar2) is personelem xmldom.DOMElement; personnode xmldom.DOMNode; itemelem xmldom.DOMElement; itemnode xmldom.DOMNode; text xmldom.DOMText; begin --创建PERSON结点 personelem := xmldom.createElement(doc,'PERSON'); --设置PERSONID属性 xmldom.setAttribute(personelem,'PERSONID',v_pid); personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(personelem)); --向PERSON结点中添加NAME元素 itemelem := xmldom.createElement(doc,'NAME'); -- 将NAME结点添加到PERSON结点中 itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); -- 创建文本结点 text := xmldom.createTextNode(doc,v_name); -- 将文本结点添加到NAME结点下,以构成完整NAME元素 itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); --向PERSON结点中添加ADDRESS元素 itemelem := xmldom.createElement(doc,'ADDRESS'); itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); text := xmldom.createTextNode(doc,v_addr); itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); --向PERSON结点中添加TEL元素 itemelem := xmldom.createElement(doc,'TEL'); itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); text := xmldom.createTextNode(doc,v_tel); itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); --向PERSON结点中添加FAX元素 itemelem := xmldom.createElement(doc,'FAX'); itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); text := xmldom.createTextNode(doc,v_fax); itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); --向PERSON结点中添加EMAIL元素 itemelem := xmldom.createElement(doc,'EMAIL'); itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem)); text := xmldom.createTextNode(doc,v_email); itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text)); end addperson;begin --创建一个新DOM文档对像 doc := xmldom.newDOMDocument; --为文档添加根结点PEOPLE peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE')); ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode); --使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中 for v_row in cur_people loop addperson(doc,peoplenode,v_row.personid,v_row.name, v_row.address,v_row.tel,v_row.fax,v_row.email); end loop; --将结果写入指定文件 xmldom.writeToFile(doc,xmlfile); xmldom.freeDocument(doc);end db2xml; 系统环境: 1、操作系统:Windows 2000 Server,机器内存128M 2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3、安装路径:C:\ORACLE 实现步骤: 1、打开MicroSoft Excel 2000 2、文件(F)→新建(N)→工作簿→ 3、输入以下数据,存盘为test.xls,如图: 4、文件(F)→另存为(A)→ 保存类型为:制表符分隔,起名为text.txt,保存到C:\ 5、连入SQL*Plus 以system/manager用户登录, SQL> conn system/manager 创建表结构 SQL> create table test ( id number, --序号 username varchar2(10), --用户名 password varchar2(10), --密码 sj varchar2(20) --建立日期 ); 6、创建SQL*Loader输入数据所需要的文件,均保存到C:\,用记事本编辑: 控制文件:input.ctl,内容如下: load data --1、控制文件标识 infile 'test.txt' --2、要输入的数据文件名为test.txt append into table test --3、向表test中追加记录 fields terminated by X'09' --4、字段终止于X'09',是一个制表符(TAB) (id,username,password,sj) -----定义列对应顺序 a、insert,为缺省方式,在数据装载开始时要求表为空 b、append,在表中追加新记录 c、replace,删除旧记录,替换成新装载的记录 d、truncate,同上 7、在DOS窗口下使用SQL*Loader命令实现数据的输入 C:\>sqlldr userid=system/manager control=input.ctl 默认日志文件名为:input.log 默认坏记录文件为:input.bad 8、连接到SQL*Plus中,查看是否成功输入 那位大神能介绍下DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT的用途 oracle中的cat表和tab表相关问题 为什么我用pl/sql中创建的oracle存储过程都是VALID的 都不能使用 问一个关于VARCHAR2型索引与NUMBER型索引,那个快的问题 求关于数据分割的语句 查看Table的默认值 dbca建库出错. oracle 按月份建分区表 请高手帮忙!!! 如何联到internet上面的oracle服务器? 表结构转换,行列转换! oracle有默认数据库么
能实现吗?谢谢
学校里要求做个题,题目要求是写出将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。
已知格式xml文件如下:<?xml version="1.0"?>
<PEOPLE>
<PERSON PERSONID="E01">
<NAME>Tony Blair</NAME>
<ADDRESS>10 Downing Street, London, UK</ADDRESS>
<TEL>(061) 98765</TEL><FAX>(061) 98768</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSON PERSONID="E02">
<NAME>Bill Clinton</NAME>
<ADDRESS>White House, USA</ADDRESS>
<TEL>(001) 6400 98765</TEL><FAX>(001) 6400 98769</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSON PERSONID="E03">
<NAME>Tom Cruise</NAME>
<ADDRESS>57 Jumbo Street, New York, USA</ADDRESS>
<TEL>(001) 4500 67859</TEL><FAX>(001) 4500 67895</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSON PERSONID="E04">
<NAME>Linda Goodman</NAME>
<ADDRESS>78 Crax Lane, London, UK</ADDRESS>
<TEL>(061) 54 56789</TEL><FAX>(061) 54 56772</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
</PEOPLE>于是写出过程如下:
--建表
CREATE TABLE PEOPLE
(
PERSONID VARCHAR2(10) PRIMARY KEY,
NAME VARCHAR2(20),
ADDRESS VARCHAR2(60),
TEL VARCHAR2(20),
FAX VARCHAR2(20),
EMAIL VARCHAR2(40)
);
--从xml文件载入数据保存到数据库的过程
create or replace procedure xml2db(xmlfile varchar2) as
p xmlparser.Parser;
doc xmldom.DOMDocument;
n xmldom.DOMNode;
nl xmldom.DOMNodeList;
len number;
--根据PERSON结点生成插入SQL语句的过程
function insertsql(node xmldom.DOMNode) return varchar2
is
n xmldom.DOMNode;
nl xmldom.DOMNodeList;
len number;
nnm xmldom.DOMNamedNodeMap;
isql varchar2(200);
begin
--取得PERSON结点所有属性
nnm := xmldom.getAttributes(node);
isql := 'insert into people values(';
isql := isql || '''';
--取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中
isql := isql || xmldom.getNodeValue(xmldom.item(nnm,0));
isql := isql || '''';
--取得PERSON结点下的所有结点,准备遍历
nl := xmldom.getChildNodes(node);
len := xmldom.getLength(nl);
for i in 0..len-1 loop
--取出第i个结点
n := xmldom.item(nl,i);
isql := isql || ',';
isql := isql || '''';
--将结点的文本值取出并拼接到SQL语句中
isql := isql || xmldom.getNodeValue(xmldom.getFirstChild(n));
isql := isql || '''';
end loop;
isql := isql || ')';
return isql;
end insertsql;
begin
p := xmlparser.newParser;
xmlparser.parse(p,xmlfile);
--转换xml文件成DOM对像
doc := xmlparser.getDocument(p);
xmlparser.freeParser(p);
--取出所有PERSON元素
nl := xmldom.getElementsByTagName(doc,'PERSON');
len := xmldom.getLength(nl);
--清空people表的内容
delete from people;
for i in 0..len-1 loop
--取出第i个PERSON元素
n := xmldom.item(nl,i);
--执行插入该PERSON元素所用的SQL语句
execute immediate insertsql(n);
end loop;
commit;
xmldom.freeDocument(doc);
end xml2db;
/
--将数据库中的数据导出成xml文件的过程
create or replace procedure db2xml(xmlfile varchar2) as
doc xmldom.DOMDocument;
ret xmldom.DOMNode;
peoplenode xmldom.DOMNode;
--遍历整个people表的游标
-------------
--将people表中一行记录转换为元素
--并插入到DOM文档对像根结点PEOPLE下的过程
procedure addperson(doc xmldom.DOMDocument,people xmldom.DOMNode,
v_pid varchar2,v_name varchar2,v_addr varchar2,
v_tel varchar2,v_fax varchar2,v_email varchar2)
is
personelem xmldom.DOMElement;
personnode xmldom.DOMNode;
itemelem xmldom.DOMElement;
itemnode xmldom.DOMNode;
text xmldom.DOMText;
begin
--创建PERSON结点
personelem := xmldom.createElement(doc,'PERSON');
--设置PERSONID属性
xmldom.setAttribute(personelem,'PERSONID',v_pid);
personnode := xmldom.appendChild(peoplenode,xmldom.makeNode(personelem));
--向PERSON结点中添加NAME元素
itemelem := xmldom.createElement(doc,'NAME');
-- 将NAME结点添加到PERSON结点中
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
-- 创建文本结点
text := xmldom.createTextNode(doc,v_name);
-- 将文本结点添加到NAME结点下,以构成完整NAME元素
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON结点中添加ADDRESS元素
itemelem := xmldom.createElement(doc,'ADDRESS');
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text := xmldom.createTextNode(doc,v_addr);
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON结点中添加TEL元素
itemelem := xmldom.createElement(doc,'TEL');
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text := xmldom.createTextNode(doc,v_tel);
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON结点中添加FAX元素
itemelem := xmldom.createElement(doc,'FAX');
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text := xmldom.createTextNode(doc,v_fax);
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
--向PERSON结点中添加EMAIL元素
itemelem := xmldom.createElement(doc,'EMAIL');
itemnode := xmldom.appendChild(personnode,xmldom.makeNode(itemelem));
text := xmldom.createTextNode(doc,v_email);
itemnode := xmldom.appendChild(itemnode,xmldom.makeNode(text));
end addperson;
begin
--创建一个新DOM文档对像
doc := xmldom.newDOMDocument;
--为文档添加根结点PEOPLE
peoplenode := xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
ret := xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
--使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
for v_row in cur_people loop
addperson(doc,peoplenode,v_row.personid,v_row.name,
v_row.address,v_row.tel,v_row.fax,v_row.email);
end loop;
--将结果写入指定文件
xmldom.writeToFile(doc,xmlfile);
xmldom.freeDocument(doc);
end db2xml;
1、操作系统:Windows 2000 Server,机器内存128M
2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
3、安装路径:C:\ORACLE
实现步骤:
1、打开MicroSoft Excel 2000
2、文件(F)→新建(N)→工作簿→
3、输入以下数据,存盘为test.xls,如图:
4、文件(F)→另存为(A)→
保存类型为:制表符分隔,起名为text.txt,保存到C:\
5、连入SQL*Plus
以system/manager用户登录,
SQL> conn system/manager
创建表结构
SQL> create table test
(
id number, --序号
username varchar2(10), --用户名
password varchar2(10), --密码
sj varchar2(20) --建立日期
);
6、创建SQL*Loader输入数据所需要的文件,均保存到C:\,用记事本编辑:
控制文件:input.ctl,内容如下:
load data --1、控制文件标识
infile 'test.txt' --2、要输入的数据文件名为test.txt
append into table test --3、向表test中追加记录
fields terminated by X'09' --4、字段终止于X'09',是一个制表符(TAB)
(id,username,password,sj) -----定义列对应顺序
a、insert,为缺省方式,在数据装载开始时要求表为空
b、append,在表中追加新记录
c、replace,删除旧记录,替换成新装载的记录
d、truncate,同上
7、在DOS窗口下使用SQL*Loader命令实现数据的输入
C:\>sqlldr userid=system/manager control=input.ctl
默认日志文件名为:input.log
默认坏记录文件为:input.bad
8、连接到SQL*Plus中,查看是否成功输入