急问:XML入ORACLE库的问题 分不够尽管说

leiyingw 2008-09-05 08:11:37
我想把XML中的元素写入ORACLE数据库 应该怎么办?有没有简单一点的办法
比如说:
XML

<root>
<company>
<ID>0001</ID>
<NAME>ORACLE</NAME>
<COUNTRY>
<COUNTRY_CODE>USA</COUNTRY_CODE>
<COUNTRY_CODE>CHINA</COUNTRY_CODE>
<COUNTRY_CODE>UK</COUNTRY_CODE>
</COUNTRY>
</company>
</root>

数据库中有两张表 插入数据后应该是
表名 COMPANY_INFO
字段 ID NAME
0001 ORACLE

表名 COMPANY_COUNTRY
字段名 ID COUNTRY_CODE
0001 USA
0001 CHINA
0001 UK

关键在于怎么写程序实现效率最高?最好是C#
...全文
320 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleepzzzzz 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yafeiok 的回复:]
给你出个注意,我是做java的,我们把xml文件的内容导入oracle中是用Dom组建,先读取xml的内容,然后在写循环把内容导入到oracle中,你看一下行不;
[/Quote]

可行,如果数据量不太的话。
yafeiok 2008-09-18
  • 打赏
  • 举报
回复
给你出个注意,我是做java的,我们把xml文件的内容导入oracle中是用Dom组建,先读取xml的内容,然后在写循环把内容导入到oracle中,你看一下行不;
mantisXF 2008-09-06
  • 打赏
  • 举报
回复
用XMLTYPE类型对XML解析:



/* XML file detail

<company CID="1">
<ID>0001</ID>
<NAME>ORACLE</NAME>
<COUNTRY CTID="1">
<COUNTRY_CODE>USA</COUNTRY_CODE>
<COUNTRY_CODE>CHINA</COUNTRY_CODE>
<COUNTRY_CODE>UK</COUNTRY_CODE>
</COUNTRY>
</company>

*/

CREATE DIRECTORY XMLDIR AS 'C:\oracle\XMLDIRTY';


CREATE TABLE CLOB_TABLE (CID NUMBER,CONTENT CLOB);

CREATE TABLE XMLCONTENT (XMLID NUMBER PRIMARY KEY, XMLVALUE XMLTYPE);

INSERT INTO CLOB_TABLE(CID) VALUES(1); --CONTENT列没有定位器,并且没有数据
INSERT INTO CLOB_TABLE VALUES(2,'THE CONENT WORK FOR CID 2'); --CONTENT列有定位器,并且有数据
INSERT INTO CLOB_TABLE VALUES(3,EMPTY_CLOB());--CONTENT含有定位器,但是没有数据

COMMIT;

-- 用下面的函数把XML文件转换成CLOB对象,然后使用XMLTYPE类型插入并保存在表XMLCONTENT中.

/*
Author: mantisXF
Date: Sep 6, 2008
*/

CREATE OR REPLACE FUNCTION GET_CLOB_FROM_XML(FILENAME IN VARCHAR2,
CHARSET IN VARCHAR2 DEFAULT NULL
)RETURN CLOB DETERMINISTIC
IS
-- DECLARE VARIABLE E.G: CLOB,FILENAME
V_XML_FILE BFILE := BFILENAME('XMLDIRTY',FILENAME);
-- WORK FOR CONVENTING XML FILE TO CLOB OBJECT
V_CLOBCONTENT CLOB;
V_LANG_CTX NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
V_CHARSETID NUMBER := 0;
V_SRC_OFFSET NUMBER := 1;
V_DST_OFFSET NUMBER := 1;
V_WARNING NUMBER;

V_STEP VARCHAR2(100) := '';

BEGIN
V_STEP := 'DECIDE WHETHER CHARSET IS REQUIRED';
IF CHARSET IS NOT NULL THEN
V_CHARSETID := NLS_CHARSET_ID(CHARSET);
END IF;

V_STEP := 'MAKE LOB LOCATOR CAN HAVE THE PLACE BY SELECTING RESULT FROM CLOB_TABLE';
SELECT NVL(CONTENT,EMPTY_CLOB()) INTO V_CLOBCONTENT FROM CLOB_TABLE WHERE CID = 1 FOR UPDATE;

V_STEP := 'OPENING XML FILE';
DBMS_LOB.FILEOPEN(V_XML_FILE,DBMS_LOB.FILE_READONLY);

V_STEP := 'CONVERTING XML FILE TO CLOB OBJECT';
DBMS_LOB.LOADCLOBFROMFILE(V_CLOBCONTENT,V_XML_FILE,DBMS_LOB.GETLENGTH(V_XML_FILE),V_SRC_OFFSET,V_DST_OFFSET,V_CHARSETID,V_LANG_CTX,V_WARNING);

V_STEP := 'CLOSING XML FILE OBJECT';
DBMS_LOB.FILECLOSE(V_XML_FILE);

RETURN V_CLOBCONTENT;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error at: '|| V_STEP);
DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SQLERRM);

END;


-- 操作XMLTYPE类型的XML中的数据

SQL> INSERT INTO XMLCONTENT VALUES(1,XMLTYPE(GET_CLOB_FROM_XML('company.xml','UTF8')));

1 row inserted

SQL> COMMIT;

Commit complete

SQL>

SQL> SELECT EXTRACTVALUE(xmlvalue,'/company/COUNTRY/COUNTRY_CODE[1]')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACTVALUE(XMLVALUE,'/COMPAN
--------------------------------------------------------------------------------
USA

SQL>
SQL> SELECT EXTRACT(xmlvalue,'/company/COUNTRY')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACT(XMLVALUE,'/COMPANY/COU
--------------------------------------------------------------------------------
<COUNTRY CTID="1">
<COUNTRY_CODE>USA</COUNTRY_CODE>
<COUNTRY_CODE>CHINA</COUNTRY_CODE>
<COUNTRY_CODE>UK</COUNTRY_CODE>
</COUNTRY>


SQL>
SQL> SELECT EXTRACTVALUE(xmlvalue,'/company/COUNTRY/text()')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACTVALUE(XMLVALUE,'/COMPAN
--------------------------------------------------------------------------------

SQL>
SQL> SELECT extractValue(xmlvalue, '/company/COUNTRY/COUNTRY_CODE[1]/text()')
2 FROM XMLCONTENT
3 WHERE XMLID = 1
4 AND existsNode(xmlvalue, '/company/COUNTRY[COUNTRY_CODE="USA"]')
5 = 1;

EXTRACTVALUE(XMLVALUE,'/COMPAN
--------------------------------------------------------------------------------
USA

SQL>
SQL> SELECT existsNode(xmlvalue, '/company/COUNTRY[COUNTRY_CODE="USA"]')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXISTSNODE(XMLVALUE,'/COMPANY/
------------------------------
1

SQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/@CID').getNumberVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACT(XMLVALUE,'/COMPANY/@CI
------------------------------
1

SQL>
SQL> SELECT extract(xmlvalue, '/company/COUNTRY/COUNTRY_CODE[1]/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACT(XMLVALUE,'/COMPANY/COU
--------------------------------------------------------------------------------
USA

SQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACT(XMLVALUE,'/COMPANY/NAM
--------------------------------------------------------------------------------
ORACLE

SQL>
SQL> UPDATE XMLCONTENT
2 SET xmlvalue = updateXML(xmlvalue,'/company/NAME/text()','mantisXF')
3 WHERE XMLID = 1
4 AND EXISTSNODE(xmlvalue,'/company[NAME="ORACLE"]') = 1;

1 row updated

SQL> COMMIT;

Commit complete

SQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;

EXTRACT(XMLVALUE,'/COMPANY/NAM
--------------------------------------------------------------------------------
mantisXF

SQL>

ab5669 2008-09-05
  • 打赏
  • 举报
回复
利用Oracle的系统包xmldom, xmlparse的过程可以把XML文件转到Oracle中
oracledbalgtu 2008-09-05
  • 打赏
  • 举报
回复
写过存储过程把xml通过xmltype类型进行解析,然后分别insert到对应的表,思路就是这样了。

[Quote=引用楼主 leiyingw 的帖子:]
我想把XML中的元素写入ORACLE数据库 应该怎么办?有没有简单一点的办法
比如说:
XML

<root>
<company>
<ID>0001 </ID>
<NAME>ORACLE </NAME>
<COUNTRY>
<COUNTRY_CODE>USA </COUNTRY_CODE>
<COUNTRY_CODE>CHINA </COUNTRY_CODE>
<COUNTRY_CODE>UK </COUNTRY_CODE>
</COUNTRY>
</company>
</root>

数据库中有两张表 插入数据后应该是
表…
[/Quote]
sleepzzzzz 2008-09-05
  • 打赏
  • 举报
回复
http://www.oracle.com/technology/global/cn/tech/xml/xmldb/index.html
看看这个连接。
sleepzzzzz 2008-09-05
  • 打赏
  • 举报
回复
XML数据库,专用于存放XML数据的,这个技术ORACLE应该有

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧