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

延迟约束用处

 

它主要用于物化视图(快照)。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行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字节的数据库作为整个公司的一个单一的文件服务器。公司所有文档都存在那里,存在这样一个单一的地方,可以对这些文档进行备份、搜索、建立索引和访问。在常规的文件系统中管理成千上万的文档是不可能的。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值