1)Oracleデータ・ディクショナリ・パス導出されるパラメータ(オプション)を設定
シャットダウン即時
ALTER SYSTEM SET UTL_FILE_DIR = 'は/ opt /オラクル/ UTL'スコープ= SPFILE;
dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora'、dictionary_locationに=> '/ OPT /オラクル/ UTL')を実行します。
起動
2)、分析するREDOログ・ファイルを(オンライン・アーカイブが可能です)増加
DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / REDO01.LOG'、オプション=> dbms_logmnr.new)を実行します。
DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / redo02.log'、オプション=> dbms_logmnr.new)を実行します。
DBMS_LOGMNR.ADD_LOGFILE(ログファイル名=> '/ OPT /オラクル/ OraBase / oradataに/ inomc / redo03.log'、オプション=> dbms_logmnr.new)を実行します。
3)実行ログローディング
データ・ディクショナリを使用します
DBMS_LOGMNR.START_LOGMNR(DictFileName => '/opt/oracle/utl/logminer_dict.ora')を実行します。
オンライン辞書を使用してください
(オプション=> dbms_logmnr.DICT_FROM_ONLINE_CATALOG)DBMS_LOGMNR.START_LOGMNRを実行します。
4)ログの表示
五$ LOGMNR_CONTENTS FROM SQL_REDOを選択します。
5)分析が終了し、アンインストールログは
DBMS_LOGMNR.END_LOGMNRを実行します。
PL / SQLでのXMLの使用では、Oracleは、開発者が容易にXML技術を活用することができ、いくつかのコンポーネントを提供します。これらのコンポーネントが含まれます:
1.XML解析プログラムを。これは、分析構築し、XML文書を検証するために使用しました。
2.XPathエンジン。それは、XPathを使用している(XML標準の別の要素)は、メモリ内のXML文書を検索するためのユーティリティの構文を示しています。SLTプロセッサ。それはあなたが他の形式にXML文書を変換することを可能にするOracleデータベースでXSLTをサポートしています。
3.XML SQLユーティリティ。あなたは簡単にOracleデータベースのテーブルにXMLベースのデータを挿入することができますので、あなたは、XML文書を生成するためにSQLを使用することができます。
PL / SQL Developerの、XMLパーサーは、最も重要な要素です。それを使用すると、Oracleデータベース内の分析操作およびXML文書を変換することができます。XML解析プログラムは、API(アプリケーションプログラミングインターフェイス)のセットで構成されています。
================================================== ================================================== ================================================== =============================
XMLは、生成し
、次のように、Test.xmlをを生成します
1
2
3
4
5
6
7
8
9
10
|
<
staff
content = "name and id">
<
member
>
<
name
>Arwen</
name
>
<
eno
>123</
eno
>
</
member
>
<
member
>
<
name
>Tom</
name
>
<
eno
>456</
eno
>
</
member
>
</
staff
>
|
PLSQLコードXMLの1世代。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
declare
doc XMLDOM.DOMDOCUMENT;
doc_node XMLDOM.DOMNODE;
root_node XMLDOM.DOMNODE;
user_node XMLDOM.DOMNODE;
item_node XMLDOM.DOMNODE;
root_elmt XMLDOM.DOMELEMENT;
user_elmt XMLDOM.DOMELEMENT;
item_elmt XMLDOM.DOMELEMENT;
item_text XMLDOM.DOMTEXT;
begin
doc := XMLDOM.NEWDOMDOCUMENT;
xmldom.setVersion(doc,
'1.0'
);
xmldom.setCharset(doc,
'UTF-8'
);
--根节点
doc_node := XMLDOM.MAKENODE(doc);
root_elmt := XMLDOM.CREATEELEMENT(doc,
'staff'
);
XMLDOM.SETATTRIBUTE(root_elmt,
'content '
,
'name and id'
);
root_node:=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(root_elmt));
--节点1
user_elmt := XMLDOM.CREATEELEMENT(doc,
'member'
);
user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'name'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,
'Arwen'
);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'eno'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,
'123'
);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
--节点2
user_elmt := XMLDOM.CREATEELEMENT(doc,
'member'
);
user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'name'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,
'tom'
);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'eno'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,
'456'
);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
--写入操作系统文件中
XMLDOM.WRITETOFILE(doc,
'DIR'
||
'\Test.xml'
);
--注意必须先创建一个文件目录dir
--可以通过语句 : create or replace directory dir as 'd:\temp'
XMLDOM.FREEDOCUMENT(doc);
end
;
|
2.将xml encode 成clob 写入文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
declare
l_f utl_file.file_type;
clobpart varchar2(2048);
offset
integer
;
l_xmltype XMLTYPE;
cloblen
integer
;
response_clob CLOB;
resp_domdoc DBMS_XMLDOM.DOMDOCUMENT;
begin
l_f := utl_file.fopen(
'TEST_DIR'
,l_full_file_name,
'w'
);
utl_file.put_line(l_f,
'<?xml version="1.0" encoding="utf-8" standalone="yes"?>'
||chr(13));
resp_domdoc := SoapEncPrcnScnrPckgRead.encd_root_prcn_scnr_pckg_read(p_psp_resp_doc);
l_xmltype := dbms_xmldom.getXmlType(resp_domdoc);
dbms_xmldom.freeDocument(resp_domdoc);
response_clob := l_xmltype.getClobVal;
cloblen := LENGTH(response_clob);
while offset < cloblen
loop
clobPart := dbms_lob.substr(response_clob, 1024, offset);
utl_file.put(l_f, clobPart);
offset := offset + 1024;
end
loop;
utl_file.fflush(l_f);
utl_file.fclose(l_f);
end
;
/
|
3.结合使用XMLDOM和utl_file
这样生成XML文件非常方便,能满足一般的应用了.但是XMLDOM有个缺点,就是一次性在内存中生成所有xml文件内容,然后写入到磁盘文件中.如果 xml文件太大,比如说有个table有几个G,想把它保存成xml文件.这样可能就会出现内存不足,生成文件失败.那该咋整呢?
可能首先想到的是用UTL_FILE去生成文件.
里面的内容全部手动写成xml格式的,然后保存成xml后缀的文件.这样确实可行.但有个麻烦问题时如果一些节点内容含有xml的五个保留字符的话 (&,<,>,'," 分别是和号,小于号,大于号,单引号,双引号),我们如果以文本方式打开xml文件是看不到节点内容里面有这些保留字的,都转换成了对应 的&, >, <, &apos, ".节点指定的是上面的Arwen或123,假如有名字(A&r<w>e'n")则保存到xml文件中应该改成 (A&r>w<e&aposn").如果用xmldom会默认去转换,不用我们管了.如 果用UTL_FILE必须手动写代码去转换.
假如有表staff(name varchar2(30), eno integer),里面有几个G的内容,要转换成开头讲的那种格式的xml文件。
--生成xml的代码其中XML文件的头和尾用UTL_FILE直接写入文件中,节点内容用xmldom生成,然后写到clob变量中,再把clob变量值用utl_file写入到xml文件中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
declare
STAFFINFO UTL_FILE.FILE_TYPE;
v_temp clob;
cursor
c_table_info
is
select
name
,eno
from
staff;
v_name varchar2(30);
v_eno
integer
;
doc XMLDOM.DOMDOCUMENT;
doc_node XMLDOM.DOMNODE;
root_node XMLDOM.DOMNODE;
user_node XMLDOM.DOMNODE;
item_node XMLDOM.DOMNODE;
root_elmt XMLDOM.DOMELEMENT;
user_elmt XMLDOM.DOMELEMENT;
item_elmt XMLDOM.DOMELEMENT;
item_text XMLDOM.DOMTEXT;
begin
--xml header
STAFFINFO :=utl_file.fopen_nchar(
'DIR'
,
'Test.xml'
,
'W'
,32767);
--跟前面说的一样必须先创建一个directory才行
UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,
'<staff content = "name and id">'
);
UTL_FILE.FFLUSH(STAFFINFO );
--直接写入到磁盘文件中,不会停留在内存中
UTL_FILE.FCLOSE(STAFFINFO );
open
c_table_info;
loop
fetch
c_table_info
into
v_name,v_eno;
exit
when
c_table_info%notfound;
--XML节点
doc := XMLDOM.NEWDOMDOCUMENT;
xmldom.setCharset(doc,
'UTF-8'
);
doc_node := XMLDOM.MAKENODE(doc);
user_elmt := XMLDOM.CREATEELEMENT(doc,
'member'
);
user_node :=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(user_elmt));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'name'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,v_name);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
item_elmt :=XMLDOM.CREATEELEMENT(doc,
'eno'
);
item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt));
item_text := XMLDOM.CREATETEXTNODE(doc,
'eno'
);
item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text));
v_temp :=
' '
;
--写入到临时变量v_temp中
XMLDOM.WRITETOCLOB(doc,v_temp);
STAFFINFO :=utl_file.fopen_nchar(
'DIR'
,
'Test.xml'
,
'A'
,32767);
--以a模式会在文件后添加内容,用w会覆盖之前的内容
UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,v_temp);
UTL_FILE.FFLUSH(STAFFINFO );
UTL_FILE.FCLOSE(STAFFINFO );
XMLDOM.FREEDOCUMENT(doc);
end
loop;
close
c_table_info;
--xml tail
STAFFINFO :=utl_file.fopen_nchar(
'DIR'
,
'Test.xml'
,
'a'
,32767);
UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,
'</staff>'
);
UTL_FILE.FFLUSH(STAFFINFO );
UTL_FILE.FCLOSE(STAFFINFO );
end
;
|