知识大全 关于约束、CASE语句和游标的一些介绍

Posted 语句

篇首语:只给君子看门,不给小人当家。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于约束、CASE语句和游标的一些介绍相关的知识,希望对你有一定的参考价值。

关于约束、CASE语句和游标的一些介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   关于约束 CASE语句和游标  我们的技术专家谈完整性 时间和归属问题     我仔细阅读了《Oracle i 数据库概念手册(Oracle i Database Concepts Manual)》和你们的站点 但对下述概念仍不明白      定义为可延迟(deferrable)的约束可以指定为      initially immediate(初始化立即执行)或   initially deferred(初始化延迟执行)     我知道什么是延迟约束 但不明白什么叫 初始化立即执行的可延迟约束 和 初始化延迟执行的可延迟约束 请解释二者的区别 还有 这些约束有什么用途?这是通常容易混淆的问题 我希望下面的例子能解释清楚 初始化立即执行/延迟执行规定了在默认情况下应该如何执行约束     初始化立即执行 在每条语句执行结束时检验约束    初始化延迟执行 一直等到事务完成后(或者调用set constraint immediate语句时)才检验约束     来看下面的代码   SQL> create table t    ( x int constraint  check_x check ( x > )  deferrable  initially immediate      y int constraint  check_y check ( y > )  deferrable  initially deferred    )    /  Table created     SQL> insert into t values ( );   row created     SQL> mit;  Commit plete     所以 当两个约束同时满足时才能正确无误地插入行 但是 如果我试图插入违反CHECK_X约束(初始化立即执行的约束)的行 则系统会立即检验约束 并得到下面的结果     SQL> insert into t values ( );  insert into t values ( )  *  ERROR at line :  ORA : check constraint  (OPS$TKYTE CHECK_X) violated    由于CHECK_X是可延迟但初始化为立即执行的约束 所以这一行立刻被拒绝了 而CHECK_Y则不同 它不仅是可延迟的 而且初始化为延迟执行 这就意味着直到我用MIT命令提交事务或将约束状态设置为立即执行时才检验约束     SQL> insert into t values ( );   row created     现在它是成功的(总之到目前为止是成功的) 我将约束检验延迟到了执行MIT的时候     SQL> mit;  mit  *  ERROR at line :  ORA : transaction rolled back  ORA : check constraint  (OPS$TKYTE CHECK_Y) violated    此时数据库将事务回滚 因为违反约束导致了MIT语句的失败 这些语句说明了初始化立即执行与初始化延迟执行约束之间的区别 initially(初始化)部分指定Oracle什么时候会进行默认的约束检验 是在语句结束时[immediate(立即执行)] 还是在事务结束时[deferred(延迟执行)] 我还要说明deferred(可延迟)子句有什么用 我可以发出命令 让所有可延迟的约束变为延迟执行的 注意 你也可以对一个约束使用该命令 你不必让所有可延迟的约束都变为延迟执行的     SQL> set constraints all deferred;  Constraint set     SQL> insert into t values ( );   row created     由于将初始化立即执行的约束设置为延迟执行的模式 这个语句似乎执行成功 但是 当我用MIT语句提交事务时 看一下会发生什么     SQL> mit;  mit  *  ERROR at line :  ORA : transaction rolled back  ORA : check constraint  (OPS$TKYTE CHECK_X) violated    事务提交失败并回滚 因为在MIT语句之后对约束进行了检验 相反 我可以将初始化为延迟执行的约束变为 立即 执行的约束     SQL> set constraints all immediate;  Constraint set     SQL> insert into t values ( );  insert into t values ( )  *  ERROR at line :  ORA : check constraint  (OPS$TKYTE CHECK_Y) violated    前面在我提交前能执行的语句现在立即出了问题 因为我手动修改了默认的约  束模式     延迟约束有哪些实际用处呢? 有很多 它主要用于物化视图(快照) 这些视图会使用延迟约束来进行视图刷新 在刷新物化视图的过程中 可能会破坏完整性 而且将不能逐句检验约束 但到执行MIT时 数据完整性就没问题了 而且能满足约束 没有延迟约束 物化视图的约束可能会使刷新过程不能成功进行     使用延迟约束的另一个普遍原因是 当预测是否需要更新父/子关系中的主键时 它有助于级联更新 如果你将外键设为可延迟 但初始化为立即执行 那么你就可以    将所有约束设置为可延迟     将父键更新为一个新值 至此子关系的完整性约束不会被验证     将子外键更新为这个新值     MIT 只要所有受更新影响的子记录都指向现有的父记录 这条命令就能成功执行     如果没有延迟约束 这一更新过程将极为艰难 参见/~tkyte/update_cascade/l中给出的没有这一特性时进行级联更新所必需的示例代码!    此外 你可以在各种多语句事务中使用延迟约束 这些事务在处理的过程中需要暂时破坏完整性 但最后它们都会物归原样      如何计算时间  你是如何计算第一页中AGE列显示的时间的?我之所以问这个问题是因为我看到它有多种格式 如 个月 小时 年 个小时 等等 我是Oracle新手 想知道你们在使用哪种日期计算法     我就是使用Oracle i第 版( 版)中介绍的使用已久但很好用的CASE语句     Select  case  when sysdate timestamp < /   then round( * *(sysdate timestamp))  || minutes old   when sysdate timestamp <   then round( *(sysdate timestamp))  || hours old   when sysdate timestamp <   then trunc(sysdate timestamp)  || days old   when sysdate timestamp <   then trunc((sysdate timestamp)/ )  || weeks old   when sysdate timestamp <   then round(months_beeen  (sysdate timestamp))  || months old   else round(months_beeen  (sysdate timestamp)/ )  || years old   end age     如果你想在Oracle i的PL/SQL中使用CASE语句 则会出现一个错误消息 因为PL/SQL语法分析程序不识别CASE语句 (请注意 在Oracle i不存在这样的问题 )为了避开Oracle i的限制 你可以    将CASE语句隐藏在视图当中 并用PL/SQL来查询视图     使用嵌套的DECODE语句来代替CASE语句     我本人愿意使用视图 但读者Martin Burbridge在 网站上公布了下面这段DECODE代码     decode(sign(sysdate timestamp / )   round( * *(sysdate timestamp))  || minutes old   decode(sign(sysdate timestamp )   round( *(sysdate timestamp))  || hours old   decode(sign(sysdate timestamp )   trunc(sysdate timestamp)  || days old   decode(sign(sysdate timestamp )   trunc((sysdate timestamp)/ )  || weeks old   decode(sign(sysdate timestamp )   round(months_beeen  (sysdate timestamp))  || months old   round(months_beeen  (sysdate timestamp)/    )  || years old   ))))) age    它与CASE语句的功能完全相同 只是不太明显      文件放在哪?  我正在考虑为一个应用程序设计些选项 利用它用户可以上传和存储可供他人下载的文档 文档可以是平均大小为 K的Microsoft Word文档 最初需要(从CD)移植 到 个文档 当使用该应用程序时存储数量会增加到大约 个文档 浏览器前端是用于上传和下载的PL/SQL插件(PL/SQL cartridge)页面 一开始 会有 到 人几乎同时访问该应用程序 两周内每天将有 人访问(分散访问) 文档本身在数据库中作为BLOB存储     从使用方面考虑 你觉得这样的选项好吗?它会过多占用系统全局区(SGA)吗?考虑到应用程序的需求以及前端(基于浏览器) 除了保存为BLOB 还有没有其他选择 如文件系统?    我什么都存在数据库里 就是这样 如果数据就是你的一切 无论它们有什么样的值 事实上都要放到数据库中 在那里数据可以得到专业化的管理 备份 恢复而且安全 除了这些实实在在的好处 你还可以索引及搜索文档 (诚然 用文件系统也可以做这些 但在索引和文档之间不存在完整性 )在数据库中 你可以转换文档格式(例如 上传一个DOC文件 而显示为HTML格式) 你的数据是完全集成的 安全的 有备份的而且随时供你使用     在Oracle公司内部 我们将一个几千吉字节的数据库作为整个公司的一个单一的文件服务器 公司所有文档都存在那里 存在这样一个单一的地方 可以对这些文档进行备份 搜索 建立索引和访问 在常规的文件系统中管理成千上万的文档是不可能的 cha138/Article/program/Oracle/201311/18071

相关参考

知识大全 switch语句的格式和功能

switch语句的格式和功能switch(表示式)case常量表达式1:语句1;case常量表达式2:语句2;…case常量表达式n:语句n;default:语句n+1;一般,该语句与回圈语句一起使用

知识大全 oracle里面如何写case语句

  如下    SELECTLogIDUserIDLogTimeUrlDescription(caseOperateTypewhenOperateType=then新增whenOperateType=

知识大全 switch条件语句中,case后面可以跟什么型别的资料

switch条件语句中,case后面可以跟什么型别的资料在Java7之前,switch只能支援byte、short、char、int或者其对应的封装类以及Enum型别。在Java7中,也支援了Stri

知识大全 显式游标范围大小和复杂间隔的相关问题介绍

  我们的技术专家回答关于游标范围(extent)和间隔的问题  是不是从Oracle第版以后的版本隐式游标得到了优化不会两次取数据?还有为什么当表T在列X上有一个索引时下面的隐式游标比显式游标运行得

知识大全 oracle游标

  为了处理SQL语句Oracle将在内存中分配一个区域这就是上下文区这个区包含了已经处理完的行数指向被分析语句的指针整个区是查询语句返回的数据行集游标就是指向上下文区句柄或指针  两种游标  一显示

知识大全 关于SQL的基本知识和影响Recordset的游标类型

关于SQL的基本知识和影响Recordset的游标类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 javascript教程:关于if语句优化的方法

  UglifyJS是一个对javascript进行压缩和美化的工具在它的文档说明中我看到了几种关于if语句优化的方法尽管我还没使用它去做一些尝试性的测试但从这里可以看到它的确对js作了美化的工作也许

知识大全 jsp switch语句的用法

  如果希望选择执行若干代码块中的一个你可以使用switch语句  语法switch(n)    case:    执行

知识大全 在java中,如果不是在循环语句中怎么用break跳到指定语句

在java中,如果不是在循环语句中怎么用break跳到指定语句?break除了可循环语句,和switch-case语句中,还可指明它要跳出的代码快,并从紧跟该快的下一句执行,如:breakBolckL

知识大全 c语言中的switch语句,使用时应注意哪些

c语言中的switch语句,使用时应注意哪些?Switch语句编程规范总结:【规则1】每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。【规则2】不要忘记最