我想把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#
比如说:
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#
解决方案 »
- sql查询上半年最后一天
- [C#]关于一个反射的问题。
- 我写了两个组件,一个组件A从网络上接收数据,另一个组件B把A接收到的数据显示成曲线。B怎样才能读取A的数据?
- 如何更改数据窗体向导生成的datagrip的列名
- .NET remoting的一点疑问
- 我把那个预编译头选成“不使用预编译头”还是有错误啊 提示
- 求助串口通信中十六进制转换byte的问题,网上搜的好多都不行。
- c/s系统,如何防止用户直接连到数据库修改数据
- 如果将ASCII转换成字符串
- 请问怎样用C#产生一系列的随机书??????
- 改进的Hough circle detect 方法
- 24-08-2008 换成 2008-08-24. 怎么替换?
<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 insertedSQL> COMMIT;Commit completeSQL> SQL> SELECT EXTRACTVALUE(xmlvalue,'/company/COUNTRY/COUNTRY_CODE[1]')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXTRACTVALUE(XMLVALUE,'/COMPAN
--------------------------------------------------------------------------------
USASQL>
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
--------------------------------------------------------------------------------
USASQL>
SQL> SELECT existsNode(xmlvalue, '/company/COUNTRY[COUNTRY_CODE="USA"]')
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXISTSNODE(XMLVALUE,'/COMPANY/
------------------------------
1SQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/@CID').getNumberVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/@CI
------------------------------
1SQL>
SQL> SELECT extract(xmlvalue, '/company/COUNTRY/COUNTRY_CODE[1]/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/COU
--------------------------------------------------------------------------------
USASQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/NAM
--------------------------------------------------------------------------------
ORACLESQL>
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 updatedSQL> COMMIT;Commit completeSQL>
SQL> SELECT EXTRACT(XMLVALUE,'/company/NAME/text()').getStringVal()
2 FROM XMLCONTENT
3 WHERE XMLID = 1;EXTRACT(XMLVALUE,'/COMPANY/NAM
--------------------------------------------------------------------------------
mantisXFSQL>