Topic: 2012年Oracle认证:Oracle列的Default属性

ERP俱乐部

第 1 页 总共 1 页 [共有 1 条记录]


Posted by weilm on 2012-04-28 11:29 上午

create table TEST

ID VARCHAR2(64),

A VARCHAR2(3) default ’0’,

NAME VARCHAR2(100)

);

SQL》 insert into test(a,name) values(null,’test’);

1 row inserted

SQL》 select * from test;

A NAME

test

在膳缦沔的例子中,虽然A列设置了默认值为0,但插入空仍然无效。

其实对于默认值,Oracle撑持两种体例:

? Default关头字

? 不指定列

先看第一种体例,

SQL》 insert into test(a,name) values(default,’test’);

1 row inserted

SQL》 select * from test;

A NAME

0 test

列A终于有了默认值0。

再看第二种体例,

SQL》 insert into test2(name) values(’test’);

1 row inserted

SQL》 select * from test2;

A NAME

0 test

列A也被添加的默认值。

综上所述,Oracle的默认值措置要留心,如不美观应用中使用的是ORM工具,则必需要考虑对于字段为Null的措置,需要时在ORM工具中将Null转换为default或插入时去失踪值为Null的字段。

可以将下面的系统属性作为默认值:

? SYSDATE:系统时刻

? SYS_CONTEXT:系统上下文

? USER:当前数据库用户

? USERENV:用户情形变量,可以获取一些IP地址、和谈、终端的信息

需要注重,默认值不能使用LEVEL、PRIOR、ROWNUM,会报ORA-00976错误。

应用中使用默认值的常见场景是主键或自增列。正如我们所知,Oracle并未供给自增类型,这就需要我们连系默认值进行二次开发,经由过程默认值实现系统应用的透明。这里连系笔者的经验,供给两种方案:

? 触发器+序列

因为Oracle不撑持在default中使用序列,是以我们只能使用触发器来实现。

create table TEST

ID VARCHAR2(64),

A VARCHAR2(3) default ’0’,

NAME VARCHAR2(100)

);

create sequence seq_test;

create or replace trigger tri_test

before insert on test for each row

begin

if :new.id is null then

select seq_test.nextval into :new.id from dual;

end if;

end;

/

这种体例合用于对于ID不要求持续性的场景。

? Sys_guid()。这个函数返回32位长的数据库全局独一标识。我们可以使用这个函数作为默认值。

alter table TEST modify ID default sys_guid()

SQL》 insert into test2(name) values(’张三’);

1 row inserted

SQL》 select * from test2;

ID A NAME

7CDB1AF556F6474FABA74FA7A60F0822 0 张三

这种体例合用于ID不要求有寄义,以及并发性较高的场景。