??????????????????????????
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