分类: Oracle
2008-04-16 13:36:05
来源:赛迪网 作者:Alice |
9.硬编码本地Varchar2变量尺寸:使系统难以使用;
-- PL/SQL函数/过程中声明本地Varchar2类型存储表的值,硬编码长度;
--视图以硬编码格式声明Varchar2长度;
使用%type引用基层表对象。
10.忽略异常:数据中断的威胁;
-- "Exception When others then NULL;"
可能会导致如空间错误之类的严重错误被忽略。
·如果不希望任何错误影响事务,则使用自治事务,并将错误log到错误表中;
·如果要处理某些具体的错误,则使用特定的exception;
11.不使用绑定变量更改参数:降低可用性;
经常使用相同的语句执行,不使用绑定变量,而使用文本值;
会导致每次都编译查询;
12.在触发器中依赖于条件列值,数据中断的威胁;
if updating('ColumnName') then;
在大多数GUI情况下,该方法不能正确的工作,因为GUI层保留所有字段,而不是单独的字段,如下:
create table tbl(col1 number, col2 varchar2(10));
CREATE OR REPLACE TRIGGER trig1
BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
if not updating('col1') then
raise_application_error (-20001,'Col1 was not updated');
end if;
END;
/
insert into tbl values (1,'test');
update tbl set col1=1;
比较:new.column和:old.column,如果列为NULL,确保使用了DECODE。
13.依赖于在包变量中的上下文信息:数据中断的威胁;
依赖对象结构更改会导致全部变量的清空。
·使用sys_context存储简单的交叉调用上下文;
·使用临时表存储复杂的内部事务上下文;
·使用表存储复杂的内部调用上下文;
14.依赖于外部上下文初始化:数据中断的威胁;
视图和过程依赖于sys_context()得到上下文信息,上下文通常要求调用者调用存储过程设置。
数据库和应用程序之间的网络会断,大多数现代网络都会自动重新连接,但是初始化过程不会调用并且旧的上下文将会丢失。
·使用登陆触发器设置上下文;
15.分布式触发器的二次处理:数据中断的威胁;
传播数据更新远程系统;
在第二个子系统中使用LOG表,在触发器中使用When others LOG任何异常,使用dbms_utility.format_error_stack或sqlerrm捕获详细信息;
16.存储rowid在之后引用,数据中断的威胁;
ROWID值存储在表或客户端,以在之后引用;
ROWID会更改,使用主键引用;
17.存储空的LOBs,降低性能;
在CLOB字段存储Empty CLOB而不是NULL;
Oracle为EMPTY CLOBs分配空间;
18.太多层次的视图:降低性能;
优化器可能会放弃使用索引。
只要可能考虑使用连接代替子查询;
使用物化视图或者维护一个聚集表;
19.非自治事务中的事务控制,数据中断的威胁;
在无PRAGMA AUTONOMOUS TRANSACTION的事务中commit和rollback。 |