oraclesqlxml
‘壹’ 如何理解Oracle 11g中的XML
【转自网络】
在这篇访谈中,Peasland讨论了为什么他没有大量利用11g中计划的XML升级,并且谈论了这样的一个事实,即他曾经交谈的很多用户都希望下一个版本的PL/sql可以包含一种更好的方式来追踪PL/SQL呼叫栈。Peasland还为那些准备 考取10g的Oracle认证专家考试的人们提出了一些建议,还为数据库新手和老手们,以及想要正确搞定Database 10g的人们提出了一些关键词。 Oracle说他的旗舰数据库管理系统的下一个版本——Oracle Database 11g——包括新的有关XML升级。他们把注意力集中在XML DB上,还包括了一个新的XML二进制数据和新的XML索引。这些种类的更新重要吗?为什么或者为什么不呢?Brian Peasland:我们不能简单地在一个表中查寻一点XML数据,并且与其它的相比又快又简单。通常这样做意味着你必须把数据散开。我从来不喜欢把XML放到数据库里面,我也从来没有必要这么做。我确实知道有些人需 要这样做,并且这样做也对他们特殊的应用程序有意义。 但是他们存储XML更像是有些人在数据库中存储Word文档或者存放.wav文件。他们没有把它作为 以后可供查询的共有数据来存储。他们想要真正地存储XML为完整的文件,不是一段一段的数据。 为什么你提到的那些人要把XML作为完整文件存储? Peasland:例如,新版本的微软Office将会把XML作为它的标准格式。取代原先数据库中使用的Word类型的资本文件格式,也许他 们想要在数据库中将这种新的XML格式作为文档存储。虽然,他们可以运行类似Oracle文本这样的工具来进行快速文档的快速搜索。但是这是一种与我所见 到的一些人想要尝试的方式——他们想要将综合数据,例如员工列表,以XML格式存储在数据库中——完全不同的使用。对我来说,那些代表了项目实体的属性和 数据行应该存储在一个关系表中。 你希望在Database 11g或者其它Oracle的未来版本的数据库管理系统中,PL/SQL发生什么变化? Peasland:许多人这些天都在询问一种更简单的方式来追踪PL/SQL呼叫栈。实话实说,我也不确定为什么,但是我确实遇到了想要这样做 的人。一个家伙不禁想要追踪,还想要能够存储它。DBMS_DEBUG的bug工具已经存在很长一段时间了,用它,你可以追踪你的PL/SQL呼叫栈,但 是它非常难以使用。SQL开发人员已经在这方面进行努力了。但是数据库中有一些这样的东西还是比较好的。 你个人还希望看到什么其它的PL/SQL变化? Peasland:我曾期待的一个变化就是在SQL Server中真的可以让某些事情变得非常简单,但是在Oracle的PL/SQL中就不是这样了。在SQL Server中,我可以做一个存储过程,让它刚好能够吐出那些数据,就好像那是查询自身一样。在Oracle中,为了完成这一点,你必须用特殊的数据类型 作为你的参数然后再把它查询出来。你必须使用Ref游标或者其它类似的什么东西。这有一点麻烦,但是如果你可以做的话,也是不错的。其他的平台允许你这样 做,但是Oracle就不可以。 你对SQL Developer有什么看法,相比较类似产品而言? Peasland:我喜欢SQL Developer的一个原因就是我能够在SQL Developer中做一些快速的查询,方式与在SQL Server中一样。SQL Developer的能力可以解释我的查询的部分内容,但是让人会把他留在那里,留给那些不注释它们的实例再次呼叫,这种一种用于不同测试目标的调试和运 行查询的良好方式——绝对不是用于产品使用,而是一种开发者的工具。 你的网站包括了一些注意文档,用来帮助人们通过Oracle 10g的Oracle认证专家考试。你给那些计划通过考试的人有些什么建议? Peasland:我要告诉大家的一件大事就是,一,阅读有关新特性的文档,因为几乎有关考试的所有内容都在文档中。这非常重要。还有我了解人 们都害怕文档,但是我喜欢这种方式,因为我的大部分问题的答案(作为SearchOracle.com的网站专家)都是从文档中寻找到正确答案的。阅读文档,因为它可以让你熟悉此类事情。另外一件事情就是,练习你学到的,因为当你练习的时候,你就会开始学习一些新特性工作的进出方式。然后,主动尝试去打破 一些东西。很明显,你会希望在测试系统上做这件事情,这个系统只有你可以访问,其他人都无法访问,因为你不想打扰其他任何人的工作。在尝试打破一些东西的 时候,你会学习到新的特性。 你的网站还介绍了一些有关违反策略和保卫Oracle 10g安全的信息。有没有什么好办法可以确保Oracle 10g正常启动? Peasland:有一项针对每个人的策略侵害,即使你是直接在机器外安装Oracle,就是有一些供应的包可以对公众开放,这意味着数据库中 的每个人都可以使用它们。拥有可以使用这些包的能力会导致安全漏洞。例如,有这样的一个包叫做UTL_File。它让存储过程中的某些人可以与数据库所在 的文件系统进行交互。你也许不想要写入文件,因为这样会带来潜在的危险。还有,一些着名的Oracle专家明确指出,像UTL_File这样的东西会让人 们探测数据库。我们听说类似这样的安全漏洞总是存在的,它也不是Oracle独有的。数据库中的用户应该有最低权限的概念,意思是他们应该只拥有完成任务 所需要的最低限度的权限。
‘贰’ 在Oracle表数据和xml文件间相互导入导出的PL/SQL 过程
ORA-31001: 资源句柄或路径名 "F:\oracle\xml\people.xml" 无效
ORA-06512: 在 "SYS.XDBURITYPE", line 11
ORA-06512: 在 "XDB.DBMS_XSLPROCESSOR", line 142
ORA-29280: 目录路径无效
ORA-29280: 目录路径无效
ORA-29280: 目录路径无效
ORA-06512: 在 "XDB.DBMS_XMLPARSER", line 119
ORA-06512: 在 "SYS.XML2DB", line 34
ORA-06512: 在 line 2
问题补充:F:\oracle\xml\people.xml 这个路径没错,的确有
而且在别的过程里面
‘叁’ mybatis里的xml中的写添加的sql语句,怎么使用oracle数据库的序列
--OracleSEQUENCE序列语法:
CREATESEQUENCE序列名
[INCREMENTBYn]
[STARTWITHn]
[{MAXVALUE/MINVALUEn|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHEn|NOCACHE}];
示例:
CREATESEQUENCEsq_test--序列名
INCREMENTBY1--每次加几个
STARTWITH1--从1开始计数
MAXVALUE9999999--最大值9999999
NOCYCLE--一直累加,不循环
NOCACHE;
SELECTsq_test.NEXTVALFROMDUAL;
可以使用sequence的地方:
--不包含子查询、snapshot、VIEW的SELECT语句
--INSERT语句的子查询中
--NSERT语句的VALUES中
--UPDATE的SET中
可以看如下例子:
INSERTINTOtable_nameVALUES(sq_test.nextval,'CLERK',1200,SYSDATE);
‘肆’ 从oracle数据库查询数据生成xml,java解析xml文件的数据批量插入到oracle数据库(用SAX解析)
我自己前段时间写的有事就问
数据库建了一个表study
id student class teacher age 这5个字段
package com.sql.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
//导出数据存入XML
public class ReadDb {
public static void main(String args[]){
//连接数据库
try{
//数据库连接
String url="jdbc:oracle:thin:@10.0.3.18:1521:hxtest18";
String classforname="oracle.jdbc.driver.OracleDriver";
String usename="yong";
String password="password";
Class.forName(classforname);
Connection con=DriverManager.getConnection(url,usename,password);
Statement sta=con.createStatement();
//查询数据
ResultSet result=sta.executeQuery(
"SELECT * FROM study");
//创建根节点
Document document=DocumentHelper.createDocument();
Element studyInfo=DocumentHelper.createElement("studyInfo");
document.setRootElement(studyInfo);
//Element studyInfo=document.addElement("studyInfo");
//当有值时查询
while(result.next()){
//增加每个节点
Element study=studyInfo.addElement("study");
Element id=study.addElement("id");
Element student=study.addElement("student");
Element classe=study.addElement("class");
Element teacher=study.addElement("teacher");
Element age=study.addElement("age");
//将数据库值通过SETTEXT为XML值
id.setText(result.getString("id"));
student.setText(result.getString("student"));
//System.out.println(id.getText());
classe.setText(result.getString("class"));
teacher.setText(result.getString("teacher"));
age.setText(result.getString("age"));
}
//将树导出到文件中:两种输出方法
XMLWriter write=new XMLWriter(new FileOutputStream(new File("studyInfo.xml")));
write.write(document);
write.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
插入数据库,改了几个条件
bookstore.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book has="100">
<bname>数据库</bname>
<price>33.80元</price>
<date>2009-10-1</date>
</book>
<book has="95">
<bname>三国演义</bname>
<price>40.00元</price>
<date>2005-1-7</date>
</book>
<book has="86">
<bname>西游记</bname>
<price>30.00元</price>
<date>2004-3-8</date>
</book>
<cd have="15">
<id>1</id>
<cname>beyound</cname>
<owner>小黎</owner>
</cd>
<cd have="17">
<id>2</id>
<cname>kugou</cname>
<owner>小强</owner>
</cd>
</bookstore>
解析如下
package com.sql.xml;
import java.io.File;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.OutputFormat;
//XML的解析与转换后存入数据库
public class Fenkai {
public static void main(String args[]){
String sql,BNAME=null,PRICE=null,DAT=null;//定义数据库表段
String sqlatt,CNAME=null,ID=null,OWNER=null;
//读取xml文件
SAXReader reader=new SAXReader();
File file=new File("bookstore.xml");
try{
//数据库连接
String url="jdbc:oracle:thin:@10.0.3.18:1521:hxtest18";
String classforname="oracle.jdbc.driver.OracleDriver";
String usename="yong";
String password="password";
Class.forName(classforname);
Connection con=DriverManager.getConnection(url,usename,password);
//解析xml文件
Document document=reader.read(file);
Element root=document.getRootElement();//根节点
System.out.println("输出根节点:"+root.getName());
//下面用迭代得到子节点和孙节点
for(Iterator child=root.elementIterator();child.hasNext();){
Element childEle=(Element)child.next();
System.out.println("子:"+childEle.getName());
System.out.println("孙:");
for(Iterator grand=childEle.elementIterator();grand.hasNext();){
Element grandEle=(Element)grand.next();
System.out.println(grandEle.getName()+"值:"+grandEle.getText());
//转换数据
while(grandEle.getText().equals("数据库")){
grandEle.setText("001");
}
while(grandEle.getText().equals("三国演义")){
grandEle.setText("002");
}
while(grandEle.getText().equals("西游记")){
grandEle.setText("003");
}
while(grandEle.getText().equals("beyound")){
grandEle.setText("004");
}
while(grandEle.getText().equals("kugou")){
grandEle.setText("005");
}
}}
//得到各节点值插入数据库
for(Iterator it= root.elementIterator("book");it.hasNext();){
Element ch=(Element)it.next();
BNAME=ch.elementText("bname");
PRICE=ch.elementText("price");
DAT=ch.elementText("date");
// while(childEle.getName().equals("cd")){}
sql="insert into book values('"+BNAME+"','" +PRICE
+"','"+DAT+"')";
//sql="select * from book";//加入本语句运行不改变数据表
//执行
con.createStatement().executeUpdate(sql);}
for(Iterator itt= root.elementIterator("cd");itt.hasNext();){
Element cht=(Element)itt.next();
CNAME=cht.elementText("cname");
ID=cht.elementText("id");
OWNER=cht.elementText("owner");
sqlatt="insert into cd values('"+CNAME+"','" +ID
+"','"+OWNER+"')";
//sqlatt="select * from cd";
con.createStatement().executeUpdate(sqlatt);}
//将转换后文件存入txt
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("gbk");
XMLWriter writer = new XMLWriter( new FileWriter(new File("bookchange.txt")),format);
writer.write(document);
writer.close();
System.out.println(document.asXML());//打印改变后的树
}catch(Exception e){
e.printStackTrace();
System.out.println("有错啊!");
}
}
}
‘伍’ 如何使用sqlloader导入xml文件到Oracle数据库
在Oracle表数据和xml文件间相互导入导出的PL/SQL过程
学校里要求做个题,题目要求是写出将已知格式xml文件中的数据导入Oracle数据库、把数据库中的数据导出成xml文件的过程。
已知格式xml文件如下:
<?xmlversion="1.0"?>
<PEOPLE>
<PERSONPERSONID="E01">
<NAME>TonyBlair</NAME>
<ADDRESS>10DowningStreet,London,UK</ADDRESS>
<TEL>(061)98765</TEL><FAX>(061)98768</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E02">
<NAME>BillClinton</NAME>
<ADDRESS>WhiteHouse,USA</ADDRESS>
<TEL>(001)640098765</TEL><FAX>(001)640098769</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E03">
<NAME>TomCruise</NAME>
<ADDRESS>57JumboStreet,NewYork,USA</ADDRESS>
<TEL>(001)450067859</TEL><FAX>(001)450067895</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
<PERSONPERSONID="E04">
<NAME>LindaGoodman</NAME>
<ADDRESS>78CraxLane,London,UK</ADDRESS>
<TEL>(061)5456789</TEL><FAX>(061)5456772</FAX>
<EMAIL>[email protected]</EMAIL>
</PERSON>
</PEOPLE>
于是写出过程如下:
--建表
CREATETABLEPEOPLE
(
PERSONIDVARCHAR2(10)PRIMARYKEY,
NAMEVARCHAR2(20),
ADDRESSVARCHAR2(60),
TELVARCHAR2(20),
FAXVARCHAR2(20),
EMAILVARCHAR2(40)
);
--从xml文件载入数据保存到数据库的过程
createorreplaceprocerexml2db(xmlfilevarchar2)as
pxmlparser.Parser;
docxmldom.DOMDocument;
nxmldom.DOMNode;
nlxmldom.DOMNodeList;
lennumber;
--根据PERSON结点生成插入SQL语句的过程
functioninsertsql(nodexmldom.DOMNode)returnvarchar2
is
nxmldom.DOMNode;
nlxmldom.DOMNodeList;
lennumber;
nnmxmldom.DOMNamedNodeMap;
isqlvarchar2(200);
begin
--取得PERSON结点所有属性
nnm:=xmldom.getAttributes(node);
isql:='insertintopeoplevalues(';
isql:=isql||'''';
--取得所有属性中的第一个属性,即"PERSONID",并拼接到SQL语句中
isql:=isql||xmldom.getNodeValue(xmldom.item(nnm,0));
isql:=isql||'''';
--取得PERSON结点下的所有结点,准备遍历
nl:=xmldom.getChildNodes(node);
len:=xmldom.getLength(nl);
foriin0..len-1loop
--取出第i个结点
n:=xmldom.item(nl,i);
isql:=isql||',';
isql:=isql||'''';
--将结点的文本值取出并拼接到SQL语句中
isql:=isql||xmldom.getNodeValue(xmldom.getFirstChild(n));
isql:=isql||'''';
endloop;
isql:=isql||')';
returnisql;
endinsertsql;
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表的内容
deletefrompeople;
foriin0..len-1loop
--取出第i个PERSON元素
n:=xmldom.item(nl,i);
--执行插入该PERSON元素所用的SQL语句
executeimmediateinsertsql(n);
endloop;
commit;
xmldom.freeDocument(doc);
endxml2db;
/
--将数据库中的数据导出成xml文件的过程
createorreplaceproceredb2xml(xmlfilevarchar2)as
docxmldom.DOMDocument;
retxmldom.DOMNode;
peoplenodexmldom.DOMNode;
--遍历整个people表的游标
-------------
--将people表中一行记录转换为元素
--并插入到DOM文档对像根结点PEOPLE下的过程
procereaddperson(docxmldom.DOMDocument,peoplexmldom.DOMNode,
v_pidvarchar2,v_namevarchar2,v_addrvarchar2,
v_telvarchar2,v_faxvarchar2,v_emailvarchar2)
is
personelemxmldom.DOMElement;
personnodexmldom.DOMNode;
itemelemxmldom.DOMElement;
itemnodexmldom.DOMNode;
textxmldom.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));
endaddperson;
begin
--创建一个新DOM文档对像
doc:=xmldom.newDOMDocument;
--为文档添加根结点PEOPLE
peoplenode:=xmldom.makeNode(xmldom.createElement(doc,'PEOPLE'));
ret:=xmldom.appendChild(xmldom.makeNode(doc),peoplenode);
--使用游标遍历people中的每行,生成每一行对应的PERSON元素并添加到PEOPLE根结点中
forv_rowincur_peopleloop
addperson(doc,peoplenode,v_row.personid,v_row.name,
v_row.address,v_row.tel,v_row.fax,v_row.email);
endloop;
--将结果写入指定文件
xmldom.writeToFile(doc,xmlfile);
xmldom.freeDocument(doc);
enddb2xml;
‘陆’ 用xml如何同时配置两个数据库sql server和oracle呢,求实例参考,相关博文链接
这个自己定义一个事务就行了。
咱们一般平时开发的时候,可能很少定义事务。
经常使用默认的SQLCA,这个SQLCA都是 你连接的主数据库,同样的,你在定义一个transaction,连接的参数,参照SQLCA的参数,把参数都设置成另一个数据库,就可以了。
‘柒’ oracle的PL/SQL中如何根据节点名称直接获取xml某个节点的值
用XPath比较简单点.也可以用xmldom.
xmltype('<?xml version="1.0" encoding="GBK"?>
<SERVICE>
<IDA_SVR_USERBILL>
<CALL_METHOD>queryProcessStepList</CALL_METHOD>
</IDA_SVR_USERBILL>
</SERVICE>').extract('//CALL_METHOD/child::text()').getstringval()
测试:
SELECT xmltype('<?xml version="1.0" encoding="GBK"?>
<SERVICE>
<IDA_SVR_USERBILL>
<CALL_METHOD>queryProcessStepList</CALL_METHOD>
</IDA_SVR_USERBILL>
</SERVICE>').extract('//CALL_METHOD/child::text()').getstringval()
FROM al;
如果要xmldom
你可以参考我这个报表的写法:
http://www.skyz.cn/?p=364