Oracle学习记录使用自定义函数和触发器来实现主键的动态生成。

我很早就想写oracle的函数和触发器,一个小的课本给了我这个机会。

案例介绍:

招投标管理系统(数据库设计)。

数据表是两个:

投标(投标数量、项目名称、投标内容、截止日期和状态)。

投标(投标数量、投标数量、投标企业、投标内容、投标日期、报价、状态)。

对于性格温柔,规则zbyyyymmddnnn号,ZB是一个温柔的拼音首字母,YYYYMMDD为当前日期,NNN是一个三位的序列号。

招标编号与性格类型和编号规则} NNN的TB { 11位招标编号。

经过分析,我们可以找出两个表之间的关系:


创建表的温柔

tender_id VARCHAR2(50)主键,
project_name VARCHAR2(50)不为空的独特,
内容块,
end_date日期不为空,
状态整数不为空
);
创建表的投标

bid_id VARCHAR2(50)主键,
tender_id VARCHAR2(50)不为空,
(50)公司空不空,
内容块,
bid_date日期不为空,
价格整数不为空,
状态整数不为空
);
修改表添加外键约束fk_bid_tender_id投标(投标tender_id)参考文献(tender_id);


然后它是产生投标的函数:


创建或替换
功能createzbno返回空
作为
hascount数(11,0);
lastid VARCHAR2(50);
LastTime VARCHAR2 (12);
lastno数(3,0);
科尔诺号(3,0);
开始
-查询表中是否有记录
选择计数(tender_id)从投标到hascount;
如果hascount > 0
-查询必要的信息
选择tender_id为lastid投标,rownum = 1阶的to_number(to_char(T(H),H),L);
选择截取(lastid,3, 8)从双进一;
-分析是否最后出价信息是今天
如果(to_char (SYSDATE,'yyyymmdd')=一次)然后
选择to_number (截取(lastid,11, 13),'999)为lastno双;
如果今天是序列号并允许新的投标信息
如果lastno<999
选择lastno + 1为科尔诺双;
return'zb一| | | |模式(to_char (科尔诺),3,'0');
最后如果;
序列号-超越
return'nooutofbounds!检查一下!;
最后如果;
这不是今天发布的招标信息。今天是第一次。
return'zb| |to_char (SYSDATE,'yyyymmdd)| | '001;
最后如果;
-整个表中的第一个数据
return'zb| |to_char (SYSDATE,'yyyymmdd)| | '001;
结束;


然后是投标书的数字生成函数。


创建或替换
功能createtbno (zbno在VARCHAR2)
返回空
作为
hascount数(11,0);
lastid VARCHAR2(50);
lastno数(3,0);
科尔诺号(3,0);
开始
-看看是否有投标的出价
选择计数(bid_id)为hascount从出价bid_id like'tb| | zbno | | '___'and = = 1
如果hascount > 0
-已经
选择bid_id为lastid从出价bid_id like'tb| | zbno | | '___'and = = 1,二是正确的方式。
选择to_number (截取(lastid,16,18),'999)为lastno双;
不要超过序列号
如果lastno<999
选择lastno + 1为科尔诺双;
return'tb| | zbno | |模式(to_char (科尔诺),3,'0');
最后如果;
return'nooutofbounds!检查一下!;
最后如果;
-没有投标书。
return'tb| | zbno | | '001;
结束;


然后在两个表中注册触发器,并在数据添加时动态生成该数字!

投标触发器用于动态生成投标号:


创建或替换
触发newtender
在之前插入
在招标
每一行
开始
-如果生成号失败
如果(长度(createzbno )> 13)然后
-在这种情况下,我的提示的错误可以直接操作如下
-:new.tender_id:= null;
raise_application_error(20222,createzbno );
最后如果;
-如果该数字成功,则将该数注入查询语句中。
new.tender_id:=createzbno ;
结束;


然后是投标的触发器:


创建或替换
触发newbid
在之前插入
投标
每一行
开始
如果(长度(createtbno (新。tender_id))< > 18)然后
raise_application_error(20222,createtbno (:新。tender_id));
最后如果;
new.bid_id:=createtbno (:新。tender_id);
结束;


然后插入数据测试。





U3000 U3000



以上只是个人观点,如果你不承认或有所帮助,请慷慨批评。