`
xiaolong0211
  • 浏览: 326658 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

数据库中三大问题:约束、CASE语句和文件(转)

阅读更多

本文用实例方式讲述了关于约束、CASE语句和文件三大问题。

约束

“定义为可延迟(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,
            3y 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:只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。

 

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

Case语句

怎么计算时间

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

 

非常好用的CASE语句:

 

Select
            case
            when sysdate-timestamp < 1/24
            then round(24*60*(sysdate-timestamp))
            || ’ minutes old ’
            when sysdate-timestamp < 1
            then round(24*(sysdate-timestamp))
            || ’ hours old ’
            when sysdate-timestamp < 14
            then trunc(sysdate-timestamp)
            || ’ days old ’
            when sysdate-timestamp < 60
            then trunc((sysdate-timestamp)/7)
            || ’ weeks old ’
            when sysdate-timestamp < 365
            then round(months_between
            (sysdate,timestamp))
            || ’ months old ’
            else round(months_between
            (sysdate,timestamp)/12,1)
            || ’ years old ’
            end age, ...

如果你想在Oracle8i的PL/SQL中使用CASE语句,则会出现一个错误消息,因为PL/SQL语法分析程式不识别CASE语句。(请注意,在Oracle9i不存在这样的问题。)为了避开Oracle8i的限制,你能将CASE语句隐藏在视图当中,并用PL/SQL来查询视图。使用嵌套的DECODE语句来代替CASE语句。

 

网站公开下面这段代码:

 

decode(sign(sysdate-timestamp-1/24),-1,
            round(24*60*(sysdate-timestamp))
            || ’ minutes old ’,
            decode(sign(sysdate-timestamp - 1), -1,
            round(24*(sysdate-timestamp))
            || ’ hours old ’,
            decode(sign(sysdate-timestamp-14),-1,
            trunc(sysdate-timestamp)
            || ’ days old ’,
            decode(sign(sysdate-timestamp-60),-1,
            trunc((sysdate-timestamp)/7)
            || ’ weeks old ’,
            decode(sign(sysdate-timestamp-365),-1,
            round(months_between
            (sysdate,timestamp))
            || ’ months old ’,
            round(months_between
            (sysdate,timestamp)/12,
            1)
            || ’ years old ’
            ))))) age

他和CASE语句的功能完全相同,只是不太明显。

 

文件

我正在考虑为一个应用程式设计些选项,利用他用户能上传和存储可供他人下载的文件。文件能是平均大小为150Kb的Microsoft Word文件。最初需要(从CD)移植18000到20000个文件,当使用该应用程式时存储数量会增加到大约25000个文件。浏览器前端是用于上传和下载的PL/SQL插件(PL/SQL cartridge)页面。一开始,会有400到500人几乎同时访问该应用程式,两周内每天将有300人访问(分散访问)。 文件本身在数据库中作为BLOB存储。

 

从使用方面考虑,你觉得这样的选项好吗?他会过多占用系统全局区(SGA)吗?考虑到应用程式的需求及前端(基于浏览器),除了保存为BLOB,更有没有其他选择,如文件系统?

 

我什么都存在数据库里。就是这样。如果数据就是你的一切,无论他们有什么样的值,事实上都要放到数据库中,在那里数据能得到专业化的管理、备份,恢复而且安全。除了这些实实在在的好处,你还能索引及搜索文件。(诚然,用文件系统也能做这些,但在索引和文件之间不存在完整性。)在数据库中,你能转换文件格式(例如,上传一个DOC文件,而显示为HTML格式)。你的数据是完全集成的、安全的、有备份的而且随时供你使用。

 

在Oracle公司内部,我们将一个几千G字节的数据库作为整个公司的一个单一的文件服务器。公司所有文件都存在那里,存在这样一个单一的地方,能对这些文件进行备份、搜索、建立索引和访问。在常规的文件系统中管理成千上万的文件是不可能的。

  • http://www.sudu.cn/info/html/edu/20080402/257105.html

    以上内容由 华夏名网 搜集整理,如转载请注明原文出处,并保留这一部分内容。

  • 分享到:
    评论

    相关推荐

      数据库中三大问题约束、CASE语句和文件.doc

      数据库中三大问题约束、CASE语句和文件.doc

      SQL_Sever数据库语句大全.zip

      SQL_Sever数据库语句大全.zip 具体SQL语句实例如下 获取当前日期的星期 获取某个字段排序的行号 获取数据库所有表和视图的信息 获取月份的月初月末时间 禁用启用触发器 判断是否存在视图(创建视图) 启用服务器...

      SQL server 语句大全

      数据库中的if和else语句 14 SQL中的while语句 14 Case-End多分支语句 14 子查询 15 视图(虚拟表)和索引 16 视图 16 索引 16 事务管理 17 数据库的安全性 18 建立权限 19 存储过程(procedure) 20 无参数...

      数据库实验报告

      本文档为数据库上机实验报告,是自己认认真真一步一步写的,报告包含试验中的具体步骤,过程以及代码和实验结果截图,和实验总结。 实验一 实验题目: 数据库管理系统的使用 实验目的: 掌握SQL SERVER2005的...

      数据库管理系统DBMS在企业管理中的应用.doc

      数据定义:DBMS提供数据定义语言DDL(Data Definition Language),供用户定义数据库的三级模式结构、两级映像以及完整性约束和保密限制 等约束。DDL主要用于建立、修改数据库的库结构。DDL所描述的库结构仅仅给出了...

      Firebird数据库中文版

      我们可以在触发器中写入PSQL语句,默认值,产生异常,firebird现在支持统一触发器,即可以一个触发器中,一次性管理插入,更新,删除的操作。 扩展函数: 我们可以使用C语言,C++,DELPHI写UDF,使用UDF(用户定义...

      精通sql结构化查询语句

      讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。...

      数据库原理实验报告整合

      SQL Server中的一个数据库必须至少包含一个数据文件和一个事务日志文件,所以创建数据库就是建立主数据文件和日志文件。 在SQL Server中创建数据库的方法主要有两种:一是在SQL Server Management Studio窗口中使用...

      oracle数据库11G初学者指南.Oracle.Database.11g,.A.Beginner's.Guide

      5.6.3 CASE语句 5.6.4 Loop循环 5.6.5 WHILE循环 5.6.6 FOR循环 5.7 如何创建存储过程以及创建存储过程的原因 5.8 函数的创建和使用 5.9 调用PL/SQL程序 5.10 本章 测验 第6章 数据库管理员 6.1 了解DBA的工作 6.2...

      mysql数据库的基本操作语法

      MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息; 约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 常用五类约束: ...

      Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

      1.3 开发数据库应用的正确(和不正确)方法 8 1.3.1 了解Oracle体系结构 8 1.3.2 理解并发控制 14 1.3.3 多版本 19 1.3.4 数据库独立性? 25 1.3.5 “怎么能让应用运行得更快?” 41 1.3.6 DBA与开发人员的关系...

      精通SQL 结构化查询语言详解

      《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

      SQL Server 2008编程入门经典(第3版)

      11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER修改存储过程 12.3 删除存储过程 12.4 ...

      SQL.Server.2008编程入门经典(第3版).part1.rar

      11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER修改存储过程 12.3 删除存储过程 12.4 ...

      SQL.Server.2008编程入门经典(第3版).part2.rar

      11.5.2 CASE语句 11.5.3 用WHILE语句进行循环 11.5.4 WAITOR语句 11.5.5 TRY/CATCH块 11.6 本章小结 11.7 练习 第12章 存储过程 12.1 创建存储过程:基本语法 12.2 使用ALTER修改存储过程 12.3 删除存储过程 12.4 ...

      精通SQL--结构化查询语言详解

      13.5.1 oracle中用户、资源、概要文件、模式的概念 269 13.5.2 oracle中的用户管理 269 13.5.3 oracle中的资源管理 274 13.5.4 oracle中的权限管理 277 13.5.5 oracle中的角色管理 278 第14章 完整性控制 281 ...

      Oracle 10g 开发与管理

      (二)Case语句 62 7.7循环语句 63 1.“直到”循环 63 2.当型循环(While) 63 3.计数型循环(For) 63 7.8游标 64 (一)隐式游标 64 1.含义: 64 2.游标的属性:(获取游标的状态) 64 3.另一种隐式游标 64 (二)...

      Java语言基础下载

      case语句 317 内容总结: 318 独立实践 319 第十九章: JDBC基础 320 学习目标 320 JDBC的概念 321 连接数据库的几种方式 321 JAVA编程语言和JDBC 323 JDBC编程的步骤 323 实例分析 325 内容总结 335 独立实践 336 ...

    Global site tag (gtag.js) - Google Analytics