(OracleDataAdapter
=
new
OracleDataAdapter
("select
*
from
表","你的连接字符串")){DataTable
dt
=
new
DataTable("表名")adapter.Fill(dt)dt.WriteXml("C:\\xxx.xml")
//导出到C盘}不过Oracle不用SqlDataAdapter——1)右键你的程序“Add
References……”(灰色文件夹),然后添加System.Data.OracleClient。2)在程序中引入“using
System.Data.OracleClient”。3)编码如下:
create table inputfile (filename varchar2(30),
xmlcontent xmltype,
sqlcontent varchar2(3000)
)
create or replace directory TESTFILE as 'D:\work\oralce\'
create or replace procedure alter_table (pi_file_name in varchar2)
is
filehandle utl_file.file_type
filebuffer varchar2(32767)
l_clob clob
doc DBMS_XMLDOM.DOMDocument
CDATA VARCHAR2(3000)
begin
filehandle := utl_file.fopen('TESTFILE',pi_file_name,'R')
IF utl_file.is_open(filehandle) THEN
dbms_output.put_line('file is open!')
END IF
loop
begin
utl_file.get_line(filehandle,filebuffer)
dbms_output.put_line(filebuffer)
l_clob := l_clob||filebuffer
EXCEPTION
WHEN no_data_found THEN
--dbms_output.put_line('EXCEPTION0:'||SUBSTR(SQLERRM, 1, 100))
exit
WHEN OTHERS THEN
dbms_output.put_line('EXCEPTION1:'||SUBSTR(SQLERRM, 1, 100))
end
end loop
--doc := DBMS_XMLDOM.newDOMDocument(xmltype.extract(XMLType(l_clob),'/sqls/sql'))
cdata:=xmltype.extract(XMLType(l_clob),'/sqls/sql').getClobVal()
insert into inputfile(FILENAME, XMLCONTENT,sqlcontent )
values(pi_file_name, XMLType(l_clob),replace(replace(replace(CDATA,'<sql><![CDATA[--',''),']]></sql>',''),'/',chr(10)||'/'||chr(10)))
utl_file.fclose(filehandle)
IF utl_file.is_open(filehandle) THEN
dbms_output.put_line('file is open!')
else
dbms_output.put_line('file is close!')
END IF
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('EXCEPTION2:'||SUBSTR(SQLERRM, 1, 100))
end
/
exec alter_table('myTable.xml')
sql语句会去inputfile.sqlcontent.
循环取出值,然后execute immediate(sql)
稍微做些微调即可。
在oracle中提供了许多内置的程序包,它们用于扩展数据库的功能。在开发应用程序时,可以利用这些程序包。数据库用户sys拥有oracle提供的所有程序包。他们被定义为共有同义词,并将执行权限授予了public用户组,任何用户都可以访问它们。其中DBMS_XMLQUERY包用于将查询结果转换为XML格式,DBMS_LOB程序包包含雨处理大型对象的过程和函数。下面我们看一下DBMS_XMLQUERY和DBMS_LOB的用法:SQL>DECLARE
result CLOB
xmlstr VARCHAR2(32767)
line VARCHAR2(2000)
line_no INTEGER :=1
BEGIN
result :=DBMS_XMLQUERY.getXml('select empno,empname from employee')
xmlstr :=DBMS_LOB.SUBSTR(result,32767)
LOOP
EXIT WHEN xmlstr IS NULL
line :=SUBSTR(xmlstr,1,INSTR(xmlstr,CHR(10)-1))
DBMS_OUTPUT.PUT_LINE(line_no || ':' || line)
xmlstr :=SUBSTR(xmlstr,INSTR(xmlstr,CHR(10)+1))
line_no :=line_no + 1
END LOOP
END
在上面的例子中我们声明了一个CLOB数据类型的result变量,以及VARCHAR2类型的xmlstr和line两个变量。其中,getXml函数用于将查询结果转换为XML格式,SUBSTR函数检索子字符串,32767值指定要从CLOB数据类型读取的最大字节数。检索到的字符串存储xmlstr变量中。LOOP块循环执行,每次从xmlstr中读取一行。INSTR函数返回一个字符串在另一个字符串首次出现的位置。在此,该函数返回换行符在字符串中的位置,直到遇到下一行。
大家觉得例子的结果能不能读出我们预期的结果呢?试试就知道了!!!
结果如下:
<?xml version='1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>E001</EMPNO>
<EMPNAME>Jane</EMPNAME>
</ROW>
<ROW num="2">
<EMPNO>E002</EMPNO>
<EMPNAME>John</EMPNAME>
</ROW>
<ROW num="3">
<EMPNO>E003</EMPNO>
<EMPNAME>Joe</EMPNAME>
</ROW>
</ROWSET>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)