转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
关于约束、CASE语句和游标         ★★★★

关于约束、CASE语句和游标

作者:闵涛 文章来源:闵涛的学习笔记 点击数:632 更新时间:2009/4/22 21:59:05


 
我们的技术专家谈完整性、时间和归属问题。

我仔细阅读了《Oracle9i 数据库概念手册(Oracle9i Database Concepts Manual)》和你们的站点,但对下述概念仍不明白:

"定义为可延迟(deferrable)的约束可以指定为:

1. initially immediate(初始化立即执行)或
2. initially deferred(初始化延迟执行)。"

我知道什么是延迟约束,但不明白什么叫"初始化立即执行的可延迟约束"和"初始化延迟执行的可延迟约束"。请解释二者的区别。还有,这些约束有什么用途?这是通常容易混淆的问题。我希望下面的例子能解释清楚。初始化立即执行/延迟执行规定了在默认情况下应该如何执行约束:

 

初始化立即执行--在每条语句执行结束时检验约束
 

 

初始化延迟执行--一直等到事务完成后(或者调用set constraint immediate语句时)才检验约束
 

来看下面的代码:

 

SQL> create table t
2 ( x int constraint
check_x check ( x > 0 )
deferrable
initially immediate,
3 y int constraint
check_y check ( y > 0 )
deferrable
initially deferred
4 )
5 /
Table created.

SQL> insert into t values ( 1,1 );
1 row created.

SQL> commit;
Commit complete.

所以,当两个约束同时满足时才能正确无误地插入行。但是,如果我试图插入违反CHECK_X约束(初始化立即执行的约束)的行,则系统会立即检验约束,并得到下面的结果:

 

SQL> insert into t values ( -1,1);
insert into t values ( -1,1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_X) violated

 

由于CHECK_X是可延迟但初始化为立即执行的约束,所以这一行立刻被拒绝了。而CHECK_Y则不同,它不仅是可延迟的,而且初始化为延迟执行,这就意味着直到我用COMMIT命令提交事务或将约束状态设置为立即执行时才检验约束。

 

SQL> insert into t values ( 1,-1);
1 row created.

 

现在它是成功的(总之到目前为止是成功的)。我将约束检验延迟到了执行COMMIT的时候:

 

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint
(OPS$TKYTE.CHECK_Y) violated

此时数据库将事务回滚,因为违反约束导致了COMMIT语句的失败。这些语句说明了初始化立即执行与初始化延迟执行约束之间的区别。initially(初始化)部分指定Oracle什么时候会进行默认的约束检验--是在语句结束时[immediate(立即执行)],还是在事务结束时[deferred(延迟执行)]。我还要说明deferred(可延迟)子句有什么用。我可以发出命令,让所有可延迟的约束变为延迟执行的。注意,你也可以对一个约束使用该命令;你不必让所有可延迟的约束都变为延迟执行的:

 

SQL> set constraints all deferred;
Constraint set.

SQL> insert into t values ( -1,1);
1 row created.

 

由于将初始化立即执行的约束设置为延迟执行的模式,这个语句似乎执行成功;但是,当我用COMMIT语句提交事务时,看一下会发生什么:

 

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint
(OPS$TKYTE.CHECK_X) violated

 

事务提交失败并回滚,因为在COMMIT语句之后对约束进行了检验。相反,我可以将初始化为延迟执行的约束变为"立即"执行的约束:

 

SQL> set constraints all immediate;
Constraint set.

SQL> insert into t values ( 1,-1);
insert into t values ( 1,-1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_Y) violated

 

前面在我提交前能执行的语句现在立即出了问题。因为我手动修改了默认的约束模式。

延迟约束有哪些实际用处呢? 有很多。它主要用于物化视图(快照)。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。

使用延迟约束的另一个普遍原因是,当预测是否需要更新父/子关系中的主键时,它有助于级联更新。如果你将外键设为可延迟、但初始化为立即执行,那么你就可以

 

将所有约束设置为可延迟。
 

 

将父键更新为一个新值--至此子关系的完整性约束不会被验证。
 

 

将子外键更新为这个新值。
 

 

COMMIT--只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。
 

如果没有延迟约束,这一更新过程将极为艰难。参见asktom.oracle.com/~tkyte/update_cascade/index.html中给出的没有这一特性时进行级联更新所必需的示例代码!

此外,你可以在各种多语句事务中使用延迟约束,这些事务在处理的过程中需要暂时破坏完整性,但最后它们都会物归原样。

如何计算时间

你是如何计算asktom.oracle.com第一页中AGE列显示的时间的?我之所以问这个问题是因为我看到它有多种格式,如9个月3小时;2.3年;19个小时;等等。我是Oracle新手,想知道你们在使用哪种日期计算法。

我就是使用Oracle8i第2版(8.1.6版)中介绍的使用已久但很好用的CASE语句:





[Delphi程序]於Delphi的Case述句中使用字串當作判別變數  [Sql Server]探讨SQL Server中Case 的不同用法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台