-- PACKAGE OF DBMS_SQL 游标执行流程
--
-- -----------
-- | open_cursor |
-- -----------
-- |
-- |
-- v
-- -----
-- ------------>| parse |
-- | -----
-- | |
-- | |---------
-- | v |
-- | -------------- |
-- |-------->| bind_variable | |
-- | ^ ------------- |
-- | | | |
-- | -----------| |
-- | |<--------
-- | v
-- | query?---------- yes ---------
-- | | |
-- | no |
-- | | |
-- | v v
-- | ------- -------------
-- |----------->| execute | ->| define_column |
-- | ------- | -------------
-- | |------------ | |
-- | | | ----------|
-- | v | v
-- | -------------- | -------
-- | ->| variable_value | | ------>| execute |
-- | | -------------- | | -------
-- | | | | | |
-- | ----------| | | |
-- | | | | v
-- | | | | ----------
-- | |<----------- |----->| fetch_rows |
-- | | | ----------
-- | | | |
-- | | | v
-- | | | --------------------
-- | | | | column_value |
-- | | | | variable_value |
-- | | | ---------------------
-- | | | |
-- | |<--------------------------
-- | |
-- -----------------|
-- |
-- v
-- ------------
-- | close_cursor |
-- ------------
--
---------------
-------------
/************************************************************************************************************
存储过程名称:up_exptoxml
参数1:XMLfilepath in varchar2 接收将要生成的文件名(可带路径)
参数2:sqlQuery in varchar2 接收用户输入的查询字符串,默认值为:"select * from stockmarket"
参数3:flag in varchar2 标志位,说明第二个参数的来源(即由用户输入还是来自于文件)默认值:
"sql",即由用户输入
使用方法:
1、默认方式:exec up_exptoxml(xmlfilepath) //将stockmarket表中的数据全部取出
保存到参数xmlfilepath指定的文件中
2、用户指定查询语句方式:
//将用户指定的查询语句所生成的结果集保存到参数xmlfilepath所指定的文件中
1)exec up_exptoxml(xmlfilepath,'select stockname,buydate from stockmarket')
//如果用户认为查询语句过长,直接输入不方便,也可以将语句保存成*.txt文件,
//存储过程执行方式如下:
2)exec up_exptoxml(xmlfilepath,'filepath,filename','file');
该方式下存储过程将指定目录,指定文件中的sql语句读出并执行,将所生成的结果集保存到参数xmlfilepath
所指定的文件中
功能:按照用户要求将查询结果保存为xml文件
************************************************************************************************************/
create or replace procedure up_exptoxml(XMLfilepath in varchar2, sqlQuery varchar2:='select * from stockmarket',flag varchar2:='sql') is
sqlstr_from_file clob;--保存sql查询字符串
document xmldom.DOMDocument;--文档对象
rootelement xmldom.DOMElement;--根元素
stockRecord xmldom.DOMElement;--记录
stockfield xmldom.DOMElement;--字段
l_cursor integer;--存储游标变量返回值
l_col_cot integer;--游标所包含的列数
l_desc_tab dbms_sql.desc_tab;--定义desc_tab类型的集合
tempfield dbms_sql.Varchar2_Table;--定义Varchar2_Table类型的集合
tempdate dbms_sql.Date_Table;--定义Date_Table类型的集合
tempnode xmldom.DOMNode;--定义临时节点
text xmldom.DOMText;--定义文本节点
executenum integer;--存储游标执行返回值
--fieldvalue varchar2(50);
sqlfile utl_file.file_type;
parameter exception;--自定义异常
begin
if upper(flag)<>'SQL'and upper(flag)<>'FILE' then
raise parameter;--如果flag参数不为上述两个选项,则抛出参数异常
elsif upper(flag)='SQL' then
sqlstr_from_file:=sqlQuery;
else
--调用存储过程以读取文件中存放的sql查询字符串
readFile(sqlQuery,sqlstr_from_file);
end if;
l_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(l_cursor,sqlstr_from_file,dbms_sql.native);--解析游标
dbms_sql.describe_columns(l_cursor,l_col_cot,l_desc_tab);--获取列描述信息
for def in 1..l_col_cot loop
if l_desc_tab(def).col_type=1 then
tempfield(def):='';--初始化集合元素
dbms_sql.define_column(l_cursor,def,tempfield(def),50);--定义列
else
tempdate(def):=sysdate;--初始化集合元素
dbms_sql.define_column(l_cursor,def,tempdate(def));--定义列
end if;
end loop;
executenum:=dbms_sql.execute(l_cursor);--执行游标
document:=xmldom.newDOMDocument;--生成文档对象
rootelement:=xmldom.createElement(document,'StockTable');--生成根元素
loop--循环结果集(列方向)
if dbms_sql.fetch_rows(l_cursor)>0 then
stockrecord:=xmldom.createElement(document,'Stock');--建立临时记录元素
for i in 1..l_col_cot loop--(循环列,行方向)
stockfield:=xmldom.createElement(document,l_desc_tab(i).col_name);--建立字段元素
if l_desc_tab(i).col_type=1 then--col_type=1 表示varchar2类型
--dbms_sql.define_column(l_cursor,i,tempfield(i),50);
dbms_sql.column_value(l_cursor,i,tempfield(i));
text:=xmldom.createTextNode(document,tempfield(i));
else --col_type=12 表示date类型
--dbms_sql.define_column(l_cursor,i,tempdate(i));
dbms_sql.column_value(l_cursor,i,tempdate(i));
text:=xmldom.createTextNode(document,to_char(tempdate(i),'yyyy-mm-dd HH24:MI:SS'));
end if;
--将文本节点添加到字段节点
tempnode:=xmldom.appendChild(xmldom.makeNode(stockfield),xmldom.makeNode(text));
--将字段节点添加到记录节点
tempnode:=xmldom.appendChild(xmldom.makeNode(stockrecord),xmldom.makeNode(stockfield));
end loop;
--将记录节点添加到根节点
tempnode:=xmldom.appendChild(xmldom.makeNode(rootelement),xmldom.makeNode(stockrecord));
else
--no more row to copy
dbms_sql.close_cursor(l_cursor);--遍历游标结束,关闭游标
exit;
end if;
end loop;
--将根节点添加到文档
tempnode:=xmldom.appendChild(xmldom.makeNode(document),xmldom.makeNode(rootelement));
xmldom.setVersion(document,'1.0');
xmldom.writeToFile(document,XMLfilepath);
exception
when parameter then
raise_application_error(-20004,'必须以"sql"或者"file"方式指定sql语句的来源');
when others then
if dbms_sql.is_open(l_cursor) then
dbms_sql.close_cursor(l_cursor);
end if;
raise_application_error(-20005,'未知异常,游标已关闭!');
end up_exptoxml;
/
分享到:
相关推荐
在给定的例子中,使用了`XMLTable`函数来解析XML文档,并从中提取出所需的`id`和`name`字段信息。 ##### 示例一:本地XML数据转换 ```sql INSERT INTO jobs (id, name) SELECT channel.id, channel.name FROM ...
此函数用于提取XML文档中指定节点的值。 - **语法**: ```sql EXTRACT(XMLTYPE_instance, XPath_string[, namespace_string]) ``` - **参数**: - `XMLTYPE_instance`:XML数据类型的字段或变量。 - `XPath_...
1. 创建XMLType表:Oracle支持XMLType数据类型,可以直接存储XML文档。创建一个XMLType表,将XML数据作为列存储。 ```sql CREATE TABLE xml_table ( id NUMBER PRIMARY KEY, xml_data XMLTYPE); ``` 2. 解析XML...
4. **遍历XML文档**: - 使用`xmldom.getElementsByTagName()`方法获取所有名为`Stock`的元素。 - 对每个`Stock`元素执行循环操作,提取其中的子节点数据(如股票代码、名称等),并将其转换为相应的Oracle数据库...
在给定的部分内容中,提供了一个名为`add_to_stockmarket`的过程,其功能是从指定的XML文件中读取数据,并将这些数据插入到名为`Stockmarket`的表中。 ##### 过程实现步骤 1. **初始化DOM文档对象**:通过`xml...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Oracle数据库环境中解析XML文档。具体来说,文中提供了一个存储过程的例子,用于演示如何提取XML数据,并将其存储到Oracle表中。...
5. **XQuery和XPath**:XQuery是一种强大的查询语言,用于从XML文档中提取数据。XPath则是用于定位XML文档中节点的语言,是XQuery的基础。Oracle数据库支持XQuery和XPath,允许用户以声明式方式查询和操作XML数据。 ...
4. 遍历XML文档,找到PERSON元素,并提取其子元素的值,然后将这些值插入到PEOPLE表中。 这个存储过程展示了如何在Oracle数据库中操作XML数据的基本步骤。在实际应用中,可能需要根据XML文件的具体结构和业务需求...
1. **XML类型**:Oracle提供了XMLType数据类型,可以直接在数据库中存储XML文档。这使得XML数据可以像关系数据一样被查询、更新和索引,同时保持其原有的结构和语义。 2. **XMLDB(XML Database)**:Oracle XMLDB...
Oracle BI Publisher的核心功能在于它能够通过数据模型从不同的数据源(如数据库、XML文件、Web服务等)提取数据,并使用XML作为中间格式进行处理。Report Builder是BI Publisher中的一个组件,用于构建数据模型,它...
以`table_test1`为例,该表用于存储从XML文件中解析出的数据字段,具体表结构如下: ```sql CREATE TABLE table_test1 ( freport_id VARCHAR2(40) NOT NULL, freport_no VARCHAR2(100) NOT NULL, freport_date ...
在Oracle数据库管理中,有时我们需要将XML文件中的数据有效地导入到数据库中,这可以通过使用存储过程来实现。本文将详细讲解如何使用Oracle存储过程完成这一任务,并提供源代码和相关截图辅助理解。 首先,理解XML...
本篇文章将详细介绍如何使用Java来实现从Oracle数据库中提取数据并将其转换为XML文件。 首先,我们需要连接到Oracle数据库。这通常通过JDBC(Java Database Connectivity)实现。JDBC是Java平台的标准接口,允许...
这些函数可以用于处理 XML 数据,例如从 XML 文档中提取数据、更新 XML 文档、检查 XML 文档是否存在某个节点等。 下面是 Oracle 中的一些常用的 XML 函数: 1. EXTRACT 函数 EXTRACT 函数用于从 XML 文档中提取...
2. **XMLType**: XMLType是Oracle中的核心数据类型,用于存储XML文档。它可以以纯文本或BINARY XML形式存在,后者提供更快的查询速度。XMLType支持XML Schema验证,确保数据的准确性和一致性。 3. **XQuery**: ...
这些索引可以是基于路径的、基于结构的或基于内容的,有助于快速定位XML文档中的特定元素。 4. **XMLTable**: 这是一个SQL构造,允许用户将XML文档中的数据作为表格来查询。通过定义XMLTable,可以将XML数据映射到...
例如,可以使用 extract() 方法来提取 XML 文件中的数据,也可以使用 transform() 方法来将 XML 文件转换为其他格式。 在上面的代码中,我们首先创建了一个 Oracle 表,并将其设置为存储 XML 文件。然后,我们使用 ...
3. **EXTRACT**: 从XML文档中提取特定值,返回单个元素或属性的字符串值。 4. **EXTRACTVALUE**: 类似于EXTRACT,但只能用于获取单个值,不返回XML片段。 5. **XMLserialize**: 序列化XML数据,将其转换为字符串或...