oracle 两个,oracle的两个注意点

??????????????????????????

1、关于NVL函数

? 1)、oracle的nvl函数的用法

通过查询获得某个字段的合计值,如果这个值位null将给出一个预设的默认值。

select nvl(sum(t.dwxhl),1) from tb_jhde t where

zydm=-1这里关心的nvl的用法,nvl(arg,value)代表如果前面的arg的值为null那么返回的值为后面的value

?

NULL指的是空值,或者非法值。

? NVL (expr1,

expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致

? NVL2 (expr1, expr2, expr3)

->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的

类型

? NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1

? nvl处理空表无效

2、如何在Oracle 中实现类似自动增加 ID

的功能

?

我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在Oracle

中没有这样的功能,我们可以通过采取以下的功能实现自动增加ID的功能

1.首先创建 sequence

create sequence seqmax increment by 1

2.使用方法

select seqmax.nextval ID from dual

就得到了一个ID

如果把这个语句放在 触发器中,就可以实现和 MS SQL

的自动增加ID相同的功能!

自动增加字

?CREATE TABLE t_topic (

? topicId?????? NUMBER(18,0)?? NOT NULL? ,?????????????????????? --

主题ID

?topicTitle?? VARCHAR2(100)? NOT NULL ,???????????????????????? --

主题名

?topicContent varchar2(2000) NOT NULL ,?????????????????????? --

主题内容

?topicAuthor?? VARCHAR2(20)?? NOT NULL ,??????????????????????? --

主题发表者(论坛帖子发表人)

?topicBoaId?? NUMBER(1,0)??? NOT NULL REFERENCES t_board(boaId) ,

-- 主题属于论坛哪个模块

?topicHits???? NUMBER(18,0)?? DEFAULT ’0’ ,??????????????????? --

主题点击数

?topicElite?? NUMBER(1,0)??? DEFAULT ’0’ ,???????????????????? --

是否为精华帖子 0、否 1、是

?topicTop???? NUMBER(1,0)??? DEFAULT ’0’ ,?? -- 是否置顶主题

0、否 1、是

?topicLock???? NUMBER(1,0)??? DEFAULT ’0’ ,?? -- 是否禁止回复

0、否 1、是

?topicDel???? NUMBER(1,0)??? DEFAULT ’0’ ,?? -- 是否删除回复

0、否 1、是(特殊用途,管理员文章不让跟贴)

?topicPubTime DATE NOT NULL,??????????????? -- 主题被创建时间

? topicReNum?? NUMBER(18,0)?? DEFAULT ’0’ ,??? --

回复主题的总数

?topicReUser?? VARCHAR2(20)?? DEFAULT ’’ ,?????? --

最后回复的作者

?topicReTime?? DATE?????????? ,????? -- 最后回复的时间

?topicIp????? VARCHAR2(15) DEFAULT ’’ ,?????? -- 发表人的IP

?PRIMARY KEY (topicId)

);

Create Sequence

t_topic_Id_sequence???????????????????????????????????

--主题序列

INCREMENT BY 1

START WITH 1

NOMAXVALUE

NOCYCLE;

?

CREATE OR REPLACE TRIGGER t_topic_Id_trigger

//触发器

BEFORE INSERT

ON t_topic

FOR EACH ROW

DECLARE

newId NUMBER(18,0);

BEGIN

SELECT t_topic_Id_sequence.nextval INTO newId FROM dual;

:new.topicId := newId;

END;

实现方法1:

建立一个最小为1,最大为nomaxvalue的一个序列号会自动循环的序列

create sequence 序列名

increment by 1

start with 1

nomaxvalue?

nocycle;

当向表中插入数据时,SQL语句写法如下:

SQL> insert into 表名 values(序列名.nextval,列1值,列2值,

...);

当要重用该序列号时,有两种方法:

a. 在同一个sql块中重用:

SQL>insert into表名(序列名.currval, 列1值,列2值...);

b. 在存储进程中,将该值取到一个参数中:

SQL>select序列名.nextval into 参数名 from dual;

然后在重用该序列号的地方调用这个参数。

实现方法2:(利用触发器)

SQL> create sequence a_sequence

? 2? start with 1

? 3? increment by 1;

序列已创建。

SQL> create table t (n number ,v

varchar2(10));

表已创建。

SQL> create or replace trigger t_trg

? 2? before insert or update on t

? 3? for each row

? 4? begin

? 5??? select a_sequence.nextval into :new.n from dual;

? 6? end;

? 7? /

触发器已创建

SQL> insert into t

values(111,’ok’);

已创建 1 行。

SQL> select *? from t;

???????? N V

---------- ----------

???????? 1 ok

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值