ITPub博客

首页 > 数据库 > Oracle > oracle的两个注意点

oracle的两个注意点

Oracle 作者:liufang1 时间:2008-04-11 11:04:00 0 删除 编辑

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

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

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23097354/viewspace-1117047/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-12-29