??xml version="1.0" encoding="utf-8" standalone="yes"?>激情五月综合综合久久69,久久综合久久综合久久综合,久久免费视频6http://www.shnenglu.com/ivenher/category/2686.htmlzh-cnMon, 19 May 2008 21:51:54 GMTMon, 19 May 2008 21:51:54 GMT60OTL性能http://www.shnenglu.com/ivenher/articles/39973.html爱饭?/dc:creator>爱饭?/author>Sat, 29 Dec 2007 16:18:00 GMThttp://www.shnenglu.com/ivenher/articles/39973.htmlhttp://www.shnenglu.com/ivenher/comments/39973.htmlhttp://www.shnenglu.com/ivenher/articles/39973.html#Feedback1http://www.shnenglu.com/ivenher/comments/commentRss/39973.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/39973.html今天在做一个程序性能提升时发现otl_stream.W一个参数buffer size Ҏ能影响很大,以下是几个测试数?
参? http://otl.sourceforge.net/otl3_stream_class.htm
50   2.06
<1:536704> 18:31:58.068 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:536704> 18:34:04.713 [00001] There are 3612066 records is loaded!

100 1.38
<1:2085112> 18:36:23.727 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:2085112> 18:38:01.923 [00001] There are 3612066 records is loaded!
1.23
<1:2085112> 18:38:06.941 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:2085112> 18:39:29.849 [00001] There are 3612066 records is loaded!

200  1.02
<1:1499250> 18:41:47.711 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1499250> 18:42:49.300 [00001] There are 3612066 records is loaded!
<1:1499250> 18:42:54.312 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1499250> 18:43:53.717 [00001] There are 3612066 records is loaded!
500  0.43
<1:1978536> 18:45:57.790 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1978536> 18:46:40.685 [00001] There are 3612066 records is loaded!
<1:1978536> 18:45:09.982 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1978536> 18:45:52.787 [00001] There are 3612066 records is loaded!
1000  0.35
<1:1597632> 18:47:42.973 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1597632> 18:48:17.715 [00001] There are 3612066 records is loaded!
<1:1597632> 18:48:22.718 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1597632> 18:49:01.119 [00001] There are 3612066 records is loaded!
<1:1597632> 18:51:17.837 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1597632> 18:51:24.416 [10001] Signal 31 recieved.
<1:1597632> 18:49:49.976 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:1597632> 18:50:28.192 [00001] There are 3612066 records is loaded!

2000  0.34
<1:2883830> 18:51:47.365 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:2883830> 18:52:21.163 [00001] There are 3612066 records is loaded!
<1:2883830> 18:52:26.166 [00001] The load SQL is [select USER_NUMBER from dr_gsm_931_20050831 where 1=1 ]
<1:2883830> 18:53:01.576 [00001] There are 3612066 records is loaded!

另外,~译时定?a >OTL_STREAM_POOLING_ON 也会Ҏ能有所提升.
参? http://otl.sourceforge.net/otl3_ex113.htm


]]>
oracle-plsql 异常处理Q?4 Q?http://www.shnenglu.com/ivenher/articles/14133.html爱饭?/dc:creator>爱饭?/author>Wed, 25 Oct 2006 08:26:00 GMThttp://www.shnenglu.com/ivenher/articles/14133.htmlhttp://www.shnenglu.com/ivenher/comments/14133.htmlhttp://www.shnenglu.com/ivenher/articles/14133.html#Feedback1http://www.shnenglu.com/ivenher/comments/commentRss/14133.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/14133.html 异常处理

 

当异常生成之后,E序被中止,控制权交l异常处理模块,异常处理模块捕获当前异常句柄Qƈ交由相应的程序处理;如果Q异怿里模块没有捕捉到异常句柄Q那么它被传输到当前程序的外围?/span>

 

除非׃些特D的要求Q一般情况下异常再当前E序的异常处理模块中被处理。异常处理模块以 EXCEPTION 开?/span> END; l尾?/span>

       Declare

              /*………?/

       begin

              /*………?/

       exception

              when /* 异常名称 */

              then /* 异常处理 */

              when other

              then /* 异常处理 */

       end;

异常处理模块的语法基本上?/span> CASE 一_凡是?/span> when 中有定义的异帔R被处理Q而没有的则被传输。一个特D的异常处理语句?/span> WHEN OTHERS 。就惛_Q?/span> 3 Q中所说的Q它会处理所有ؓ被处理的异常Q因此必d心用它Q最好是在最外层的程序中。当然如果喜Ƣ偷懒的Q大可以在异常处理模块中只放一?/span> OTHERS 。注意,无论哪种情况Q?/span> OTHERS 只能q只在异常处理的最后一位?/span>

 

有趣的是Q可以在一?/span> when 中处理多个异常句柄?/span>

       Exception

              When no_data_found or invalid_employee_id or dbms_ldap.invalid session

              Then /*……?.*/

       End;

       /

在这个例子里Q有标准包的异常、自定义异常和非标准包中的异常。这些异常只能用 or q接Q不可以?/span> and Q因为只有一个异常能够生成?/span>

 

?/span> raise_application_error 生成的异常,如果没有被处理而一直传递到pȝ环境中,那么环境视情况作出相应的反映。在 sqlplus 中, oracle 回滚所?/span> DML Ҏ据所做的修改。在 sqlplus 环境中,因ؓ有自动回滚的存在Q我们可以保留出现未被处理的异常的可能性;而在另外的一些环境中Q则需要仔l设计最外层E序?/span>

ü         捕捉M有可能传出的异常?/span>

ü         记录错误以便于分析?/span>

ü         l外部环境一个信息,以便于其作出相应的处理?/span>

 

对于自定义异常,因ؓ sqlcode 值永q是 1 Q所以当它被传出Ӟ如果外围E序中没有定义相同名U的异常Q我们将不知道是什么异生了。因此,不要自定义异常传递出厅R?/span>

 

在程序中处理几个互相独立的操作时Qؓ了避免出现因Z个操作生异常而整个E序被中断的情况Q有必要这些独立的操作攑֜各自的虚拟块中?/span>

       Procedure change_data is

       Begin

              Begin

                     Delete from employee where ?.

              Exception

                     When others then null;

              End;

 

              Begin

                     Update company set …?

              Exception

When others then null;

              End;

 

              Begin

                     Insert into company_history select * from company where ?

              Exception

                     When others then null;

              End;

       End;

       /

 

 

Pl/sql 提供了一些内建的函数来帮助我们确定、分析异常?/span>

 

SQLCODE

q个函数在前面有提到q,它是一个用于返回当前模块中最q一ơ异常值的函数Q或者说是非入栈E序的异常倹{打个比方:如果在当前程序的异常模块中调用了另一个程序, oracle 当前程序及相应的环境变量(包括异常|压入pȝ栈;在被调用E序中生成了一个gؓ 1 的异常,那么 sqlcode 返?/span> 1 Q之后刚才的E序出栈Q?/span> sqlcode q回当前异常倹{需要注意的是,不要在异常模块之外用它Q这样不会有M意义。当没有异常或在异常模块之外使用Ӟ SQLCODE q回 0 Q返回?/span> 1 是指自定义异常?/span>

 

SQLERRM

接收异常|q回相应的长度不过 512 字节的描q语。如果没有传入异常|则返回当前异常描q?/span>

       Begin

              Dbms_output.put_line( sqlerrm(-1403);

       End;

Sql>/

Ora-1403: no data found

在需要体构长度超q?/span> 512 字节的描q时Q?/span> oracle 使用 dbms_utility.format_error_stack 。显Ӟ用这个函数来判断一个异常是否ؓpȝ异常是很有用的,如果不是的话Q将q回以下两种情况的一U?/span>

如果是一个负敎ͼ

       ora-nnnnn: message not found,; product=rdbms; facility=ora

如果是一个正敎ͼ

       -nnnnn: non-oracle exception

 

DBMS_UTILITY.FORMAT_ERROR_STACK

q回当前异常相应的描qͼ没有字符长度限制。与 SQLCODE 相同的是Q必d异常处理模块中用。虽然名UC有一?/span> stack 在,但通过它ƈ不能知道异常的最初生成处Q需要的话就必须使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE ?/span>

 

DBMS_UTILITY.FORMAT_ERROR_BACKTRACE

pȝ为最q一ơ生成的异常讄了一个栈Qƈ跟踪它的传递过E,而这个函C用这个栈Q然后返回该异常的整个传递过E。这个函数对错误的定位和实施下一步处理v着臛_重要的作用?/span>

       Create or replace procedure procl is

       Begin

              Dbms_output.put_line(‘running proc1?;

              Raise no_data_found;

       End;

       /

       create or replace procedure proc2 is

       begin

              dbms_output.put_line(‘calling proc1?;

              proc1;

       end;

       /

       create or replace procedure proc3 is

       begin

              dbms_output.put_line(‘calling proc2?;

              proc2;

       exception

              when no_data_found

              then

                     dbms_output.put_line(‘error stack at top level?;

                     dbms_output.put_line(dbms_utility.format_error_backtrace);

       end;

       /

现在可以q行 proc3 来看看结果?/span>

Sql>set serveroutput on;

Sql>begin

2                         dbms_output.put_line(‘proc3->proc2->proc1 backtrace?;

3                         proc3;

4     end;

5     /

    Proc3 -> Proc2 -> Proc1 backtrace

    calling proc2

    calling proc1

    running proc1

    Error stack at top level:

    ORA-06512: at "SCOTT.PROC1", line 4

    ORA-06512: at "SCOTT.PROC2", line 5

ORA-06512: at "SCOTT.PROC3", line 4

事实上,每次异常的生都重|这个异常栈Q只是最后一ơ从pȝ栈出栈的是最外层的程序块Q所以可以清楚地看到异常生成的整个过E。上面这个程序的执行q程是这LQ首先用 put_line 打印 Proc3 -> Proc2 -> Proc1 backtrace Q?/span> 调用 proc3 Q当前程序入?/span> => 打印 calling proc2 Q调?/span> proc2 Q?/span> proc3 入栈 => 打印 calling proc1 Q调?/span> proc1 Q?/span> proc2 入栈 => 打印 running proc1 Q生?/span> no_data_found 异常Q该异常被压入异常栈?/span> =>  proc2 出栈Qƈ到来自W?/span> 5 行调用传递过来的异常Q将它在此压入异常栈 => proc3 出栈Qƈ到来自W?/span> 4 行调用传递过来的异常Q将它在此压入异常栈Q?/span> dbms_utility.format_error_backtrace 异常栈中信息反相打印出?/span> =>  最外层E序出栈Q?/span> end ?/span>

以下是正用这个函数的一些注意事:

ü         在当前程序的异常处理模块中调用这个函数?/span>

ü         避免在中间程序中使用异常处理模块?/span>

q样异常p被正地传输到最外层E序中,q打印出q个q程了?/span>



]]>
Oracle:pl/sql 异常处理 Q?Q?/title><link>http://www.shnenglu.com/ivenher/articles/14132.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Wed, 25 Oct 2006 08:24:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/14132.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/14132.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/14132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/14132.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/14132.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">处理</span> <span lang="EN-US" twffan="done">oracle</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">pȝ自动生成pȝ异常外,可以使用</span> <span lang="EN-US" twffan="done">raise</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">来手动生成错误?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"> <span lang="EN-US" style="FONT-FAMILY: Wingdings" twffan="done">l<span style="FONT: 7pt 'Times New Roman'" twffan="done">         </span></span> <span lang="EN-US" twffan="done">Raise exception;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"> <span lang="EN-US" style="FONT-FAMILY: Wingdings" twffan="done">l<span style="FONT: 7pt 'Times New Roman'" twffan="done">         </span></span> <span lang="EN-US" twffan="done">Raise package.exception;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"> <span lang="EN-US" style="FONT-FAMILY: Wingdings" twffan="done">l<span style="FONT: 7pt 'Times New Roman'" twffan="done">         </span></span> <span lang="EN-US" twffan="done">Raise;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">以上?/span> <span lang="EN-US" twffan="done">raise</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的三U用方法。第一U用于生成当前程序中定义的异常或?/span> <span lang="EN-US" twffan="done">standard</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">中的pȝ异常?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Declare</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span> <span style="mso-tab-count: 1" twffan="done">       </span>Invalid_id exception;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span> <span style="mso-tab-count: 1" twffan="done">       </span>Id_values varchar(2);</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Begin</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span> <span style="mso-tab-count: 1" twffan="done">       </span>Id_value:=id_for(‘smith?;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>If substr(id_value,1,1)!=’x?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span> <span style="mso-tab-count: 1" twffan="done">       </span>Raise invalid_id;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>End if;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Exception</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>When invalid_id</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span> <span style="mso-tab-count: 1" twffan="done">       </span>Dbms_output.put_line(‘this is an invalid id!?;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>End;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">q是一个生成自定义异常的例子,当然也可以生成系l异常:</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>declare </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span> <span style="mso-tab-count: 1" twffan="done">       </span>employee_id_in number;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Begin</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt"> <span lang="EN-US" twffan="done">Select employee_id into employee_id_in from employ_list where employee_name=&n;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt"> <span lang="EN-US" twffan="done">If employee_id_in=0</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt"> <span lang="EN-US" twffan="done">Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Raise zero_devided;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt"> <span lang="EN-US" twffan="done">End if;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Exception</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>When zero_devided</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span> <span style="mso-tab-count: 1" twffan="done">       </span>Dbms_output.put_line(‘wrong!?;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>End;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">有一些异常是定义在非标准包中的,?/span> <span lang="EN-US" twffan="done">UTL_FILE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">Q?/span> <span lang="EN-US" twffan="done">DBMS_SQL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">以及E序员创建的包中异常。可以?/span> <span lang="EN-US" twffan="done">raise</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的第二种用法来生成异常?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>If day_overdue(isbn_in, browser_in) > 365</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>Raise overdue_pkg.book_is_lost</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>End if;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">在最后一U?/span> <span lang="EN-US" twffan="done">raise</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的Ş式中Q不带Q何参数。这U情况只出现在希望将当前的异怼到外部程序时?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Exception</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>When no_data_found</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span>Then</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 2" twffan="done">              </span> <span style="mso-tab-count: 1" twffan="done">       </span>Raise;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>End;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done">Pl.sql</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">使用</span> <span lang="EN-US" twffan="done">raise_application_error</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">q程来生成一个有具体描述的异常。当使用q个q程Ӟ当前E序被中止,输入输出参数被置为原先的|但Q?/span> <span lang="EN-US" twffan="done">DML</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">Ҏ据库所做的改动被保留Q可以在之后?/span> <span lang="EN-US" twffan="done">rollback</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">命o回滚。下面是该过E的原型Q?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Procedure raise_application_error(</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Num binary_integer;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Msg varchar2;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-tab-count: 1" twffan="done">       </span>Keeperrorstack Boolean default false</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span lang="EN-US" twffan="done">)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">其中</span> <span lang="EN-US" twffan="done">num</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">是在</span> <span lang="EN-US" twffan="done">-20999</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">?/span> <span lang="EN-US" twffan="done">-20000</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">之间的Q何数字(但事实上Q?/span> <span lang="EN-US" twffan="done">DBMS_OUPUT</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">?/span> <span lang="EN-US" twffan="done">DBMS_DESCRIBLE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">包用了</span> <span lang="EN-US" twffan="done">-20005</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">?/span> <span lang="EN-US" twffan="done">-20000</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的数字)Q?/span> <span lang="EN-US" twffan="done">msg</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">是小?/span> <span lang="EN-US" twffan="done">2K</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">个字W的描述语,M大于</span> <span lang="EN-US" twffan="done">2K</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的字W都被自动丢弃Q?/span> <span lang="EN-US" twffan="done">keeperrorstack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">默认?/span> <span lang="EN-US" twffan="done">false</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">Q是指清I异常栈Q再当前异常入栈,如果指定</span> <span lang="EN-US" twffan="done">true</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">的话q接将当前异常压入栈中?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">    </span>CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER)</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">    </span>IS</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">       </span>l_message error_table.error_string%TYPE;</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">    </span>BEGIN</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">       </span>SELECT error_string</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">         </span>INTO l_message</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">         </span>FROM error_table, v$nls_parameters v</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">        </span>WHERE error_number = code_in</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">          </span>AND string_language<span style="mso-spacerun: yes" twffan="done">  </span>= v.VALUE</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">          </span>AND v.parameter = 'NLS_LANGUAGE';</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <o:p></o:p></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">       </span>RAISE_APPLICATION_ERROR (code_in, l_message);</span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" twffan="done"> <span style="mso-spacerun: yes" twffan="done">    </span>END;</span> </p> <img src ="http://www.shnenglu.com/ivenher/aggbug/14132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-10-25 16:24 <a href="http://www.shnenglu.com/ivenher/articles/14132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle:pl/sql 异常处理Q?2 Q?http://www.shnenglu.com/ivenher/articles/14131.html爱饭?/dc:creator>爱饭?/author>Wed, 25 Oct 2006 08:23:00 GMThttp://www.shnenglu.com/ivenher/articles/14131.htmlhttp://www.shnenglu.com/ivenher/comments/14131.htmlhttp://www.shnenglu.com/ivenher/articles/14131.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/14131.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/14131.html pl/sql 提供了强大而灵zȝ手段来捕捉和处理E序产生的异常,从而 oracle 的用戯M些o人烦恼的 bug ?/span>

 

异常定义

 

在一个异生、被捕获q处理之前,它必被定义?/span> Oracle 定义了几千个异常Q绝大多数只有错误编号和相关描述Q仅仅命名了若干个最常被用到的异常。这些名字被储存?/span> STANDARD Q?/span> UTL_FILE Q?/span> DBMS_SQL q几个系l包中,详情误 oracle:pl/sql 异常处理Q?/span> 1 Q?/span>

之外的绝大多数异帔R要程序员命名。有 2 U命名异常的ҎQ?/span>

 

1 Q声明一个自定义异常

?/span> STANDARD 中的命名了的异常基本山是与系l的错误相关的(当然那些只有 errorcode 的异怹是这PQ但在实际的应用中我们经帔R要与特定的应用程序相关的异常Q由E序员声明的异常是用于处理q种情况的?/span>

Oracle 异常处理模块的方便的地方在于Q它q没有区别对待自定义的与预定义的异常。这使得我们可以像对待预定义异常一P捕捉和处理自定义异常Q只是在此之前需要声明它Q同时对于一个自定义的异常,我们需要用 RAISE 来手动生?/span>

下面是一个声明的例子Q?/span>

       procedure calc_ammul_sales

              (company_id_in in company.company_id%tye)

       is

              invalid_company_id exception;

              negative_balance excrption;

              duplicate_company Boolean;

       begin

              /*body of executable statement*/

       exception

              when invalid_company_id

              then /*handle exception*/

              when no_data_found

              then /*handle exception*/

              /*?.*/

       end;

需要注意的是处理定义的时候,只有两个地方会出现自定义的异常:

ü         raise exception Q?/span>

ü         when exception then

 

2 Qؓ非预定义异常兌一个名?/span>

仅仅 21 个预定义异常Ҏ们来说实在是太少了,q有几千个异常只?/span> errorcode 和描q。另外,E序员也可以?/span> RAISE_APPLICATION_ERROR 定义一个含 errorcode 和描q的异常?/span>

当然Q只?/span> errorcode 也可以很好地完成工作Q只要你不担心会忘了那串数字代表的意思就行。比方说 ;

       exception

              when others

              then

                     if sqlcode=-1843 then  /*sqlcode 是内建的用于q回最q一ơ错误编L函数 */

                     ?.

q的是一D让人感到晦涩的代码Q还是给它关联个名字吧?/span>

我们要用到的?/span> pragma exception_init(exception,integer) Q然后就可以像对待预定义异常一样对待它了,我是说没必要像上面的那种一L raise ?/span> Exception_init 是一个编译时q行的函敎ͼ它只能出现在代码的声明部分,而异常名字必d此之前被定义。下面用一个匿名过ED个例子:

       declare

              invalid_company_id exception;

              pragma exception_init(invalid_company_id, -1834);

要注意的Ӟ

ü         不可以用 -1403 Q?/span> no_data_found Q,?/span> 100 Q事实上 exception_init 中的 integer 对应的是 sqlcode q回的倹{?/span>

ü         不能?/span> 0 Q不能大?/span> 100 Q不能小?/span> -1000000

一个例子:

       procedure delete_company(company_id_in in number)

       is

              still_have_emplyee exception;

              pragma exception(still_have_employee, -2293);

       begin

              delete from compamy

              where company_id=company_id_in;

       exception

              when still_have_employee

              then dbms_output.put_line(‘delete employees for company first?;

       end;

在一下两U情况下Q我们有必要使用 exception_init Q?/span>

ü         一个非预定义异常是l常要被用到的?/span>

ü         我们用 raise_applocation_error 产生了一个自定义?/span> errorcode 时?/span>

一U简便的Ҏ是将以上两种情况中的异常定义在一个包中,q样我们没有必要每ơ都重复定义了?/span>

       Create or replace package dynsql

       Is

              Invalid_table_name exception;

              Pragma exception_init(invalid_table_name, -903);

              Invalid_column_name exception;

              Pragma exception_init(invalid_column_name, -904);

              En_too_young const number:=-200001;

              Exc_too_young exception;

              Pragma exception_init(exc_too_young, -20001);

       End;

有了上面q个包,可以方便的处理异常?/span> ;

       procedure validate_emp(birthdate in date)

       is

              min_tear const pls_integer:=18;

       begin

              if add_month(sysdate,min_year*12*-1)<birthdate_in

              then

raise_application_error(dynsql.en_too_young, ‘employee must be?|| min_year ||‘old?;

              end if;

       end;

除了 standard 包中?/span> 21 个预定义异常外,q有一些包也定义了一些异常。但?/span> standard 包中异常不同的是Q在使用q些异常Ӟ需要带上包的名字。如Q?/span>

       when dbms_lob.invalid_argval then …?/span>

 

非常有用的一ҎQ可以在最外层?/span> pl/sql 块的异常处理模块中加?/span> others Q这样就可以把从内部传递出来的未被处理的剩余异常全部处理掉了?/span>

       Exception

       When others

              Then ?



]]>
Oracle:pl/sql 异常处理Q?1 Q?/title><link>http://www.shnenglu.com/ivenher/articles/14130.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Wed, 25 Oct 2006 08:17:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/14130.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/14130.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/14130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/14130.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/14130.html</trackback:ping><description><![CDATA[     摘要: pl/sql 提供了强大而灵zȝ手段来捕捉和处理E序产生的异常,从而 oracle 的用戯M些o人烦恼的 bug ?   pl/sql 异常处理的概念和术语 ...  <a href='http://www.shnenglu.com/ivenher/articles/14130.html'>阅读全文</a><img src ="http://www.shnenglu.com/ivenher/aggbug/14130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-10-25 16:17 <a href="http://www.shnenglu.com/ivenher/articles/14130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE之常用FAQ V1.0 (4) W四部分、性能调整http://www.shnenglu.com/ivenher/articles/13153.html爱饭?/dc:creator>爱饭?/author>Fri, 29 Sep 2006 09:26:00 GMThttp://www.shnenglu.com/ivenher/articles/13153.htmlhttp://www.shnenglu.com/ivenher/comments/13153.htmlhttp://www.shnenglu.com/ivenher/articles/13153.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/13153.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/13153.html W四部分、性能调整
[Q]如果讄自动跟踪
[A]用systemd
执行$ORACLE_HOME/rdbms/admin/utlxplan.sql创徏计划?br />执行$ORACLE_HOME/sqlplus/admin/plustrce.sql创徏plustrace角色
如果惌划表让每个用户都能用,?br />SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果惌自动跟踪的角色让每个用户都能使用Q则
SQL> grant plustrace to public;
通过如下语句开?停止跟踪
SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
[Q]如果跟踪自己的会话或者是别h的会?/font>
[A]跟踪自己的会话很?br />Alter session set sql_trace true|false
Or
Exec dbms_session.set_sql_trace(TRUE);
如果跟踪别h的会话,需要调用一个包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文g名称Q适用于Win环境Q如果是unix需要做一定修改)
SELECT p1.value||'\'||p2.value||'_ora_'||p.spid||'.ora' filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID')
最后,可以通过Tkprof来解析跟t文Ӟ?br />Tkprof 原文?目标文g sys=n
[Q]怎么讄整个数据库系l跟t?/font>
[A]其实文上的alter system set sql_trace=true是不成功?br />但是可以通过讄事g来完成这个工作,作用相等
alter system set events
'10046 trace name context forever,level 1';
如果关闭跟踪Q可以用如下语句
alter system set events
'10046 trace name context off';
其中的level 1与上面的8都是跟踪U别
level 1Q跟tSQL语句Q等于sql_trace=true
level 4Q包括变量的详细信息
level 8Q包括等待事?br />level 12Q包括绑定变量与{待事g
[Q]怎么h据OSq程快速获得DBq程信息与正在执行的语句
[A]有些时候,我们在OS上操作,象TOP之后我们得到的OSq程Q怎么快速根据OS信息获得DB信息呢?
我们可以~写如下脚本Q?br />$more whoit.sh
#!/bin/sh
sqlplus /nolog 100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
q是对命令与工具包的一些ȝ
1、对于分Q徏议用DBMS_STATSQ而不是用Analyze语句?
a) 可以q行q行Q对多个用户Q多个Table
b) 可以得到整个分区表的数据和单个分区的数据?
c) 可以在不同别上Compute StatisticsQ单个分区,子分区,全表Q所有分?
d) 可以倒出l计信息
e) 可以用户自动攉l计信息
2、DBMS_STATS的缺?
a) 不能Validate Structure
b) 不能攉CHAINED ROWS, 不能攉CLUSTER TABLE的信息,q两个仍旧需要用Analyze语句?
c) DBMS_STATS 默认不对索引q行AnalyzeQ因为默认Cascade是FalseQ需要手工指定ؓTrue
3、对于oracle 9里面的External TableQAnalyze不能使用Q只能用DBMS_STATS来收集信息?br />[Q]怎么样快速重整烦?/font>
[A]通过rebuild语句Q可以快速重整或Ud索引到别的表I间
rebuild有重建整个烦引数的功能,可以在不删除原始索引的情况下改变索引的存储参?br />语法?br />alter index index_name rebuild tablespace ts_name
storage(…?;
如果要快速重建整个用户下的烦引,可以用如下脚本,当然Q需要根据你自己的情况做相应修改
SQL> set heading off
SQL> set feedback off
SQL> spool d:\index.sql
SQL> SELECT 'alter index ' || index_name || ' rebuild '
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'
FROM all_indexes
WHERE ( tablespace_name != 'INDEXES'
OR next_extent != ( 256 * 1024 )
)
AND owner = USER
SQL>spool off
另外一个合q烦引的语句?br />alter index index_name coalesceQ这个语句仅仅是合ƈ索引中同一U的leaf block
消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用?br />[Q]如何使用Hint提示
[A] 在select/delete/update后写/*+ hint */
?select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
注意/*?之间不能有空?br />如用hint指定使用某个索引
select /*+ index(cbotab) */ col1 from cbotab;
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
select /*+ index(a cbotab1) */ col1 from cbotab a;
其中
TABLE_NAME是必要写的Q且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;
INDEX_NAME可以不必写,Oracle会根据统计值选一个烦?
如果索引名或表名写错了,那这个hint׃被忽?
[Q]怎么样快速复制表或者是插入数据
[A]快速复制表可以指定Nologging选项
如:Create table t1 nologging
as select * from t2;
快速插入数据可以指定append提示Q但是需要注?br />noarchivelog模式下,默认用了append是nologging模式的?
在archivelog下,需要把表设|程Nologging模式?br />如insert /*+ append */ into t1
select * from t2
注意Q如果在9i环境中ƈ讄了FORCE LOGGINGQ则以上操作是无效的Qƈ不会加快Q当Ӟ可以通过如下语句讄为NO FORCE LOGGING?br />Alter database no force logging;
是否开启了FORCE LOGGINGQ可以用如下语句查看
SQL> select force_logging from v$database;
[Q]怎么避免使用特定索引
[A]在很多时候,Oracle会错误的使用索引而导致效率的明显下降Q我们可以用一点点技巧而避免用不该用的索引Q如Q?br />表test,有字Da,b,c,dQ在a,b,c上徏立联合烦引inx_a(a,b,c)Q在b上单独徏立了一个烦引Inx_b(b)?br />在正常情况下Qwhere a=? and b=? and c=?会用到烦引inx_aQ?br />where b=?会用到烦引inx_b
但是Qwhere a=? and b=? and c=? group by b会用到哪个烦引呢Q在分析数据不正(很长旉没有分析Q或Ҏ没有分析数据的情况下Qoracle往往会用烦引inx_b。通过执行计划的分析,q个索引的用,大大耗费查询旉?br />当然Q我们可以通过如下的技巧避免用inx_bQ而用inx_a?br />where a=? and b=? and c=? group by b||'' --如果b是字W?br />where a=? and b=? and c=? group by b+0 --如果b是数?br />通过q样单的改变Q往往可以是查询时间提交很多?br />当然Q我们也可以使用no_index提示Q相信很多h没有用过Q也是一个不错的ҎQ?br />select /*+ no_index(t,inx_b) */ * from test t
where a=? and b=? and c=? group by b
[Q]Oracle什么时候会使用跌式烦引扫?/font>
[A]q是9i的一个新Ҏ蟩跃式索引扫描(Index Skip Scan).
例如表有索引index(a,b,c)Q当查询条g?br />where b=?的时候,可能会用到索引index(a,b,c)
如,执行计划中出现如下计划:
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)
Oracle的优化器(q里指的是CBO)能对查询应用Index Skip Scans臛_要有几个条g:
1 优化器认为是合适的?br />2 索引中的前导列的唯一值的数量能满一定的条gQ如重复值很多)?br />3 优化器要知道前导列的值分?通过分析/l计表得??br />4 合适的SQL语句
{?br />[Q]怎么样创Z用虚拟烦?/font>
[A]可以使用nosegment选项Q如
create index virtual_index_name on table_name(col_name) nosegment;
如果在哪个session需要测试虚拟烦引,可以利用隐含参数来处?br />alter session set "_use_nosegment_indexes" = true;
可以利用explain plan for select ……来看虚拟烦引的效果
利用@$ORACLE_HOME/rdbms/admin/utlxpls查看执行计划
最后,Ҏ需要,我们可以删除虚拟索引Q如普通烦引一?br />drop index virtual_index_name;
注意Q虚拟烦引ƈ不是物理存在的,所以虚拟烦引ƈ不等同于物理索引Q不要用自动跟踪L试虚拟烦引,因ؓ那是实际执行的效果,是用不到虚拟索引的?br />[Q]怎样监控无用的烦?/font>
[A]Oracle 9i以上Q可以监控烦引的使用情况Q如果一D|间内没有使用的烦引,一般就是无用的索引
语法为:
开始监控:alter index index_name monitoring usage;
查用状态:select * from v$object_usage;
停止监控Qalter index index_name nomonitoring usage;
当然Q如果想监控整个用户下的索引Q可以采用如下的脚本Q?br />set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on
------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on
[Q]怎么栯固定我的执行计划
[A]可以使用OUTLINE来固定SQL语句的执行计?br />用如下语句可以创Z个OUTLINE
Create oe replace outline OutLn_Name on
Select Col1,Col2 from Table
where …?br />如果要删除OutlineQ可以采?br />Drop Outline OutLn_Name;
对于已经创徏了的OutLineQ存攑֜OUTLN用户的OL$HINTS表下?br />对于有些语句Q你可以使用update outln.ol$hints来更新outline
如update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)
where ol_name in ('TEST1','TEST2');
q样Q你把Test1 OUTLINE与Test2 OUTLINE互换?br />如果惛_用已l存在的OUTLINEQ需要设|以下参?br />Alter system/session set Query_rewrite_enabled = true
Alter system/session set use_stored_outlines = true
[Q]v$sysstat中的class分别代表什?/font>
[A]l计cd
1 代表事例zd
2 代表Redo bufferzd
4 代表?br />8 代表数据~冲zd
16 代表OSzd
32 代表q行zd
64 代表表访?br />128 代表调试信息
[Q]怎么杀掉特定的数据库会?/font>
[A] Alter system kill session 'sid,serial#';
或?br />alter system disconnect session 'sid,serial#' immediate;
在win上,q可以采用oracle提供的orakill杀掉一个线E(其实是一个Oracleq程Q?br />在Linux/Unix上,可以直接利用kill杀掉数据库q程对应的OSq程
[Q]怎么快速查N与锁{待
[A]数据库的锁是比较耗费资源的,特别是发生锁{待的时候,我们必须扑ֈ发生{待的锁Q有可能的话Q杀掉该q程?br />q个语句查扑ֈ数据库中所有的DML语句产生的锁Q还可以发现QQ何DML语句其实产生了两个锁Q一个是表锁Q一个是行锁?br />可以通过alter system kill session ‘sid,serial#’来杀掉会?br />SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁{待Q我们可能更想知道是谁锁了表而引赯的等?br />以下的语句可以查询到谁锁了表Q而谁在等待?br />SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查询l果是一个树状结构,如果有子节点Q则表示有等待发生。如果想知道锁用了哪个回滚段Q还可以兌到V$rollnameQ其中xidusn是回滚D늚USN
[Q] 如何有效的删除一个大?extent数很多的?
[A] 一个有很多(100k)extent的表Q如果只是简单地用drop table的话Q会很大量消耗CPUQOracle要对fet$、uet$数据字典q行操作Q,可能会用上几天的旉Q较好的Ҏ是分多次删除extentQ以减轻q种消耗:
1. truncate table big-table reuse storage;
2. alter table big-table deallocate unused keep 2000m ( 原来大小的n-1/n);
3. alter table big-table deallocate unused keep 1500m ;
....
4. drop table big-table;
[Q]如何收羃临时数据文g的大?/font>
[A]9i以下版本采用
ALTER DATABASE DATAFILE 'file name' RESIZE 100McM的语?br />9i以上版本采用
ALTER DATABASE TEMPFILE 'file name' RESIZE 100M
注意Q时数据文件在使用Ӟ一般不能收~,除非关闭数据库或断开所有会话,停止对时数据文件的使用?br />[Q]怎么清理临时D?/font>
[A]可以使用如下办法
1?使用如下语句查看一下认谁在用时段
SELECT username,sid,serial#,sql_address,machine,program,
tablespace,segtype, contents
FROM v$session se,v$sort_usage su
WHERE se.saddr=su.session_addr
2?那些正在使用临时D늚q程
SQL>Alter system kill session 'sid,serial#';
3、把TEMP表空间回~一?br />SQL>Alter tablespace TEMP coalesce;
q可以用诊断事?br />1?定TEMP表空间的ts#
SQL> select ts#, name FROM v$tablespace;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
…?br />2?执行清理操作
alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'
说明Q?
temp表空间的TS# ?3*, So TS#+ 1= 4
如果x除所有表I间的时段Q则
TS# = 2147483647
[Q]怎么样dump数据库内部结构,如上面显C的控制文g的结?/font>
[A]常见的有
1、分析数据文件块Q{储数据文件n的块m
alter system dump datafile n block m
2、分析日志文?br />alter system dump logfile logfilename;
3、分析控制文件的内容
alter session set events 'immediate trace name CONTROLF level 10'
4、分析所有数据文件头
alter session set events 'immediate trace name FILE_HDRS level 10'
5、分析日志文件头
alter session set events 'immediate trace name REDOHDR level 10'
6、分析系l状态,最好每10分钟一ơ,做三ơ对?br />alter session set events 'immediate trace name SYSTEMSTATE level 10'
7、分析进E状?br />alter session set events 'immediate trace name PROCESSSTATE level 10'
8、分析Library Cache的详l情?br />alter session set events 'immediate trace name library_cache level 10'
[Q]如何获得所有的事g代码
[A] 事g代码范围一般从10000 to 10999Q以下列Zq个范围的事件代码与信息
SET SERVEROUTPUT ON
DECLARE
err_msg VARCHAR2(120);
BEGIN
dbms_output.enable (1000000);
FOR err_num IN 10000..10999
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
/
在Unixpȝ上,事g信息攑֜一个文本文仉
$ORACLE_HOME/rdbms/mesg/oraus.msg
可以用如下脚本查看事件信?
event=10000
while [ $event -ne 10999 ]
do
event=`expr $event + 1`
oerr ora $event
done
对于已经保?正在跟踪的事Ӟ可以用如下脚本获?br />SET SERVEROUTPUT ON
DECLARE
l_level NUMBER;
BEGIN
FOR l_event IN 10000..10999
LOOP
dbms_system.read_ev (l_event,l_level);
IF l_level > 0 THEN
dbms_output.put_line ('Event '||TO_CHAR (l_event)||
' is set at level '||TO_CHAR (l_level));
END IF;
END LOOP;
END;
/
[Q]什么是STATSPACKQ我怎么使用它?
[A]Statspack是Oracle 8i以上提供的一个非常好的性能监控与诊断工P基本上全部包含了BSTAT/ESTAT的功能,更多的信?br />可以参考附带文?ORACLE_HOME/rdbms/admin/spdoc.txt?
安装Statspack:
cd $ORACLE_HOME/rdbms/admin
sqlplus "/ as sysdba" @spdrop.sql -- 卸蝲Q第一ơ可以不需?br />sqlplus "/ as sysdba" @spcreate.sql -- 需要根据提C入表I间?br />使用Statspack:
sqlplus perfstat/perfstat
exec statspack.snap; -- q行信息攉l计Q每ơ运行都生一个快照号
-- 获得快照P必须要有两个以上的快照,才能生成报表
select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;
@spreport.sql -- 输入需要查看的开始快照号与结束快照号
其他相关脚本s:
spauto.sql - 利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统?
sppurge.sql - 清除一D范围内的统计信息,需要提供开始快照与l束快照?br />sptrunc.sql - 清除(truncate)所有统计信?/span>



]]>
ORACLE之常用FAQ V1.0 (5) W五部分、ORACLE|络与安?/title><link>http://www.shnenglu.com/ivenher/articles/13154.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Fri, 29 Sep 2006 09:26:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/13154.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/13154.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/13154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/13154.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/13154.html</trackback:ping><description><![CDATA[ <span id="zx9bjzh" class="tpc_content" twffan="done"> <b>W五部分、ORACLE|络与安?/b> <br /> <font color="red">[Q]如何限定特定IP讉K数据?/font> <br />[A]可以利用d触发器、cmgw或者是?OREACLE_HOME/network/admin下新增一个protocol.ora文gQ有些os可能? protocol.oraQ,9i可以直接修改sqlnet.oraQ?br />增加如下内容Q?br />tcp.validnode_checking=yes<br />#允许讉K的ip<br />tcp.inited_nodes=(ip1,ip2,…?<br />#不允许访问的ip<br />tcp.excluded_nodes=(ip1,ip2,…?<br /><font color="red">[Q]如何I过防火墙连接数据库</font><br />[A]q个问题只会在WINq_出现QUNIXq_会自动解冟?br />解决ҎQ?br />在服务器端的SQLNET.ORA应类?br />SQLNET.AUTHENTICATION_SERVICES= (NTS) <br />NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) <br />TRACE_LEVEL_CLIENT = 16 <br />注册表的HOME0加[HKEY_LOCAL_MACHINE] <br />USE_SHARED_SOCKET=TRUE<br /><font color="red">[Q]如何利用hostname方式q接数据?/font><br />host name方式只支持tcp/ip协议的小局域网<br />修改listener.ora中的如下信息<br />(SID_DESC =<br />(GLOBAL_DBNAME = ur_hostname) --你的机器?br />(ORACLE_HOME = E:\oracle\ora92) --oracle home<br />(SID_NAME = orcl) --sid name<br />)<br />然后在客L<br />的sqlnet.ora中,保?br />NAMES.DIRECTORY_PATH= (HOSTNAME)<br />你就可以利用数据库服务器的名U访问数据库?br /><font color="red">[Q]dbms_repcat_admin能带来什么安全隐?/font><br />[A]如果一个用戯执行dbms_repcat_admin包,获得极大的pȝ权限?br />以下情况可能获得该包的执行权限:<br />1、在sys下grant execute on dbms_repcat_admin to public[|user_name]<br />2、用h有execute any procedureҎQ仅限于9i以下Q?i必须昄授权Q?br />如果用户通过执行如下语句Q?br />exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name');<br />该用户将获得极大的系l特?br />可以从user_sys_privs中获得详l信?br /><font color="red">[Q]在不知道用户密码的时候,怎么栯转到另外一个用h行操作后q不影响该用?</font><br />[A]我们通过如下的方法,可以安全使用该用P然后再蟩转回来,在某些时候比较有?br />需要Alter user权限或DBA权限Q?br />SQL> select password from dba_users where username='SCOTT';<br />PASSWORD<br />-----------------------------<br />F894844C34402B67<br />SQL> alter user scott identified by lion;<br />User altered.<br />SQL> connect scott/lion<br />Connected.<br />REM Do whatever you like...<br />SQL> connect system/manager<br />Connected.<br />SQL> alter user scott identified by values 'F894844C34402B67';<br />User altered.<br />SQL> connect scott/tiger<br />Connected.<br /><font color="red">[Q]如何加固你的数据?/font><br />[A]要注意以下方?br />1. 修改sys, system的口令?<br />2. LockQ修改,删除默认用户Q?dbsnmp,ctxsys{?<br />3. 把REMOTE_OS_AUTHENTҎFalseQ防止远E机器直接登陆?<br />4. 把O7_DICTIONARY_ACCESSIBILITYҎFalse?<br />5. 把一些权限从PUBLIC Role取消掉?<br />6. 查数据库的数据文件的安全性。不要设|成666之类的。检查其他dba 用户?<br />7. 把一些不需要的服务Q比如ftp, nfs{关闭掉Q?<br />8. 限制数据库主Z面的用户数量?<br />9. 定期查Metalink/OTN上面的security Alert。比如:<br /><a target="_blank"><font color="#003366">http://otn.oracle.com/deploy/security/alerts.htm</font></a><br /><br />10. 把你的数据库与应用放在一个单独的子网中,要不然你的用户密码很Ҏ被sniffer厅R或者采用advance securityQ对用户d加密?<br />11. 限止只有某些ip才能讉K你的数据库?<br />12. lsnrctl 要加密码Q要不然别h很容易从外面x你的listener?<br />13. 如果可能Q不要用默?521端口<br /><font color="red">[Q]如何查用h否用了默认密?/font><br /><br />[A]如果使用默认密码Q很可能对你的数据库造成一定的安全隐患Q那么可以用如下的查询获得那些用户使用默认密码<br />select username "User(s) with Default Password!" <br />from dba_users <br />where password in <br />('E066D214D5421CCC', -- dbsnmp <br />'24ABAB8B06281B4C', -- ctxsys <br />'72979A94BAD2AF80', -- mdsys <br />'C252E8FA117AF049', -- odm <br />'A7A32CD03D3CE8D5', -- odm_mtr <br />'88A2B2C183431F00', -- ordplugins <br />'7EFA02EC7EA6B86F', -- ordsys <br />'4A3BA55E08595C81', -- outln <br />'F894844C34402B67', -- scott <br />'3F9FBD883D787341', -- wk_proxy <br />'79DF7A1BD138CF11', -- wk_sys <br />'7C9BA362F8314299', -- wmsys <br />'88D8364765FCE6AF', -- xdb <br />'F9DA8977092B7B81', -- tracesvr <br />'9300C0977D7DC75E', -- oas_public <br />'A97282CE3D94E29E', -- websys <br />'AC9700FD3F1410EB', -- lbacsys <br />'E7B5D92911C831E1', -- rman <br />'AC98877DE1297365', -- perfstat <br />'66F4EF5650C20355', -- exfsys <br />'84B8CBCA4D477FA3', -- si_informtn_schema <br />'D4C5016086B2DC6A', -- sys <br />'D4DF7931AB130E37') -- system <br />/<br /><font color="red">[Q]如何修改默认的XDB监听端口</font><br /><br />[A] Oracle9i默认的XML DB把HTTP的默认端口设?080Q这是一个太常用的端口了Q很多别的WebServer都会使用q个端口Q?br />如果我们安装了它Q最好修改一下,避免冲突Q如果不使用呢,最好不要安?br />提供三种修改的方?br />1.dbcaQ选择你的数据库,然后Standard Database Features->Customize->Oracle XML DB optionQ进入这个画面你应该q道怎么改了?<br />2.OEM consoleQ在XML Database 的配|里面修?<br />3.用oracle提供的包Q?<br />-- 把HTTP/WEBDAV端口?080改到8081 <br />SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), <br />'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081)) <br />/ <br />-- 把FTP端口?100改到2111 <br />SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), <br />'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111)) <br />/ <br />SQL> commit; <br />SQL> exec dbms_xdb.cfg_refresh; <br />-- 查修Ҏ否已l成?<br />SQL> select dbms_xdb.cfg_get from dual;<br /><font color="red">[Q]怎么捕获用户d信息Q如SIDQIP地址{?/font><br />[A]可以利用d触发器,?br />CREATE OR REPLACE TRIGGER tr_login_record<br />AFTER logon ON DATABASE<br />DECLARE<br />miUserSid NUMBER;<br />mtSession v$session%ROWTYPE;<br />CURSOR cSession(iiUserSid IN NUMBER) IS<br />SELECT * FROM v$session<br />WHERE sid=iiUserSid;<br />BEGIN<br />SELECT sid INTO miUserSid FROM v$mystat WHERE rownum</span> <br /> <!----> <!----> <!----> <img src ="http://www.shnenglu.com/ivenher/aggbug/13154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-29 17:26 <a href="http://www.shnenglu.com/ivenher/articles/13154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE之常用FAQ V1.0 (2) W二部分、ORACLE构架体系http://www.shnenglu.com/ivenher/articles/13151.html爱饭?/dc:creator>爱饭?/author>Fri, 29 Sep 2006 09:24:00 GMThttp://www.shnenglu.com/ivenher/articles/13151.htmlhttp://www.shnenglu.com/ivenher/comments/13151.htmlhttp://www.shnenglu.com/ivenher/articles/13151.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/13151.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/13151.html W二部分、ORACLE构架体系
[Q]ORACLE的有那些数据cd
[A]常见的数据类型有
CHAR固定长度字符域,最大长度可?000个字?
NCHAR多字节字W集的固定长度字W域Q长度随字符集而定Q最多ؓ2000个字W或2000个字?
VARCHAR2可变长度字符域,最大长度可?000个字W?
NVARCHAR2多字节字W集的可变长度字W域Q长度随字符集而定Q最多ؓ4000个字W或4000个字?
DATE用于存储全部日期的固定长?7个字?字符域,旉作ؓ日期的一部分存储其中。除?
通过讄init.ora文g的NLS_DATE_FORMAT参数来取代日期格式,否则查询Ӟ日期?
DD-MON-YY格式表示Q如13-APR-99表示1999.4.13
NUMBER可变长度数值列Q允许gؓ0、正数和负数。NUMBER值通常?个字节或更少的字节存储,最?1字节
LONG可变长度字符域,最大长度可?GB
RAW表示二进制数据的可变长度字符域,最长ؓ2000个字?
LONGRAW表示二进制数据的可变长度字符域,最长ؓ2GB
MLSLABEL只用于TrustedOracleQ这个数据类型每行??个字?
BLOB二进制大对象Q最大长度ؓ4GB
CLOB字符大对象,最大长度ؓ4GB
NCLOB多字节字W集的CLOB数据cdQ最大长度ؓ4GB
BFILE外部二进制文Ӟ大小由操作系l决?
ROWID表示RowID的二q制数据QOracle8RowID的数gؓ10个字节,在Oracle7中用的限定
RowID格式?个字?
UROWID用于数据d的二q制数据Q最大长度ؓ4000个字?
[Q]Oracle有哪些常见关键字Q不能被用于对象?/font>
[A]?i版本ZQ一般保留关键字不能用做对象?br />ACCESS ADD ALL ALTER AND ANY AS ASC AUDIT BETWEEN BY CHAR CHECK CLUSTER COLUMN COMMENT COMPRESS CONNECT CREATE CURRENT DATE DECIMAL DEFAULT DELETE DESC DISTINCT DROP ELSE EXCLUSIVE EXISTS FILE FLOAT FOR FROM GRANT GROUP HAVING IDENTIFIED IMMEDIATE IN INCREMENT INDEX INITIAL INSERT INTEGER INTERSECT INTO IS LEVEL LIKE LOCK LONG MAXEXTENTS MINUS MLSLABEL MODE MODIFY NOAUDIT NOCOMPRESS NOT NOWAIT NULL NUMBER OF OFFLINE ON ONLINE OPTION OR ORDER PCTFREE PRIOR PRIVILEGES PUBLIC RAW RENAME RESOURCE REVOKE ROW ROWID ROWNUM ROWS SELECT SESSION SET SHARE SIZE SMALLINT START SUCCESSFUL SYNONYM SYSDATE TABLE THEN TO TRIGGER UID UNION UNIQUE UPDATE USER VALIDATE VALUES VARCHAR VARCHAR2 VIEW WHENEVER WHERE WITH
详细信息可以查看v$reserved_words视图
[Q]怎么查看数据库版?/font>
[A]select * from v$version
包含版本信息Q核心版本信息,位数信息(32位或64?{?br />至于位数信息Q在linux/unixq_上,可以通过file查看Q如
file $ORACLE_HOME/bin/oracle
[Q]怎么查看数据库参?/font>
[A]show parameter 参数?br />如通过show parameter spfile可以查看9i是否使用spfile文g
或者select * from v$parameter
除了q部分参敎ͼOracleq有大量隐含参数Q可以通过如下语句查看:
SELECT NAME
,VALUE
,decode(isdefault, 'TRUE','Y','N') as "Default"
,decode(ISEM,'TRUE','Y','N') as SesMod
,decode(ISYM,'IMMEDIATE', 'I',
'DEFERRED', 'D',
'FALSE', 'N') as SysMod
,decode(IMOD,'MODIFIED','U',
'SYS_MODIFIED','S','N') as Modified
,decode(IADJ,'TRUE','Y','N') as Adjusted
,description
FROM ( --GV$SYSTEM_PARAMETER
SELECT x.inst_id as instance
,x.indx+1
,ksppinm as NAME
,ksppity
,ksppstvl as VALUE
,ksppstdf as isdefault
,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM
,decode(bitand(ksppiflg/65536,3),
1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM
,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD
,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ
,ksppdesc as DESCRIPTION
FROM x$ksppi x
,x$ksppsv y
WHERE x.indx = y.indx
AND substr(ksppinm,1,1) = '_'
AND x.inst_id = USERENV('Instance')
)
ORDER BY NAME
[Q]怎么h看数据库字符?/font>
[A]数据库服务器字符集select * from nls_database_parametersQ其来源于props$Q是表示数据库的字符集?br />客户端字W集环境select * from nls_instance_parameters,其来源于v$parameterQ?br />表示客户端的字符集的讄Q可能是参数文gQ环境变量或者是注册?br />会话字符集环?select * from nls_session_parametersQ其来源于v$nls_parametersQ表CZ话自q讄Q可能是会话的环境变量或者是alter session完成Q如果会话没有特D的讄Q将与nls_instance_parameters一致?br />客户端的字符集要求与服务器一_才能正确昄数据库的非Ascii字符。如果多个设|存在的时候,alter session>环境变量>注册?gt;参数文g
字符集要求一_但是语言讄却可以不同,语言讄用英文。如字符集是zhs16gbkQ则nls_lang可以是American_America.zhs16gbk?br />[Q]怎么样修改字W集
[A]8i以上版本可以通过alter database来修改字W集Q但也只限于子集到超集,不徏议修改props$表,可能导致严重错误?br />Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs16gbk;
[Q]怎样建立Z函数索引
[A]8i以上版本Q确?br />Query_rewrite_enabled=true
Query_rewrite_integrity=trusted
Compatible=8.1.0以上
Create index indexname on table (function(field));
[Q]怎么L动表或表分区
[A]Ud表的语法
Alter table tablename move
[Tablespace new_name
Storage(initial 50M next 50M
pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]
Ud分区的语?br />alter table tablename move (partition partname)
[update global indexes]
之后之后必须重徏索引
Alter index indexname rebuild
如果表有LobD,那么正常的Alter不能UdLobD到别的表空_而仅仅是Ud了表D,可以采用如下的方法移动LobD?br />alter table tablename move
lob(lobsegname) store as (tablespace newts);
[Q]怎么获得当前的SCN
[A]9i以下版本
select max(ktuxescnw*power(2,32)+ktuxescnb) from x$ktuxe;
如果?i以上版本Q还可以通过以下语句获取
select dbms_flashback.get_system_change_number from dual;
[Q]ROWID的结构与l成
[A]8以上版本的ROWIDl成
OOOOOOFFFBBBBBBRRR
8以下ROWIDl成Q也叫受限RowidQ?br />BBBBBBBB.RRRR.FFFF
其中QO是对象IDQF是文件IDQB是块IDQR是行ID
如果我们查询一个表的ROWIDQ根据其中块的信息,可以知道该表切占用了多个块,q而知道占用了多少数据I间Q此数据I间不等于表的分配空_
[Q]怎么栯取对象的DDL语句
[A]W三方工具就不说了主要说一?i以上版本的dbms_metadata
1、获得单个对象的DDL语句
set heading off
set echo off
set feedback off
set pages off
set long 90000
select dbms_metadata.get_ddl('TABLE','TABLENAME','SCAME') from dual;
如果获取整个用户的脚本,可以用如下语?br />select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;
当然Q如果是索引Q则需要修改相关table到index
[Q]如何创徏U束的烦引在别的表空间上
[A]1、先创徏索引Q再创徏U束
2、利用如下语句创?br />create table test
(c1 number constraint pk_c1_id primary key
using index tablespace useridex,
c2 varchar2(10)
) tablespace userdate;
[Q]怎么知道那些表没有徏立主?/font>
[A]一般的情况下,表的主键是必要的Q没有主键的表可以说是不W合设计规范的?br />SELECT table_name
FROM User_tables t
WHERE NOT EXISTS
(SELECT table_name
FROM User_constraints c
WHERE constraint_type = 'P'
AND t.table_name=c.table_name)
其它相关数据字典解释
user_tables ?br />user_tab_columns 表的?br />user_constraints U束
user_cons_columns U束与列的关p?br />user_indexes 索引
user_ind_columns 索引与列的关p?br />[Q]dbms_output提示~冲Z够,怎么增加
[A]dbms_output.enable(20000);
另外Q如果dbms_output的信息不能显C,
需要设|?br />set serveroutput on
[Q]怎么样修改表的列?/font>
[A]9i以上版本可以采用rname命o
ALTER TABLE UserName.TabName
RENAME COLUMN SourceColumn TO DestColumn
9i以下版本可以采用create table …?as select * from SourceTable的方式?br />另外Q?i以上可以支持删除列了
ALTER TABLE UserName.TabName
SET UNUSED (ColumnName) CASCADE CONSTRAINTS
ALTER TABLE UserName.TabName
DROP (ColumnName) CASCADE CONSTRAINTS
[Q]怎么Lsqlplus安装帮助
[A]SQLPLUS的帮助必L工安装,shell脚本?ORACLE_HOME/bin/helpins
在安装之前,必须先设|SYSTEM_PASS环境变量Q如Q?br />$ setenv SYSTEM_PASS SYSTEM/MANAGER
$ helpins
如果不设|该环境变量Q将在运行脚本的时候提C入环境变?br />当然Q除了shell脚本Q还可以利用sql脚本安装Q那׃用设|环境变量了Q但是,我们必须以systemd?br />$ sqlplus system/manager
SQL> @?/sqlplus/admin/help/helpbld.sql helpus.sql
安装之后Q你可以象如下的方法用帮助了
SQL> help index
[Q]怎么样快速下载Oracle补丁
[A]我们先获得下载服务器地址Q在http面上有
ftp://updates.oracle.com
然后用ftpdQ用户名与密码是metalink的用户名与密?br />如我们知道了补丁?095277 (9204的补丁集)Q则
ftp> cd 3095277
250 Changed directory OK.
ftp> ls
200 PORT command OK.
150 Opening data connection for file listing.
p3095277_9204_AIX64-5L.zip
p3095277_9204_AIX64.zip
…?br />p3095277_9204_WINNT.zip
226 Listing complete. Data connection has been closed.
ftp: 208 bytes received in 0.02Seconds 13.00Kbytes/sec.
ftp>
知道了这个信息,我们用用flashgetQ网l蚂蚁就可以下蝲了?
d如下q接
ftp://updates.oracle.com/3095277/p3...04_AIX64-5L.zip
或替换后面的部分为所需要的内容
注意Q如果是flashgetQ网l蚂蚁请输入认证用户名及密码Q就是你的metalink的用户名与密码!
[Q]如何Ud数据文g
[A]1、关闭数据库Q利用os拯
a.shutdown immediate关闭数据?br />b.在os下拷贝数据文件到新的地点
c.Startup mount 启动到mount?br />d.Alter database rename datafile '老文? to '新文?;
e.Alter database open; 打开数据?br />2、利用Rman联机操作
RMAN> sql "alter database datafile ''file name'' offline";
RMAN> run {
2> copy datafile 'old file location'
3> to 'new file location';
4> switch datafile ' old file location'
5> to datafilecopy ' new file location';
6> }
RMAN> sql "alter database datafile ''file name'' online";
说明Q利用OS拯也可以联机操作,不关闭数据库Q与rman的步骤一P利用rman与利用os拯的原理一P在rman中copy是拷贝数据文Ӟ相当于OS的cpQ而switch则相当于alter database renameQ用来更新控制文件?br />[Q]如果理联机日志l与成员
[A]以下是常见操作,如果在OPA/RAC下注意线E号
增加一个日志文件组
Alter database add logfile [group n] '文g全名' size 10M;
在这个组上增加一个成?br />Alter database add logfile member '文g全名' to group n;
在这个组上删除一个日志成?br />Alter database drop logfile member '文g全名';
删除整个日志l?br />Alter database drop logfile group n;
[Q]怎么栯REDO BLOCK的大?/font>
[A]计算Ҏ?redo size + redo wastage) / redo blocks written + 16
具体见如下例?br />SQL> select name ,value from v$sysstat where name like '%redo%';
NAME VALUE
---------------------------------------------------------------- ----------
redo synch writes 2
redo synch time 0
redo entries 76
redo size 19412
redo buffer allocation retries 0
redo wastage 5884
redo writer latching time 0
redo writes 22
redo blocks written 51
redo write time 0
redo log space requests 0
redo log space wait time 0
redo log switch interrupts 0
redo ordering marks 0
SQL> select (19412+5884)/51 + 16 '"Redo black(byte)" from dual;
Redo black(byte)
------------------
512
[Q]控制文g包含哪些基本内容
[A]控制文g主要包含如下条目Q可以通过dump控制文g内容看到
DATABASE ENTRY
CHECKPOINT PROGRESS RECORDS
REDO THREAD RECORDS
LOG FILE RECORDS
DATA FILE RECORDS
TEMP FILE RECORDS
TABLESPACE RECORDS
LOG FILE HISTORY RECORDS
OFFLINE RANGE RECORDS
ARCHIVED LOG RECORDS
BACKUP SET RECORDS
BACKUP PIECE RECORDS
BACKUP DATAFILE RECORDS
BACKUP LOG RECORDS
DATAFILE COPY RECORDS
BACKUP DATAFILE CORRUPTION RECORDS
DATAFILE COPY CORRUPTION RECORDS
DELETION RECORDS
PROXY COPY RECORDS
INCARNATION RECORDS
[Q]如果发现表中有坏块,如何索其它未坏的数据
[A]首先需要找到坏块的IDQ可以运行dbverify实现Q,假设为,假定文g~码为。运行下面的查询查找D名Q?
SELECT segment_name,segment_type,extent_id,block_id, blocks
from dba_extents t
where
file_id =
AND between block_id and (block_id + blocks - 1)
一旦找到坏D名Uͼ若段是一个表Q则最好徏立一个时表Q存攑֥的数据。若D|索引Q则删除它,再重建?br />create table good_table
as
select from bad_table where rowid not in
(select rowid
from bad_table where substr(rowid,10,6) = )
在这里要注意8以前的受限ROWID与现在ROWID的差别?br />q可以用诊断事?0231
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';
创徏一个时表good_table的表中除坏块的数据都索出?br />SQL>CREATE TABLE good_table as select * from bad_table;
最后关闭诊断事?br />SQL> ALTER SYSTEM SET EVENTS '10231 trace name context off ';
关于ROWID的结构,q可以参考dbms_rowid.rowid_create函数?br />[Q]我创Z数据库的所有用P我可以删除这些用户吗
[A]ORACLE数据库创建的时候,创徏了一pd默认的用户和表空_以下是他们的列表
·SYS/CHANGE_ON_INSTALL or INTERNAL
pȝ用户Q数据字典所有者,权限所有?SYSDBA)
创徏脚本Q?/rdbms/admin/sql.bsq and various cat*.sql
创徏后立即修改密?br />此用户不能被删除
·SYSTEM/MANAGER
数据库默认管理用P拥有DBA角色权限
创徏脚本Q?/rdbms/admin/sql.bsq
创徏后立即修改密?br />此用户不能被删除
·OUTLN/OUTLN
优化计划的存储大U用?br />创徏脚本Q?/rdbms/admin/sql.bsq
创徏后立即修改密?br />此用户不能被删除
---------------------------------------------------
·SCOTT/TIGER, ADAMS/WOOD, JONES/STEEL, CLARK/CLOTH and BLAKE/PAPER.
实验、测试用P含有例表EMP与DEPT
创徏脚本Q?/rdbms/admin/utlsampl.sql
可以修改密码
用户可以被删除,在品环境徏议删除或锁定
·HR/HR (Human Resources), OE/OE (Order Entry), SH/SH (Sales History).
实验、测试用P含有例表EMPLOYEES与DEPARTMENTS
创徏脚本Q?/demo/schema/mksample.sql
可以修改密码
用户可以被删除,在品环境徏议删除或锁定
·DBSNMP/DBSNMP
Oracle Intelligent agent
创徏脚本Q?/rdbms/admin/catsnmp.sql, called from catalog.sql
可以改变密码--需要放|新密码到snmp_rw.ora文g
如果不需要Intelligent AgentsQ可以删?br />---------------------------------------------------
以下用户都是可选安装用?如果不需要,׃需要安?br />·CTXSYS/CTXSYS
Oracle interMedia (ConText Cartridge)理用户
创徏脚本Q?/ctx/admin/dr0csys.sql
·TRACESVR/TRACE
Oracle Trace server
创徏脚本Q?/rdbms/admin/otrcsvr.sql
·ORDPLUGINS/ORDPLUGINS
Object Relational Data (ORD) User used by Time Series, etc.
创徏脚本Q?/ord/admin/ordinst.sql
·ORDSYS/ORDSYS
Object Relational Data (ORD) User used by Time Series, etc
创徏脚本Q?/ord/admin/ordinst.sql
·DSSYS/DSSYS
Oracle Dynamic Services and Syndication Server
创徏脚本Q?/ds/sql/dssys_init.sql
·MDSYS/MDSYS
Oracle Spatial administrator user
创徏脚本Q?/ord/admin/ordinst.sql
·AURORA$ORB$UNAUTHENTICATED/INVALID
Used for users who do not authenticate in Aurora/ORB
创徏脚本Q?/javavm/install/init_orb.sql called from ?/javavm/install/initjvm.sql
·PERFSTAT/PERFSTAT
Oracle Statistics Package (STATSPACK) that supersedes UTLBSTAT/UTLESTAT
创徏脚本Q?/rdbms/admin/statscre.sql



]]>
ORACLE之常用FAQ V1.0 (3) W三部分、备份与恢复http://www.shnenglu.com/ivenher/articles/13152.html爱饭?/dc:creator>爱饭?/author>Fri, 29 Sep 2006 09:24:00 GMThttp://www.shnenglu.com/ivenher/articles/13152.htmlhttp://www.shnenglu.com/ivenher/comments/13152.htmlhttp://www.shnenglu.com/ivenher/articles/13152.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/13152.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/13152.html W三部分、备份与恢复
[Q]如何开?关闭归档
[A]如果开启归,请保证log_archive_start=true开启自动归,否则只能手工归Q如果是关闭了归,则设|该参数为false
注意Q如果是OPS/RAC环境Q需要先把parallel_server = true注释掉,然后执行如下步骤Q最后用q个参数重新启动
1、开启归?br />a. 关闭数据库shutdown immediate
b. startup mount
c. alter database archivelog
d. alter database opne
2、禁止归?br />a. 关闭数据库shutdown immediate
b. startup mount
c. alter database noarchivelog
d. alter database open
归信息可以通过如下语句查看
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination E:\oracle\ora92\database\archive
Oldest online log sequence 131
Next log sequence to archive 133
Current log sequence 133
[Q]怎样讄定时归
[A]9i以上版本Q保证归的最间隔不过nU?br />讄Archive_lag_target = n
单位Q秒 范围Q?~7200
[Q]不同版本怎么导出/导入
[A]导出用低版本Q导入用当前版本
如果版本跨越太大Q需要用C间版本过?br />[Q]不同的字W集之前怎么导数?/font>
[A]a.前条件是保证导出/导入W合其他字符集标准,如客L境与数据库字W集一致?br />b.修改dmp文g??字节为目标数据库的字W集Q注意要换成十六q制?br />参考函敎ͼ以下函数中的ID是十q制的)Q?br />nls_charset_name Ҏ字符集ID获得字符集名U?br />nls_charset_id Ҏ字符集名U获得字W集ID
[Q]怎么样备份控制文?/font>
[A]再线备䆾Z个二q制的文?br />alter database backup controlfile to '$BACKUP_DEPT/controlfile.000' [reuse];
备䆾为文本文件方?br />alter database backup controlfile to trace [resetlogs|noresetlogs];
[Q]控制文g损坏如何恢复
[A]1、如果是损坏单个控制文g
只需要关闭数据库Q拷贝一个好的数据文件覆盖掉坏的数据文g卛_
或者是修改init.ora文g的相关部?br />2、如果是损失全部控制文gQ则需要创建控制文件或从备份恢?br />创徏控制文g的脚本可以通过alter database backup controlfile to trace获取?br />[Q]怎么L备䆾一个表I间
[A]Alter tablespace 名称 begin backup;
host cp q个表空间的数据文g 目的?
Alter tablespace 名称 end backup;
如果是备份多个表I间或整个数据库Q只需要一个一个表I间的操作下来就可以了?br />[Q]怎么快速得到整个数据库的热备脚?/font>
[A]可以写一D늱似的脚本
SQL>set serveroutput on
begin
dbms_output.enable(10000);
for bk_ts in (select distinct t.ts#,t.name from v$tablespace t,v$datafile d where t.ts#=d.ts#) loop
dbms_output.put_line('--'||bk_ts.name);
dbms_output.put_line('alter tablespace '||bk_ts.name||' begin backup;');
for bk_file in (select file#,name from v$datafile where ts#=bk_ts.ts#) loop
dbms_output.put_line('host cp '||bk_file.name||' $BACKUP_DEPT/');
end loop;
dbms_output.put_line('alter tablespace '||bk_ts.name||' end backup;');
end loop;
end;
/
[Q]丢失一个数据文Ӟ但是没有备䆾Q怎么h开数据?/font>
[A]如果没有备䆾只能是删除这个数据文件了Q会D相应的数据丢失?br />SQL>startup mount
--ARCHIVELOG模式命o
SQL>Alter database datafile 'file name' offline;
--NOARCHIVELOG模式命o
SQL>Alter database datafile 'file name' offline drop;
SQLl>Alter database open;
注意Q该数据文g不能是系l数据文?br />[Q]丢失一个数据文Ӟ没有备䆾但是有该数据文g创徏以来的归怎么恢复
[A]保证如下条g
a. 不能是系l数据文?br />b. 不能丢失控制文g
如果满以上条gQ则
SQL>startup mount
SQL>Alter database create datafile 'file name' as 'file name' size ... reuse;
SQL>recover datafile n; -文g?br />或?br />SQL>recover datafile 'file name';
或?br />SQL>recover database;
SQL>Alter database open;
[Q]联机日志损坏如何恢复
[A]1、如果是非当前日志而且归Q可以?br />Alter database clear logfile group n来创Z个新的日志文?br />如果该日志还没有归Q则需要用
Alter database clear unarchived logfile group n
2、如果是当前日志损坏Q一般不能clearQ则可能意味着丢失数据
如果有备份,可以采用备䆾q行不完全恢?br />如果没有备䆾Q可能只能用_allow_resetlogs_corruption=true来进行强制恢复了Q但是,q样的方法是不徏议的Q最好在有Oracle support的指gq行?br />[Q]怎么样创建RMAN恢复目录
[A]首先Q创Z个数据库用户Q一般都是RMANQƈl予recovery_catalog_owner角色权限
sqlplus sys
SQL> create user rman identified by rman;
SQL> alter user rman default tablespace tools temporary tablespace temp;
SQL> alter user rman quota unlimited on tools;
SQL> grant connect, resource, recovery_catalog_owner to rman;
SQL> exit;
然后Q用q个用户dQ创建恢复目?br />rman catalog rman/rman
RMAN> create catalog tablespace tools;
RMAN> exit;
最后,你可以在恢复目录注册目标数据库了
rman catalog rman/rman target backdba/backdba
RMAN> register database;
[Q]怎么样在恢复的时候移动数据文Ӟ恢复到别的地?/font>
[A]l一个RMAN的例?br />run {
set until time 'Jul 01 1999 00:05:00';
allocate channel d1 type disk;
set newname for datafile '/u04/oracle/prod/sys1prod.dbf'
to '/u02/oracle/prod/sys1prod.dbf';
set newname for datafile '/u04/oracle/prod/usr1prod.dbf'
to '/u02/oracle/prod/usr1prod.dbf';
set newname for datafile '/u04/oracle/prod/tmp1prod.dbf'
to '/u02/oracle/prod/tmp1prod.dbf';
restore controlfile to '/u02/oracle/prod/ctl1prod.ora';
replicate controlfile from '/u02/oracle/prod/ctl1prod.ora';
restore database;
sql "alter database mount";
switch datafile all;
recover database;
sql "alter database open resetlogs";
release channel d1;
}
[Q]怎么从备份片QbackuppieceQ中恢复(restore)控制文g与数据文?/font>
[A]可以使用如下ҎQ在RMAN中恢复备份片的控制文?br />restore controlfile from backuppiecefile;
如果?i的自动备份,可以采用如下的方?
restore controlfile from autobackup;
但是Q如果控制文件全部丢失,需要指定DBIDQ如SET DBID=?
自动备䆾控制文g的默认格式是%FQ这个格式的形式?
c-IIIIIIIIII-YYYYMMDD-QQQ其中IIIIIIIIII是DBID
至于恢复(restore)数据文gQoracle 816开始有个包dbms_backup_restore
?nomount 状态下可以执行,可以?815甚至之前的备份片Q读出来的文件用于恢?
可以在SQLPLUS中运行,如下
SQL>startup nomount
SQL> DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype := dbms_backup_restore.deviceallocate('', params=>'');
6 dbms_backup_restore.restoresetdatafile;
7 dbms_backup_restore.restorecontrolfileto('E:\Oracle\oradata\penny\control01.ctl');
8 dbms_backup_restore.restoreDataFileto(1,'E:\Oracle\oradata\penny\system01.dbf');
9 dbms_backup_restore.restoreDataFileto(2,'E:\Oracle\oradata\penny\UNDOTBS01.DBF');
10 dbms_backup_restore.restoreDataFileto(3,'E:\ORACLE\ORADATA\PENNY\USERS01.DBF');
11 dbms_backup_restore.restorebackuppiece('D:\orabak\BACKUP_1_4_04F4IAJT.PENNY',done=>done);
12 END;
13 /
PL/SQL q程已成功完成?
SQL> alter database mount;
[Q]Rman的format格式中的%scM的东西代表什么意?/font>
[A]可以参考如?br />%c 备䆾片的拯?
%d 数据库名U?
%D 位于该月中的W几?(DD)
%M 位于该年中的W几?(MM)
%F 一个基于DBID唯一的名U?q个格式的Ş式ؓc-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII数据库的DBIDQYYYYMMDD为日期,QQ是一?-256的序?
%n 数据库名Uͼ向右填补到最大八个字W?
%u 一个八个字W的名称代表备䆾集与创徏旉
%p 该备份集中的备䆾片号Q从1开始到创徏的文件数
%U 一个唯一的文件名Q代?u_%p_%c
%s 备䆾集的?
%t 备䆾集时间戳
%T q月日格?YYYYMMDD)
[Q]执行exec dbms_logmnr_d.build('Logminer.ora','file directory')Q提CZ标超界,怎么?/font>
[A]完整错误信息如下,
SQL> exec dbms_logmnr_d.build('Logminer.ora','file directory')
BEGIN dbms_logmnr_d.build('Logminer.ora','file directory'); END;
*
ERROR 位于W?1 ?
ORA-06532: 下标出限制
ORA-06512: ?SYS.DBMS_LOGMNR_D", line 793
ORA-06512: 在line 1
解决办法为:
1.~辑位于"$ORACLE_HOME/rdbms/admin"目录下的文g"dbmslmd.sql"
改变?
TYPE col_desc_array IS VARRAY(513) OF col_description;
?br />TYPE col_desc_array IS VARRAY(700) OF col_description;
q保存文?br />2. q行改变后的脚本
SQLPLUS> Connect internal
SQLPLUS> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql
3.重新~译该包
SQLPLUS> alter package DBMS_LOGMNR_D compile body;
[Q]执行execute dbms_logmnr.start_logmnr(DictFileName=>'DictFileName')提示ORA-01843:无效的月份,q个是什么原?/font>
[A]我们分析start_logmnr?br />PROCEDURE start_logmnr(
startScn IN NUMBER default 0 ,
endScn IN NUMBER default 0,
startTime IN DATE default TO_DATE('01-jan-1988','DD-MON-YYYY'),
endTime IN DATE default TO_DATE('01-jan-2988','DD-MON-YYYY'),
DictFileName IN VARCHAR2 default '',
Options IN BINARY_INTEGER default 0 );
可以知道Q如果TO_DATE('01-jan-1988','DD-MON-YYYY')p|Q将D以上错误
所以解军_法可以ؓ
1、Alter session set NLS_LANGUAGE=American
2、用cM如下的方法执?br />execute dbms_logmnr.start_logmnr (DictFileName=> 'f:\temp2\TESTDICT.ora', starttime => TO_DATE(
'01-01-1988','DD-MM-YYYY'), endTime=>TO_DATE('01-01-2988','DD-MM-YYYY'));



]]>
ORACLE之常用FAQ V1.0 (1) W一部分、SQL&PL/SQLhttp://www.shnenglu.com/ivenher/articles/13149.html爱饭?/dc:creator>爱饭?/author>Fri, 29 Sep 2006 09:22:00 GMThttp://www.shnenglu.com/ivenher/articles/13149.htmlhttp://www.shnenglu.com/ivenher/comments/13149.htmlhttp://www.shnenglu.com/ivenher/articles/13149.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/13149.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/13149.html W一部分、SQL&PL/SQL

[Q]怎么h询特D字W,如通配W?与_
[A]select * from table where name like 'A\_%' escape '\'
[Q]如何插入单引号到数据库表?/font>
[A]可以用ASCII码处理,其它Ҏ字符?amp;也一P?
insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'
或者用两个单引可CZ?br />or insert into t values('I''m'); -- 两个''可以表示一?
[Q]怎样讄事务一致?/font>
[A]set transaction [isolation level] read committed; 默认语句U一致?br />set transaction [isolation level] serializable;
read only; 事务U一致?br />[Q]怎么样利用游标更新数?/font>
[A]cursor c1 is
select * from tablename
where name is null for update [of column]
…?br />update tablename set column = …?br />where current of c1;
[Q]怎样自定义异?/font>
[A] pragma_exception_init(exception_name,error_number);
如果立即抛出异常
raise_application_error(error_number,error_msg,true|false);
其中number?20000?20999Q错误信息最?048B
异常变量
SQLCODE 错误代码
SQLERRM 错误信息
[Q]十进制与十六q制的{?/font>
[A]8i以上版本Q?br />to_char(100,'XX')
to_number('4D','XX')
8i以下的进制之间的转换参考如下脚?br />create or replace function to_base( p_dec in number, p_base in number )
return varchar2
is
l_str varchar2(255) default NULL;
l_num number default p_dec;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
if ( p_dec is null or p_base is null ) then
return null;
end if;
if ( trunc(p_dec) p_dec OR p_dec 20;
[Q]怎么h取重复记?/font>
[A]select * from table t1 where where t1.rowed !=
(select max(rowed) from table t2
where t1.id=t2.id and t1.name=t2.name)
或?br />select count(*), t.col_a,t.col_b from table t
group by col_a,col_b
having count(*)>1
如果惛_除重复记录,可以把第一个语句的select替换为delete
[Q]怎么栯|自M?/font>
[A]8i以上版本Q不影响M?br />pragma autonomous_transaction;
…?br />commit|rollback;
[Q]怎么样在q程中暂停指定时?/font>
[A]DBMS_LOCK包的sleepq程
如:dbms_lock.sleep(5);表示暂停5U?br />[Q]怎么样快速计事务的旉与日志量
[A]可以采用cM如下的脚?br />DECLARE
start_time NUMBER;
end_time NUMBER;
start_redo_size NUMBER;
end_redo_size NUMBER;
BEGIN
start_time := dbms_utility.get_time;
SELECT VALUE INTO start_redo_size FROM v$mystat m,v$statname s
WHERE m.STATISTIC#=s.STATISTIC#
AND s.NAME='redo size';
--transaction start
INSERT INTO t1
SELECT * FROM All_Objects;
--other dml statement
COMMIT;
end_time := dbms_utility.get_time;
SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s
WHERE m.STATISTIC#=s.STATISTIC#
AND s.NAME='redo size';
dbms_output.put_line('Escape Time:'||to_char(end_time-start_time)||' centiseconds');
dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes');
END;
[Q]怎样创徏临时?/font>
[A]8i以上版本
create global temporary tablename(column list)
on commit preserve rows; --提交保留数据 会话临时?br />on commit delete rows; --提交删除数据 事务临时?br />临时表是相对于会话的Q别的会话看不到该会话的数据?br />[Q]怎么样在PL/SQL中执行DDL语句
[A]1?i以下版本dbms_sql?br />2?i以上版本q可以用
execute immediate sql;
dbms_utility.exec_ddl_statement('sql');
[Q]怎么栯取IP地址
[A]服务?817以上)Qutl_inaddr.get_host_address
客户端:sys_context('userenv','ip_address')
[Q]怎么样加密存储过E?/font>
[A]用wrap命oQ如Q假定你的存储过E保存ؓa.sqlQ?br />wrap iname=a.sql
PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.
Processing a.sql to a.plb
提示a.sql转换为a.plbQ这是加密了的脚本Q执行a.plb卛_生成加密了的存储q程
[Q]怎么样在ORACLE中定时运行存储过E?/font>
[A]可以利用dbms_job包来定时q行作业Q如执行存储q程Q一个简单的例子Q提交一个作业:
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;',SYSDATE,'SYSDATE + 1');
commit;
END;
之后Q就可以用以下语句查询已l提交的作业
select * from user_jobs;
[Q]怎么样从数据库中获得毫秒
[A]9i以上版本Q有一个timestampcd获得毫秒Q如
SQL>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,
to_char(current_timestamp) time2 from dual;
TIME1 TIME2
----------------------------- ----------------------------------------------------------------
2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00
可以看到Q毫U在to_char中对应的是FF?br />8i以上版本可以创徏一个如下的java函数
SQL>create or replace and compile
java source
named "MyTimestamp"
as
import java.lang.String;
import java.sql.Timestamp;
public class MyTimestamp
{
public static String getTimestamp()
{
return(new Timestamp(System.currentTimeMillis())).toString();
}
};
SQL>java created.
注:注意java的语法,注意大小?br />SQL>create or replace function my_timestamp return varchar2
as language java
name 'MyTimestamp.getTimestamp() return java.lang.String';
/
SQL>function created.
SQL>select my_timestamp,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') ORACLE_TIME from dual;
MY_TIMESTAMP ORACLE_TIME
------------------------ -------------------
2003-03-17 19:15:59.688 2003-03-17 19:15:59
如果只想获得1/100U?hsecs)Q还可以利用dbms_utility.get_time
[Q]如果存在更斎ͼ不存在就插入可以用一个语句实现吗
[A]9i已经支持了,是MergeQ但是只支持select子查询,
如果是单条数据记录,可以写作select …?from dual的子查询?br />语法为:
MERGE INTO table
USING data_source
ON (condition)
WHEN MATCHED THEN update_clause
WHEN NOT MATCHED THEN insert_clause;
?br />MERGE INTO course c
USING (SELECT course_name, period,
course_hours
FROM course_updates) cu
ON (c.course_name = cu.course_name
AND c.period = cu.period)
WHEN MATCHED THEN
UPDATE
SET c.course_hours = cu.course_hours
WHEN NOT MATCHED THEN
INSERT (c.course_name, c.period,
c.course_hours)
VALUES (cu.course_name, cu.period,
cu.course_hours);
[Q]怎么实现左联Q右联与外联
[A]?i以前可以q么?
左联Q?br />select a.id,a.name,b.address from a,b
where a.id=b.id(+)
双:
select a.id,a.name,b.address from a,b
where a.id(+)=b.id
外联
SELECT a.id,a.name,b.address
FROM a,b
WHERE a.id = b.id(+)
UNION
SELECT b.id,'' name,b.address
FROM b
WHERE NOT EXISTS (
SELECT * FROM a
WHERE a.id = b.id);
?i以上Q已l开始支持SQL99标准Q所以,以上语句可以写成Q?br />默认内部联结Q?br />select a.id,a.name,b.address,c.subject
from (a inner join b on a.id=b.id)
inner join c on b.name = c.name
where other_clause
左联
select a.id,a.name,b.address
from a left outer join b on a.id=b.id
where other_clause

select a.id,a.name,b.address
from a right outer join b on a.id=b.id
where other_clause
外联
select a.id,a.name,b.address
from a full outer join b on a.id=b.id
where other_clause
or
select a.id,a.name,b.address
from a full outer join b using (id)
where other_clause
[Q]怎么实现一条记录根据条件多表插?/font>
[A]9i以上可以通过Insert all语句完成Q仅仅是一个语句,如:
INSERT ALL
WHEN (id=1) THEN
INTO table_1 (id, name)
values(id,name)
WHEN (id=2) THEN
INTO table_2 (id, name)
values(id,name)
ELSE
INTO table_other (id, name)
values(id, name)
SELECT id,name
FROM a;
如果没有条g的话Q则完成每个表的插入Q如
INSERT ALL
INTO table_1 (id, name)
values(id,name)
INTO table_2 (id, name)
values(id,name)
INTO table_other (id, name)
values(id, name)
SELECT id,name
FROM a;
[Q]如何实现行列转换
[A]1、固定列数的行列转换
?br />student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 p 60
student2 语文 90
student2 数学 80
student2 p 100
…?br />转换?
语文 数学 p
student1 80 70 60
student2 90 80 100
…?br />语句如下Q?br />select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'p', grade,null)) "p"
from table
group by student
2、不定列行列转换
?br />c1 c2
--------------
1 ?br />1 ?br />1 ?br />2 ?br />2 ?br />3 ?br />…?br />转换?br />1 我是?br />2 知道
3 ?br />q一cd的{换必d助于PL/SQL来完成,q里l一个例?br />CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;
/
SQL> select distinct c1 ,get_c2(c1) cc2 from table;卛_
[Q]怎么样实现分l取前N条记?/font>
[A]8i以上版本Q利用分析函?br />如获取每个部门薪水前三名的员工或每个班成l前三名的学生?br />Select * from
(select depno,ename,sal,row_number() over (partition by depno
order by sal desc) rn
from emp)
where rn host lsntctl start
或者unix/linuxq_?br />SQL>!
windowsq_?br />SQL>$
ȝQHOST 可以直接执行OS命o?
备注Qcd命o无法正确执行?br />[Q]怎么讄存储q程的调用者权?/font>
[A]普通存储过E都是所有者权限,如果惌|调用者权限,请参考如下语?br />create or replace
procedure …?)
AUTHID CURRENT_USER
As
begin
…?br />end;
[Q]怎么快速获得用户下每个表或表分区的记录?/font>
[A]可以分析该用P然后查询user_tables字典Q或者采用如下脚本即?br />SET SERVEROUTPUT ON SIZE 20000
DECLARE
miCount INTEGER;
BEGIN
FOR c_tab IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE 'select count(*) from "' || c_tab.table_name || '"' into miCount;
dbms_output.put_line(rpad(c_tab.table_name,30,'.') || lpad(miCount,10,'.'));
--if it is partition table
SELECT COUNT(*) INTO miCount FROM User_Part_Tables WHERE table_name = c_tab.table_name;
IF miCount >0 THEN
FOR c_part IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = c_tab.table_name) LOOP
EXECUTE IMMEDIATE 'select count(*) from ' || c_tab.table_name || ' partition (' || c_part.partition_name || ')'
INTO miCount;
dbms_output.put_line(' '||rpad(c_part.partition_name,30,'.') || lpad(miCount, 10,'.'));
END LOOP;
END IF;
END LOOP;
END;
[A]怎么在Oracle中发邮g
[Q]可以利用utl_smtp包发邮gQ以下是一个发送简单邮件的例子E序
/****************************************************************************
parameter: Rcpter in varchar2 接收者邮?br />Mail_Content in Varchar2 邮g内容
desc: ·发送邮件到指定邮箱
·只能指定一个邮,如果需要发送到多个邮箱Q需要另外的辅助E序
****************************************************************************/
CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2,
mail_content IN VARCHAR2)
IS
conn utl_smtp.connection;
--write title
PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
BEGIN
utl_smtp.write_data(conn, NAME||': '|| HEADER||utl_tcp.CRLF);
END;
BEGIN
--opne connect
conn := utl_smtp.open_connection('smtp.com');
utl_smtp.helo(conn, 'oracle');
utl_smtp.mail(conn, 'oracle info');
utl_smtp.rcpt(conn, Rcpter);
utl_smtp.open_data(conn);
--write title
send_header('From', 'Oracle Database');
send_header('To', '"Recipient" ');
send_header('Subject', 'DB Info');
--write mail content
utl_smtp.write_data(conn, utl_tcp.crlf || mail_content);
--close connect
utl_smtp.close_data(conn);
utl_smtp.quit(conn);
EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
BEGIN
utl_smtp.quit(conn);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
WHEN OTHERS THEN
NULL;
END sp_send_mail;
[A]怎么样在Oracle中写操作pȝ文gQ如写日?/font>
[Q]可以利用utl_file包,但是Q在此之前,要注意设|好Utl_file_dir初始化参?br />/**************************************************************************
parameter:textContext in varchar2 日志内容
desc: ·写日?把内容记到服务器指定目录?br />·必须配置Utl_file_dir初始化参敎ͼq保证日志\径与Utl_file_dir路径一致或者是其中一?br />****************************************************************************/
CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2)
IS
file_handle utl_file.file_type;
Write_content VARCHAR2(1024);
Write_file_name VARCHAR2(50);
BEGIN
--open file
write_file_name := 'db_alert.log';
file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
--write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content);
END IF;
--close file
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END sp_Write_log;



]]>
ORACLE中用动态游标的例子 http://www.shnenglu.com/ivenher/articles/13146.html爱饭?/dc:creator>爱饭?/author>Fri, 29 Sep 2006 07:54:00 GMThttp://www.shnenglu.com/ivenher/articles/13146.htmlhttp://www.shnenglu.com/ivenher/comments/13146.htmlhttp://www.shnenglu.com/ivenher/articles/13146.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/13146.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/13146.html  /*
   * NAMEQ?br />   *   get_ope_popedom
   *
   * PARAMETERQ?br />   *   sta_id   - 车站~号Q多个站时以逗号分隔
   *
   * RETURN:
   *   --对应车站~号的R站名Uͼ多个站时以逗号分隔
   *
   * AUTHOR:
   *   舉|
   *
   * DESCRIPTION:
   *   --Ҏ传入的R站编可回相应的车站名称
   *
   */
as
Result varchar2(1000);
name_temp varchar2(40);
type cursor_t is ref cursor;
emp_cur cursor_t ;
begin
  OPEN emp_cur FOR 'SELECT sta_name FROM station_code where sta_code =:1'
  using sta_id;
  LOOP
      FETCH emp_cur INTO name_temp;
      If (emp_cur%NOTFOUND) Then
         EXIT;
      End if;
      Result := Result || name_temp || ',';
  end loop;
  close emp_cur;
  Result := substr(Result,1,(length(Result)-1));
  return(Result);
end get_ope_popedom;


]]>
[Oracle]中如何掌握与使用游标Q?Q?/title><link>http://www.shnenglu.com/ivenher/articles/13101.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Thu, 28 Sep 2006 06:17:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/13101.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/13101.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/13101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/13101.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/13101.html</trackback:ping><description><![CDATA[ <a name="_Toc112150288"> <font size="2"> <span lang="EN-US">1<span></span></span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">游标的属?/span> </font> </a> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="1xbnx39" id="3"> <font size="2"> <span lang="EN-US">  oracle </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游标?/span> <span lang="EN-US">4</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个属性:</span> <span lang="EN-US">%ISOPEN</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">%FOUND</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">%NOTFOUND</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> <span lang="EN-US">%ROWCOUNT</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span> </font> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="1n39pfp" id="4"> <font size="2"> <span lang="EN-US">  %ISOPEN</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">判断游标是否被打开Q如果打开</span> <span lang="EN-US">%ISOPEN</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">{于</span> <span lang="EN-US">true,</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">否则{于</span> <span lang="EN-US">false</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> </font> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="13bpz99" id="5"> <font size="2"> <span lang="EN-US">  %FOUND %NOTFOUND</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">判断游标所在的行是否有效,如果有效Q则</span> <span lang="EN-US">%FOUNDD</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">{于</span> <span lang="EN-US">true</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q否则等?/span> <span lang="EN-US">false</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> </font> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="bfbdfx9" id="6"> <font size="2"> <span lang="EN-US">  %ROWCOUNT</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q回当前位置为止游标d的记录行数?/span> </font> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: center" align="center"> </p> <div class="9399vlf" id="7"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  隐式游标和显式游?/font> </span> </div> <p> </p> <div class="vnzl3xn" id="8"> <div align="center"> <table style="mso-cellspacing: 0cm" cellspacing="0" cellpadding="0" width="500" border="1"> <tbody> <tr> <td> <div> </div> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: center" align="center"> </p> <div class="fz9199b" id="9"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">隐式游标</span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="9jbfdvl" id="10"> <div class="lnr3zp9" id="14"> <div class="lvhdpnj" id="18"> <div class="13xb9lj" id="22"> <div class="33x93vl" id="26"> </div> </div> </div> </div> </div> </td> <td> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: center" align="center"> </p> <div class="t9nbf39" id="11"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">昑ּ游标</span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="tzjnx3d" id="12"> <div class="3hbvhhx" id="16"> <div class="9bv9zxv" id="20"> <div class="9x9999d" id="24"> </div> </div> </div> </div> </td> </tr> <tr> <td> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="lpplftj" id="13"> <font size="2"> <span lang="EN-US">PL/SQL</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">l护Q当执行查询时自动打开和关?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="dphjljz" id="10"> <div class="dprfh99" id="14"> <div class="3ztfhnl" id="18"> <div class="3pzt39n" id="22"> <div class="xxjv3zf" id="26"> </div> </div> </div> </div> </div> </td> <td> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="tvhjvl3" id="15"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在程序中昑ּ定义、打开、关闭,游标有一个名字?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="939zzxf" id="12"> <div class="d3f9z93" id="16"> <div class="3t9lpdb" id="20"> <div class="b3x9pjx" id="24"> </div> </div> </div> </div> </td> </tr> <tr> <td> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="bzbdp99" id="17"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游标属性前~?/span> <span lang="EN-US">SQL </span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="zv3j99d" id="10"> <div class="p9thbzz" id="14"> <div class="93999vb" id="18"> <div class="z3dj3jf" id="22"> <div class="t1p3j9b" id="26"> </div> </div> </div> </div> </div> </td> <td> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="9399993" id="19"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游标属性的前缀是游标名</span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="33hn999" id="12"> <div class="nrjd3rp" id="16"> <div class="ptxp3jh" id="20"> <div class="h1n3jl9" id="24"> </div> </div> </div> </div> </td> </tr> <tr> <td> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="919bdbr" id="21"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属?/span> <span lang="EN-US">%ISOPEN</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">L?/span> <span lang="EN-US">FALSE </span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="dh39vbj" id="10"> <div class="rx99zzf" id="14"> <div class="fp3npnl" id="18"> <div class="fxz9pl3" id="22"> <div class="t3399x9" id="26"> </div> </div> </div> </div> </div> </td> <td> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="zt93zfd" id="23"> <font size="2"> <span lang="EN-US">%ISOPEN</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ游标的状态确定?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="zrvhffd" id="12"> <div class="tx3h9nx" id="16"> <div class="3rtft9x" id="20"> <div class="h399dtz" id="24"> </div> </div> </div> </div> </td> </tr> <tr> <td> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="3nhj9r9" id="25"> <font size="2"> <span lang="EN-US">SELECT</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句带有</span> <span lang="EN-US">INTO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子串Q只有一行数据被处理</span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="htl3jxv" id="10"> <div class="t9d139f" id="14"> <div class="l93przp" id="18"> <div class="ln91trf" id="22"> <div class="tt9tn3p" id="26"> </div> </div> </div> </div> </div> </td> <td> <div> </div> <div> </div> <div> </div> <div> </div> <div> </div> <p class="MsoNormal"> </p> <div class="x9zxtjh" id="27"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以处理多行数据Q在E序中设|@环,取出每一行数据?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: " unicode="" arial=""> <o> </o> </span> </font> </div> <p> </p> <div class="llj99bt" id="28"> </div> </td> </tr> </tbody> </table> </div> </div> <p class="MsoNormal" style="TEXT-INDENT: 21pt"> </p> <div class="vnrtflt" id="29"> <span lang="EN-US"> <font size="2"> <o> </o> </font> </span> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left" align="left"> </p> <div class="bnx9ltj" id="30"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">  记录变量</span> <span lang="EN-US"> <o> </o> </span> </font> </strong> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt"> </p> <div class="fpb339h" id="31"> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">  定义一个记录变量?/span> <span lang="EN-US">TYPE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命o?/span> <span lang="EN-US">%ROWTYPE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/span> </font> </div> <p> </p> <div class="ff39l9d" id="32"> <div class="9393dbh" id="48"> <span lang="EN-US"> </span> </div> </div> <div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px"> <pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"> <div class="9r99999" id="33"> <div> <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> <font size="2"> <span style="COLOR: #0000ff">DECLARE</span> </font> <span style="COLOR: #000000"> <font size="2">R_emp EMP</font> </span> <span style="COLOR: #808080"> <font size="2">%</font> </span> <font size="2"> <span style="COLOR: #000000">ROWTYPE;</span> <span style="COLOR: #0000ff">CURSOR</span> <span style="COLOR: #000000"> c_emp </span> <span style="COLOR: #0000ff">IS</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000"> emp;</span> </font> </div> </div> </pre> </div> <div class="bjvhflb" id="34"> <div class="n33rvbr" id="38"> </div> </div> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="j9xv939" id="35"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  或:</font> </span> </div> <p> </p> <div class="v39b9lz" id="36"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> </span> </div> <div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px"> <pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"> <div class="f3dxjpn" id="37"> <div> <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> <span style="COLOR: #0000ff">DECLARE</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">CURSOR</span> <span style="COLOR: #000000"> c_emp </span> <span style="COLOR: #0000ff">IS</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">SELECT</span> <span style="COLOR: #000000"> ename,salary </span> <span style="COLOR: #0000ff">FROM</span> <span style="COLOR: #000000"> emp;R_emp c_emp</span> <span style="COLOR: #808080">%</span> <span style="COLOR: #000000">ROWTYPE;</span> </div> </div> </pre> </div> <div class="9nh3dlr" id="34"> <div class="pb3xjzf" id="38"> </div> </div> <p class="MsoNormal" style="TEXT-INDENT: 21.1pt"> </p> <div class="tlpjtjh" id="39"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">  带参数的游标</span> <span lang="EN-US"> <o> </o> </span> </font> </strong> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt"> </p> <div class="pr3ztj3" id="40"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  与存储过E和函数怼Q可以将参数传递给游标q在查询中用。这对于处理在某U条件下打开游标的情况非常有用。它的语法如下:</font> </span> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt"> </p> <div class="9fzb3bp" id="41"> <span lang="EN-US"> <font size="2">  CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;</font> </span> </div> <p> </p> <p class="MsoNormal" style="MARGIN-BOTTOM: 12pt; TEXT-INDENT: 21pt"> </p> <div class="f3rl3l9" id="42"> <span lang="EN-US"> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  定义参数的语法如下:</font> </span> </div> <p> </p> <p class="MsoNormal" style="MARGIN-BOTTOM: 12pt; TEXT-INDENT: 21pt"> </p> <div class="339d9j3" id="43"> <span lang="EN-US"> <font size="2">  Parameter_name [IN] data_type[{:=|DEFAULT} value]</font> </span> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  与存储过E不同的是,游标只能接受传递的|而不能返回倹{参数只定义数据cdQ没有大?/font> </span> <span lang="EN-US"> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  </font> </span> </div> <div> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  </font> </span> </div> <div> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  另外可以l参数设定一个缺省|当没有参数g递给游标Ӟ׃用缺省倹{游标中定义的参数只是一个占位符Q在别处引用该参C一定可靠?/font> </span> <span lang="EN-US"> <br /> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  </font> </span> </div> <div> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font size="2">  在打开游标时给参数赋|语法如下Q?/font> </span> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"> </p> <div class="r9jd39x" id="45"> <span lang="EN-US"> <font size="2">  OPEN cursor_name[value[,value]....];<strong><span><o></o></span></strong></font> </span> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21.1pt; TEXT-ALIGN: left" align="left"> </p> <div class="3vh3tr9" id="46"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">  游标</span> <span lang="EN-US">FOR</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环</span> <span lang="EN-US"> <o> </o> </span> </font> </strong> </div> <p> </p> <p class="MsoNormal" style="TEXT-INDENT: 21pt"> </p> <div class="xztn93f" id="47"> <font size="2"> <span lang="EN-US">  FOR</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环的游标按照正常的声明方式声明Q它的优点在于不需要显式的打开、关闭、取数据Q测试数据的存在、定义存放数据的变量{等。游?/span> <span lang="EN-US">FOR </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">循环的语法如下:</span> </font> </div> <p> </p> <div class="9ztntz9" id="32"> <div class="dd3zlrf" id="48"> <span lang="EN-US"> </span> </div> </div> <div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px"> <pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"> <div class="np3t3jf" id="49"> <div> <!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> <font size="2"> <span style="COLOR: #0000ff">FOR</span> <span style="COLOR: #000000"> record_name </span> <span style="COLOR: #808080">IN</span> </font> <span style="COLOR: #000000"> <font size="2">(corsor_name</font> </span> <font size="2"> <span style="COLOR: #ff0000">[</span> <span style="COLOR: #ff0000">(parameter[,parameter</span> <span style="COLOR: #ff0000">]</span> </font> <font size="2"> <span style="COLOR: #000000">...)]</span> <span style="COLOR: #808080">|</span> </font> <font size="2"> <span style="COLOR: #000000"> (query_difinition)LOOPstatements</span> <span style="COLOR: #0000ff">END</span> <span style="COLOR: #000000"> LOOP;</span> </font> </div> </div> </pre> </div> <div class="v39hj99" id="ParagraphCount" style="DISPLAY: none"> </div> <img src ="http://www.shnenglu.com/ivenher/aggbug/13101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-28 14:17 <a href="http://www.shnenglu.com/ivenher/articles/13101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle PL/SQL语言基础 ?/title><link>http://www.shnenglu.com/ivenher/articles/12987.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Tue, 26 Sep 2006 08:52:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/12987.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/12987.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/12987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/12987.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/12987.html</trackback:ping><description><![CDATA[ <strong> <font color="#ac0000">控制l构<br /><br /></font> </strong>  控制l构控制PL/SQLE序程的代码行,PL/SQL支持条g控制和@环控制结构?br /><br />  语法和用?br /><br />   IF..THEN<br /><br />  语法Q?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>IF condition THEN<br /> Statements 1;<br /> Statements 2;<br /> ....<br />END IF <br /></td></tr></tbody></table><br />  IF语句判断条gcondition是否为TRUEQ如果是Q则执行THEN后面的语句,如果condition为false或NULL则蟩qTHEN到END IF之间的语句,执行END IF后面的语句?br /><br />  <b>IF..THEN...ELSE</b><br /><br />  语法:<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>IF condition THEN<br /> Statements 1;<br /> Statements 2;<br /> ....<br />ELSE<br /> Statements 1;<br /> Statements 2;<br /> ....<br />END IF </td></tr></tbody></table><br />  如果条gcondition为TRUE,则执行THEN到ELSE之间的语句,否则执行ELSE到END IF之间的语句?br /><br />  IF 可以嵌套Q可以在IF 或IF ..ELSE语句中用IF或IF..ELSE语句?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>if (a>b) and (a>c) then<br />  g:=a;<br />else<br />  g:=b;<br />  if c>g then<br />   g:=c;<br />  end if<br />end if</td></tr></tbody></table><br />  <b>IF..THEN..ELSIF</b><br /><br />  语法Q?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>IF condition1 THEN<br /> statement1;<br />ELSIF condition2 THEN<br /> statement2;<br />ELSIF condition3 THEN<br /> statement3;<br />ELSE<br /> statement4;<br />END IF;<br /> statement5;<br /></td></tr></tbody></table><br />  如果条gcondition1为TRUE则执行statement1,然后执行statement5,否则判断condition2是否为TRUE,若ؓTRUE则执行statement2,然后执行statement5,对于condition3也是相同的,如果condition1Qcondition2Qcondition3都不成立Q那么将执行statement4,然后执行statement5?br /><br />  <font color="#ac000"><b>循环控制</b></font><br /><br />  循环控制的基本Ş式是LOOP语句QLOOP和END LOOP之间的语句将无限ơ的执行。LOOP语句的语法如下:<br /><br />  LOOP <br />   statements;<br />  END LOOP<br /><br />  LOOP和END LOOP之间的语句无限次的执行显然是不行的,那么在用LOOP语句时必M用EXIT语句Q强制@环结束,例如Q?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>X:=100;<br />LOOP<br /> X:=X+10;<br /> IF X>1000 THEN<br />  EXIT;<br /> END IF<br />END LOOP;<br />Y:=X;</td></tr></tbody></table><br />  此时Y的值是1010.<br /><br />  EXIT WHEN语句结束@环,如果条g为TRUEQ则l束循环?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>X:=100;<br />LOOP<br />X:=X+10;<br />EXIT WHEN X>1000;<br />X:=X+10;<br />END LOOP;<br />Y:=X;<br /></td></tr></tbody></table><br />  <b>WHILE..LOOP</b><br /><br />  WHILE..LOOP有一个条件与循环相联p,如果条g为TRUE,则执行@环体内的语句Q如果结果ؓFALSE,则结束@环?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>X:=100;<br />WHILE X<=1000 LOOP<br /> X:=X+10;<br />END LOOP;<br />Y=X; </td></tr></tbody></table><br />  <b>FOR...LOOP</b><br /><br />  语法Q?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>FOR counter IN [REVERSE] start_range....end_range LOOP<br />statements;<br />END LOOP;</td></tr></tbody></table><br />  LOOP和WHILE循环的@环次数都是不定的,FOR循环的@环次数是固定的,counter是一个隐式声明的变量Q他的初始值是start_range,W二个值是start_range+1,直到end_range,如果start_range{于end _range,那么循环执行一ơ。如果用了REVERSE关键字,那么范围是一个降序?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>X:=100;<br />FOR v_counter in 1..10 loop<br />x:=x+10;<br /><br />end loop<br />y:=x;</td></tr></tbody></table><br />  如果要退出for循环可以使用EXIT语句?br /><br />  <b>标签</b><br /><br />  用户可以使用标签使程序获得更好的可读性。程序块或@环都可以被标记。标{形式?lt;<label>>?br /><br />  标记E序?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td><<label_name>><br />[DECLARE]<br />... ... ...<br />BEGIN<br />........<br />[EXCEPTION]<br />.......<br />END label_name</label_name></td></tr></tbody></table><br />  标记循环<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td><<outer_name>><br />LOOP<br />.........<br /><<inner_loop>><br />loop<br />..........<br /><<innermost_loop>><br />loop<br />....<br /><br />EXIT outer_loop WHEN v_condition=0;<br />end loop innermost_loop;<br />..........<br />END LOOP inner_loop;<br />END LOOP outer_loop; </innermost_loop></inner_loop></outer_name></td></tr></tbody></table><br />  <b>GOTO语句</b><br /><br />  语法Q?br /><br />  GOTO LABEL;<br /><br />  执行GOTO语句Ӟ控制会立卌{到由标签标记的语句。PL/SQL中对GOTO语句有一些限Ӟ对于块、@环、IF语句而言Q从外层跌{到内层是非法的?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>X Q?100;<br />FOR V_COUNTER IN 1..10 LOOP<br /> IF V_COUNTER =4 THEN<br />  GOTO end_of_loop<br /> END IF<br /> X:=X+10;<br /> <<end_of_loop>><br /> NULL<br />END LOOP<br /><br />Y:=X; </end_of_loop></td></tr></tbody></table><br />  注意QNULL是一个合法的可执行语句?br /><br />  <b>嵌套</b><br /><br />  E序块的内部可以有另一个程序块q种情况UCؓ嵌套。嵌套要注意的是变量Q定义在最外部E序块中的变量可以在所有子块中使用Q如果在子块中定义了与外部程序块变量相同的变量名Q在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能q块蟩转道子块中,反之则是合法的?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>《OUTER BLOCK?br />DECLARE<br /> A_NUMBER INTEGERQ?br /> B_NUMBER INTEGERQ?br />BEGIN<br /> --A_NUMBER and B_NUMBER are available here<br /> <<sub_block>><br /> DECLARE<br /> C_NUMBER INTEGER<br /> B_NUMBER NUMBER(20)<br />BEGIN<br /> C_NUMBER:=A_NUMBER;<br /> C_NUMBER=OUTER_BLOCK.B_NUMBER;<br />END SUB_BLOCK;<br />END OUT_BLOCK;<br /></sub_block></td></tr></tbody></table><br />  <font color="#ac000"><b>结</b></font><br /><br />  我们在这文章中介绍了PL/SQL的基语法以及如何使用PL/SQL语言设计和运行PL/SQLE序块,q将PL/SQLE序整合到Oracle服务器中,虽然PL/SQLE序作ؓ功能块嵌入Oracle数据库中Q但PL/SQL与ORACLE数据库的紧密l合使得来多的Oracle数据库管理员和开发h员开始用PL/SQL?/label><img src ="http://www.shnenglu.com/ivenher/aggbug/12987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-26 16:52 <a href="http://www.shnenglu.com/ivenher/articles/12987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle PL/SQL语言基础 ?/title><link>http://www.shnenglu.com/ivenher/articles/12986.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Tue, 26 Sep 2006 08:51:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/12986.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/12986.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/12986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/12986.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/12986.html</trackback:ping><description><![CDATA[ <strong> <font color="#ac0000">变量和常?br /><br /></font> </strong>  变量存放在内存中以获得|能被PL/SQL块引用。你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的?br /><br />  <b>声明变量</b><br /><br />  变量一般都在PL/SQL块的声明部分声明QPL/SQL是一U强壮的cd语言Q这是说在引用变量前必首先声明,要在执行或异常处理部分用变量,那么变量必须首先在声明部分进行声明?br /><br />  声明变量的语法如下:<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]</td></tr></tbody></table><br />  注意:可以在声明变量的同时l变量强制性的加上NOT NULLU束条gQ此时变量在初始化时必须赋倹{?br /><br />  <b>l变量赋?/b><br /><br />  l变量赋值有两种方式Q?br /><br />  . 直接l变量赋?br /><br />   X:=200;<br />   Y=Y+(X*20);<br /><br />  . 通过SQL SELECT INTO 或FETCH INTOl变量赋?br /><br />SELECT SUM(SALARY),SUM(SALARY*0.1)<br />INTO TOTAL_SALARY,TATAL_COMMISSION<br />FROM EMPLOYEE<br />WHERE DEPT=10;<br /><br />  <b>帔R</b><br /><br />  帔R与变量相|但常量的值在E序内部不能改变Q常量的值在定义时赋予,Q他的声明方式与变量怼Q但必须包括关键字CONSTANT。常量和变量都可被定义ؓSQL和用户定义的数据cd?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>ZERO_VALUE CONSTANT NUMBER:=0;</td></tr></tbody></table><br />  q个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、gؓ0的常量?br /><br />  标量(scalar)数据cd<br /><br />  标量(scalar)数据cd没有内部lgQ他们大致可分ؓ以下四类Q?br /><br />   . number<br />   . character<br />   . date/time<br />   . boolean<br /><br />  ?昄了数字数据类型;?昄了字W数据类型;?昄了日期和布尔数据cd?br /><br />  ? Scalar Types:Numeric<br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>Datatype</td><td>Range</td><td>Subtypes</td><td>description</td></tr><tr><td valign="top" height="85">BINARY_INTEGER</td><td valign="top" height="85">-214748-2147483647</td><td valign="top" height="85">NATURAL<br />NATURAL<br />NPOSITIVE<br />POSITIVEN<br />SIGNTYPE <br /></td><td valign="top" height="85">用于存储单字节整数?br />要求存储长度低于NUMBER倹{?br />用于限制范围的子cd(SUBTYPE):<br /> NATURAL:用于非负?br /> POSITIVE:只用于正?br /> NATURALN:只用于非负数和非NULL?br /> POSITIVEN:只用于正敎ͼ不能用于NULL?br /> SIGNTYPE:只有?-1??.</td></tr><tr><td valign="top">NUMBER</td><td valign="top">1.0E-130-9.99E125</td><td>DEC<br />DECIMAL<br />DOUBLE <br />PRECISION<br />FLOAT <br />INTEGERIC<br />INT<br />NUMERIC<br />REAL<br />SMALLINT</td><td valign="top">存储数字|包括整数和QҎ。可以选择_ֺ和刻度方式,语法Q?br />number[Q?precision>[,<scale>]Q]?br />~省的精度是38,scale?.</scale></precision></td></tr><tr><td>PLS_INTEGER</td><td>-2147483647-2147483647</td><td> </td><td>与BINARY_INTEGER基本相同Q但采用机器q算ӞPLS_INTEGER提供更好的性能 ?/td></tr></tbody></table><br />  ? 字符数据cd <br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>datatype</td><td>rang</td><td>subtype</td><td>description</td></tr><tr><td>CHAR</td><td>最大长?2767字节 </td><td>CHARACTER</td><td>存储定长字符Ԍ如果长度没有定Q缺省是1</td></tr><tr><td>LONG</td><td>最大长?147483647字节</td><td> </td><td>存储可变长度字符?/td></tr><tr><td>RAW </td><td>最大长?2767字节</td><td> </td><td>用于存储二进制数据和字节字符Ԍ当在两个数据库之间进行传递时QRAW数据不在字符集之间进行{换?/td></tr><tr><td>LONGRAW</td><td>最大长?147483647</td><td> </td><td>与LONG数据cd怼Q同样他也不能在字符集之间进行{换?/td></tr><tr><td>ROWID</td><td>18个字?/td><td> </td><td>与数据库ROWID伪列cd相同Q能够存储一个行标示W,可以行标示W看作数据库中每一行的唯一键倹{?/td></tr><tr><td>VARCHAR2</td><td>最大长?2767字节</td><td>STRINGVARCHAR</td><td>与VARCHAR数据cd怼Q存储可变长度的字符丌Ӏ声明方法与VARCHAR相同 </td></tr></tbody></table><br />  ? DATE和BOOLEAN<br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>datatype</td><td>range </td><td>description</td></tr><tr><td>BOOLEAN</td><td>TRUE/FALSE</td><td>存储逻辑值TRUE或FALSE,无参?/td></tr><tr><td>DATE</td><td>01/01/4712 BC </td><td>存储固定长的日期和时间|日期g包含旉</td></tr></tbody></table><br />  LOB数据cd<br /><br />  LOB(大对?Large object) 数据cd用于存储cM囑փQ声韌L大型数据对象QLOB数据对象可以是二q制数据也可以是字符数据Q其最大长度不过4G。LOB数据cd支持L讉K方式QLONG只支持顺序访问方式。LOB存储在一个单独的位置上,同时一?LOB定位W?(LOB locator)存储在原始的表中Q该定位W是一个指向实际数据的指针。在PL/SQL中操作LOB数据对象使用ORACLE提供的包DBMS_LOB.LOB数据cd可分Z下四c:<br /><br />  . BFILE<br />  . BLOB<br />  . CLOB<br />  . NCLOB<br /><br />  操作W?br /><br />  与其他程序设计语a相同QPL/SQL有一pd操作W。操作符分ؓ下面几类Q?br /><br />  . 术操作W?br /><br />  . 关系操作W?br /><br />  . 比较操作W?br /><br />  . 逻辑操作W?br /><br />  术操作W如?所C?br /><br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>operator</td><td>operation</td></tr><tr><td>+ </td><td>?/td></tr><tr><td>- </td><td>?/td></tr><tr><td>/ </td><td>?/td></tr><tr><td>* </td><td>?/td></tr><tr><td>**</td><td>乘方</td></tr></tbody></table><br />  关系操作W主要用于条件判断语句或用于where子串中,关系操作W检查条件和l果是否为true或false,?是PL/SQL中的关系操作W?br /><br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>operator</td><td>operation</td></tr><tr><td>< </td><td>于操作W?/td></tr><tr><td><= </td><td>于或等于操作符</td></tr><tr><td>> </td><td>大于操作W?/td></tr><tr><td>>=</td><td>大于或等于操作符</td></tr><tr><td>= </td><td>{于操作W?</td></tr><tr><td>!= </td><td>不等于操作符</td></tr><tr><td><> </td><td>不等于操作符</td></tr><tr><td>:= </td><td>赋值操作符</td></tr></tbody></table><br />  ? 昄的是比较操作W?br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>operator </td><td>operation</td></tr><tr><td>IS NULL</td><td>如果操作CؓNULLq回TRUE</td></tr><tr><td>LIKE</td><td>比较字符串?/td></tr><tr><td>BETWEEN</td><td>验证值是否在范围之内</td></tr><tr><td>IN</td><td>验证操作数在讑֮的一pdg</td></tr></tbody></table><br />  ?.8昄的是逻辑操作W?br /><table cellspacing="0" width="100%" border="1"><tbody><tr><td>operator</td><td>operation</td></tr><tr><td>AND </td><td>两个条g都必L?/td></tr><tr><td>OR</td><td>只要满两个条g中的一?/td></tr><tr><td>NOT</td><td>取反</td></tr></tbody></table><br />  <b>执行部分</b><br /><br />  执行部分包含了所有的语句和表辑ּ,执行部分以关键字BEGIN开始,以关键字EXCEPTIONl束Q如果EXCEPTION不存在,那么以关键字ENDl束。分号分隔每一条语句,使用赋值操作符:=或SELECT INTO或FETCH INTOl每个变量赋|执行部分的错误将在异常处理部分解冻I在执行部分中可以使用另一个PL/SQLE序块,q种E序块被UCؓ嵌套?br /><br />  所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能再屏幕上显CSELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分Q执行部分用的变量和常量必首先在声明部分声明Q执行部分必至包括一条可执行语句QNULL是一条合法的可执行语句,事物控制语句COMMIT和ROLLBACK可以在执行部分用,数据定义语言(Data Definition language)不能在执行部分中使用QDDL语句与EXECUTE IMMEDIATE一起用或者是DBMS_SQL调用?br /><br />  <strong>执行一个PL/SQL?br /></strong><br />  SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行,如下面的例子所C:<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>declare <br /> v_comm_percent constant number:=10;<br />begin<br /> update emp<br /> set comm=sal*v_comm_percent<br /> where deptno=10;<br /> end<br />SQL> /<br />PL/SQL procedure successfully completed.<br /><br />SQL></td></tr></tbody></table><br />  命名的程序与匿名E序的执行不同,执行命名的程序块必须使用execute关键字:<br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>create or replace procedure update_commission<br /> (v_dept in number,v_pervent in number default 10) is <br />begin<br /> update emp<br /> set comm=sal*v_percent<br /> where deptno=v_dept;<br />end<br /><br />SQL>/<br /><br />Procedure created<br /><br />SQL>execute update_commission(10,15);<br /><br />PL/SQL procedure successfully completed.<br /><br />SQL> </td></tr></tbody></table><br /><br />  如果在另一个命名程序块或匿名程序块中执行这个程序,那么׃需要EXECUTE兌字?br /><br /><table width="100%" bgcolor="#ffffff"><tbody><tr><td>declare<br /> v_dept number;<br />begin<br /> select a.deptno<br /> into v_dept<br /> from emp a<br /> where job='PRESIDENT'<br /> update_commission(v_dept);<br />end<br />SQL>/<br /> PL/SQL procedure successfully completed<br />SQL></td></tr></tbody></table><img src ="http://www.shnenglu.com/ivenher/aggbug/12986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-26 16:51 <a href="http://www.shnenglu.com/ivenher/articles/12986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PL/SQL 语言基础http://www.shnenglu.com/ivenher/articles/12985.html爱饭?/dc:creator>爱饭?/author>Tue, 26 Sep 2006 08:49:00 GMThttp://www.shnenglu.com/ivenher/articles/12985.htmlhttp://www.shnenglu.com/ivenher/comments/12985.htmlhttp://www.shnenglu.com/ivenher/articles/12985.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/12985.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/12985.html
  PL/SQL的优?/font>

  从版?开始PL/SQLp可靠的整合到ORACLE中了Q一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE~ZPL/SQL的情形。PL/SQL 不是一个独立的产品Q他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句QPL/SQL引擎处理PL/SQLE序块。当PL/SQLE序块在PL/SQL引擎处理ӞORACLE服务器中的SQL语句执行器处理pl/sqlE序块中的SQL语句?br />
  PL/SQL的优点如下:

  . PL/SQL是一U高性能的基于事务处理的语言Q能q行在Q何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQLE序单元处理SQL的数据定义和数据控制元素?br />
  . PL/SQL支持所有SQL数据cd和所有SQL函数Q同时支持所有ORACLE对象cd

  . PL/SQL块可以被命名和存储在ORACLE服务器中Q同时也能被其他的PL/SQLE序或SQL命o调用QQ何客?服务器工具都能访问PL/SQLE序Q具有很好的可重用性?br />
  . 可以使用ORACLE数据工具理存储在服务器中的PL/SQLE序的安全性。可以授权或撤销数据库其他用戯问PL/SQLE序的能力?br />
  . PL/SQL代码可以使用MASCII文本~辑器编写,所以对MORACLE能够q行的操作系l都是非怾利的

  . 对于SQLQORACLE必须在同一旉处理每一条SQL语句Q在|络环境下这意味作每一个独立的调用都必被oracle服务器处理,q就占用大量的服务器旉Q同时导致网l拥挤。而PL/SQL是以整个语句块发l服务器Q这降低了|络拥挤?br />
  PL/SQL块结?/b>

  PL/SQL是一U块l构的语aQ组成PL/SQLE序的单元是逻辑块,一个PL/SQL E序包含了一个或多个逻辑块,每个块都可以划分Z个部分。与其他语言相同Q变量在使用之前必须声明QPL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分Q?br />
  声明部分(Declaration section)

  声明部分包含了变量和帔R的数据类型和初始倹{这个部分是由关键字DECLARE开始,如果不需要声明变量或帔RQ那么可以忽略这一部分Q需要说明的是游标的声明也在q一部分?br />
  执行部分(Executable section)

  执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都攑֜q一部分Q其他的PL/SQL块也可以攑֜q一部分?br />
  异常处理部分(Exception section)

  q一部分是可选的Q在q一部分中处理异常或错误Q对异常处理的详l讨论我们在后面q行?br />
  PL/SQL块语?/b>

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END

  PL/SQL块中的每一条语句都必须以分L束,SQL语句可以使多行的Q但分号表示该语句的l束。一行中可以有多条SQL语句Q他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以ENDl束。注释由--标示?br />
  PL/SQL块的命名和匿?/b>

  PL/SQLE序块可以是一个命名的E序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客L?br />
  命名E序块可以出现在其他PL/SQLE序块的声明部分Q这斚w比较明显的是子程序,子程序可以在执行部分引用Q也可以在异常处理部分引用?br />
  PL/SQLE序块可背独立编译ƈ存储在数据库中,M与数据库相连接的应用E序都可以访问这些存储的PL/SQLE序块。ORACLE提供了四U类型的可存储的E序Q?br />
   . 函数

   . q程

   . ?br />
   . 触发?br />
  函数

  函数是命名了的、存储在数据库中的PL/SQLE序块。函数接受零个或多个输入参数Q有一个返回|q回值的数据cd在创建函数时定义。定义函数的语法如下Q?br />
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

  q程

  存储q程是一个PL/SQLE序块,接受零个或多个参C?INPUT)或输?OUTPUT)、或既作输入又作输出(INOUT)Q与函数不同Q存储过E没有返回|存储q程不能由SQL语句直接使用Q只能通过EXECUT命o或PL/SQLE序块内部调用,定义存储q程的语法如下:

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]

  ?package)

  包其实就是被l合在一L相关对象的集合,当包中Q何函数或存储q程被调用,包就被加载入内存中,包中的Q何函数或存储q程的子E序讉K速度大大加快?br />包由两个部分l成Q规范和包主?body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标?br />
  触发?trigger)

  触发器与一个表或数据库事g联系在一LQ当一个触发器事g发生Ӟ定义在表上的触发器被触发?br />

]]>
[oracle]触发器及序列l合实现自增字段http://www.shnenglu.com/ivenher/articles/12949.html爱饭?/dc:creator>爱饭?/author>Mon, 25 Sep 2006 09:45:00 GMThttp://www.shnenglu.com/ivenher/articles/12949.htmlhttp://www.shnenglu.com/ivenher/comments/12949.htmlhttp://www.shnenglu.com/ivenher/articles/12949.html#Feedback0http://www.shnenglu.com/ivenher/comments/commentRss/12949.htmlhttp://www.shnenglu.com/ivenher/services/trackbacks/12949.html[oracle]触发器及序列l合实现自增字段
    让oracle实现自增字段

    先徏序列,然后建立一个触发器实现!
    cata0是表?cata0_id是需要自增的字段!
    CREATE SEQUENCE SEQ_cata0
     INCREMENT BY  1
     START WITH  1
     MAXVALUE  9999999

    CREATE TRIGGER TRG_cata0 BEFORE
    INSERT  ON cata0
    FOR EACH ROW begin
       SELECT SEQ_cata0.NEXTVAL
         INTO :NEW.cata0_ID
         FROM DUAL;
    End TRG_cata0;



]]>
oracle查询前几?/title><link>http://www.shnenglu.com/ivenher/articles/12833.html</link><dc:creator>爱饭?/dc:creator><author>爱饭?/author><pubDate>Fri, 22 Sep 2006 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/ivenher/articles/12833.html</guid><wfw:comment>http://www.shnenglu.com/ivenher/comments/12833.html</wfw:comment><comments>http://www.shnenglu.com/ivenher/articles/12833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ivenher/comments/commentRss/12833.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ivenher/services/trackbacks/12833.html</trackback:ping><description><![CDATA[ <p>查询?00行记?br />select * from  mytab where rownum<100</p> <img src ="http://www.shnenglu.com/ivenher/aggbug/12833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ivenher/" target="_blank">爱饭?/a> 2006-09-22 16:30 <a href="http://www.shnenglu.com/ivenher/articles/12833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.e-meng.com.cn" target="_blank">91޹˾þþƷ</a>| <a href="http://www.vvrj.cn" target="_blank">þѸƵ</a>| <a href="http://www.simple521.cn" target="_blank">þwww˳ɾƷ㽶</a>| <a href="http://www.szac.org.cn" target="_blank">þþƷһ</a>| <a href="http://www.hdtnet.cn" target="_blank">ƷþëƬ</a>| <a href="http://www.sxttzs.cn" target="_blank">þþƷ</a>| <a href="http://www.psjp.net.cn" target="_blank">ҹҹݺݾþö</a>| <a href="http://www.gzlinquan.cn" target="_blank">þþƷ}Ů</a>| <a href="http://www.niuav.cn" target="_blank">޹Ʒþþ</a>| <a href="http://www.cpfang.cn" target="_blank">Ʒþþþþ12</a>| <a href="http://www.fc-lawyer.cn" target="_blank">91þþþþۺ</a>| <a href="http://www.yunva.cn" target="_blank">avҹһƬѿþ</a>| <a href="http://www.rrthhz.cn" target="_blank">ɫ͵͵88888ŷƷþþ</a>| <a href="http://www.task5.cn" target="_blank">þwww˳ɿƬ</a>| <a href="http://www.tjpengzhi.cn" target="_blank">ŷ㽶þۺվ</a>| <a href="http://www.pass3d.cn" target="_blank">ݺݺɫۺϾþ</a>| <a href="http://www.dyhao.com.cn" target="_blank">þþþ99ƷƬŷ</a>| <a href="http://www.k443.cn" target="_blank">þ99ۺϾƷ</a>| <a href="http://www.agfm.cn" target="_blank">Ʒһþ</a>| <a href="http://www.wasang.cn" target="_blank">þþƷ</a>| <a href="http://www.zjjunyao.cn" target="_blank">ŷþþƷһcƬƬ</a>| <a href="http://www.xmjbjd.cn" target="_blank">ƷþþþþþҹƬ</a>| <a href="http://www.eagleinsky.com.cn" target="_blank">8090Ʒþһ</a>| <a href="http://www.zhangyiping.cn" target="_blank">þþþAV鶹</a>| <a href="http://www.awcy.cn" target="_blank">þþþAVվ</a>| <a href="http://www.shqidao.cn" target="_blank">ݺɫۺϾþ</a>| <a href="http://www.gongcheng100.cn" target="_blank">þùƷ-þþƷ</a>| <a href="http://www.173ec.cn" target="_blank">ƷþþþþþĻ</a>| <a href="http://www.ttpcom.com.cn" target="_blank">þ޾Ʒҳ</a>| <a href="http://www.efd-inc.com.cn" target="_blank">99þþùƷ޿</a>| <a href="http://www.gdgzwz.cn" target="_blank">þƵۿ</a>| <a href="http://www.xfshebao.cn" target="_blank">ھƷþþþӰԺվ </a>| <a href="http://www.taobaoke.net.cn" target="_blank">ȾþӾþþƷ18</a>| <a href="http://www.taokecai.cn" target="_blank">þþƷƷ</a>| <a href="http://www.qysf88.cn" target="_blank">þþƷ</a>| <a href="http://www.uyqr.cn" target="_blank">97þþƷһ</a>| <a href="http://www.pgos.com.cn" target="_blank">þۺ϶㼤þ</a>| <a href="http://www.q126.cn" target="_blank">һ97ձ˾þۺӰԺ</a>| <a href="http://www.gta567.cn" target="_blank">ۺϾþúݺɫ99h</a>| <a href="http://www.yizhu888.cn" target="_blank">þseƷһӰԺ</a>| <a href="http://www.nn75.cn" target="_blank">˾þþƷӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>