Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103652490
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-16 13:35:46

   来源:赛迪网    作者:Alice

pl/sql编程共分为四种不同的缺点,包括以下几个方面:

·数据中断的威胁—可能会导致数据丢失;

·使系统难以使用—如可能会减少重用性或者使系统难以维护;

·降低性能—通常是浪费存储和CPU;

·安全威胁;

详细内容如下:

1.直接在条件中使用non-deterministic函数:降低性能

non-deterministic函数不依赖于where子句使用的当前行值,可能依赖于上下文从不同的表推进数据,或在数据上执行操作,这些函数并不包含在select列表中。

函数会执行过多的次数,可能对于每个查询只需要执行一次即可,但是Oracle可能为结果集的每一行都执行了一次,甚至数据源的每一行执行了一次;

·如果不依赖于任何行值,将其放在select function() from dual中;

·如果函数依赖于引用的数据,则将其移到子查询中,然后连接子查询和主查询;

·如果对于相同的值返回相同的结果,则将函数标记为deterministic;

·使用Oracle 11g的结果集缓存功能;

2.捕获异常处理块使用WHEN OTHERS THEN:数据中断的威胁;

通常用来忽略所有不影响事务的错误(如唯一索引不能包含重复数据,插入错误应该被log);

when others将会防止其他不可预计错误传播,如一个触发器导致的突发表错误可能被隐藏,而造成事务实际上没有完成它应该做的而在数据库中事实上已经完成了。

·对于检查特定的错误不要使用when others,如no_data_found。

·不要假设你已经考虑到了任何问题,存储问题,突发表问题应该反馈给客户端,而不是仅仅的抛弃;

3.客户端以对象属主访问:安全威胁;

4.客户端访问表:安全威胁;

为不同的应用程序建立视图,避免直接访问表。

5.将复杂的PL/SQL嵌入PL/SQL:使系统难以使用;

--大块的SQL代码,通常是一个复杂的SELECT语句,使用内置函数/过程;

--在内置PL/SQL过程/函数中使用优化器提示;

将复杂的SQL代码从PL/SQL中提取出来,放到一个视图中,然后在过程中从视图上选择,将优化器提示从过程上移到视图上。

6.使用数字处理错误:使系统难以使用

在PL/SQL中使用RAISE_APPLICATION_ERROR,而没有为错误码声明PL/SQL异常;

·在pl/sql包头中,声明异常码和异常,使用这些异常而不是应用程序错误号;

·发送异常时顺便带上一条消息,使用RAISE_APPLICATION_ERROR和恰当的异常码;

·为单独的过程创建一个包,该包专门用来声明异常;

7.使用输出参数处理错误:数据中断的威胁;

过程和函数生命返回码作为输出参数,通知调用者问题;

建议使用声明的异常处理错误,异常必须由调用者处理,而不会被不可预料的忽略,并且可以同时声明错误码和消息,不需要OUTPUT参数;

8.在视图中格式化数据:使系统难以使用;

--在视图的DATE和NUMBER列上使用to_char函数;

--在视图中结合字符串;

在终端进行数据格式化,而不是数据库中,视图不应该进行任何的格式化;

阅读(307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~