- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Oracle学习记录之使用自定义函数和触发器实现主键动态生成由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
很早就想自己写写Oracle的函数和触发器,最近一个来自课本的小案例给了我这个机会。现在把我做的东西记录下来,作为一个备忘或者入门的朋友们的参考.
案例介绍:
招投标管理系统(数据库设计)。 数据表有以下两张: 招标书(招标书编号、项目名称、招标书内容、截止日期、状态)。 投标书(投标书编号、招标书编号、投标企业、投标书内容、投标日期、报价、状态)。 “招标书编号”为字符型,编号规则为 ZBYYYYMMDDNNN, ZB是招标的汉语拼音首字母,YYYYMMDD是当前日期,NNN是三位流水号。 “投标书编号”为字符型,编号规则为TB[11位招标书编号]NNN.
经过分析,我们可以得知两张表的关系。我们先创建数据结构,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
CREATE
TABLE
TENDER
(
TENDER_ID VARCHAR2(50)
PRIMARY
KEY
,
PROJECT_NAME VARCHAR2(50)
NOT
NULL
UNIQUE
,
CONTENT BLOB,
END_DATE
DATE
NOT
NULL
,
STATUS
INTEGER
NOT
NULL
);
CREATE
TABLE
BID
(
BID_ID VARCHAR2(50)
PRIMARY
KEY
,
TENDER_ID VARCHAR2(50)
NOT
NULL
,
COMPANY VARCHAR2(50)
NOT
NULL
,
CONTENT BLOB,
BID_DATE
DATE
NOT
NULL
,
PRICE
INTEGER
NOT
NULL
,
STATUS
INTEGER
NOT
NULL
);
ALTER
TABLE
BID
ADD
CONSTRAINT
FK_BID_TENDER_ID
FOREIGN
KEY
(TENDER_ID)
REFERENCES
TENDER(TENDER_ID);
|
然后是生成招标的函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
CREATE
OR
REPLACE
FUNCTION
"createZBNo"
RETURN
VARCHAR2
AS
hasCount NUMBER(11,0);
lastID VARCHAR2(50);
lastTime VARCHAR2(12);
lastNo NUMBER(3,0);
curNo NUMBER(3,0);
BEGIN
-- 查询表中是否有记录
SELECT
"COUNT"
(TENDER_ID)
INTO
hasCount
FROM
TENDER;
IF hasCount > 0
THEN
-- 查询必要信息
SELECT
TENDER_ID
INTO
lastID
FROM
TENDER
WHERE
ROWNUM = 1
ORDER
BY
to_number(to_char(scn_to_timestamp(ORA_ROWSCN),
'yyyyMMddhh24mmss'
),
'99999999999999'
)
DESC
;
SELECT
"SUBSTR"
(lastID, 3, 8)
INTO
lastTime
FROM
dual;
-- 分析上一次发布招标信息是否是今日
IF (
"TO_CHAR"
(SYSDATE,
'YYYYMMDD'
) = lastTime)
THEN
SELECT
"TO_NUMBER"
(
"SUBSTR"
(lastID, 11, 13),
'999'
)
INTO
lastNo
FROM
dual;
-- 如果是今日且流水号允许新增招标信息
IF lastNo < 999
THEN
SELECT
lastNo + 1
INTO
curNo
FROM
dual;
RETURN
'ZB'
||lastTime||
"LPAD"
(
"TO_CHAR"
(curNo), 3,
'0'
);
END
IF;
-- 流水号超出
RETURN
'NoOutOfBounds!Check it!'
;
END
IF;
-- 不是今日发布的招标信息,今日是第一次
RETURN
'ZB'
||
"TO_CHAR"
(SYSDATE,
'YYYYMMDD'
)||
'001'
;
END
IF;
-- 整个表中的第一条数据
RETURN
'ZB'
||
"TO_CHAR"
(SYSDATE,
'YYYYMMDD'
)||
'001'
;
END
;
|
然后是投标书的编号生成函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
CREATE
OR
REPLACE
FUNCTION
"createTBNo"
(ZBNo
IN
VARCHAR2)
RETURN
VARCHAR2
AS
hasCount NUMBER(11,0);
lastID VARCHAR2(50);
lastNo NUMBER(3,0);
curNo NUMBER(3,0);
BEGIN
-- 查看是否已经有了对于该想招标的投标书
SELECT
"COUNT"
(BID_ID)
INTO
hasCount
FROM
BID
WHERE
BID_ID
LIKE
'TB'
||ZBNo||
'___'
AND
ROWNUM = 1
ORDER
BY
to_number(to_char(scn_to_timestamp(ORA_ROWSCN),
'yyyyMMddhh24mmss'
),
'99999999999999'
)
DESC
;
IF hasCount > 0
THEN
-- 有了
SELECT
BID_ID
INTO
lastID
FROM
BID
WHERE
BID_ID
LIKE
'TB'
||ZBNo||
'___'
AND
ROWNUM = 1
ORDER
BY
to_number(to_char(scn_to_timestamp(ORA_ROWSCN),
'yyyyMMddhh24mmss'
),
'99999999999999'
)
DESC
;
SELECT
"TO_NUMBER"
(
"SUBSTR"
(lastID, 16,18),
'999'
)
INTO
lastNo
FROM
dual;
-- 流水号没超出
IF lastNo < 999
THEN
SELECT
lastNo + 1
INTO
curNo
FROM
dual;
RETURN
'TB'
||ZBNo||
"LPAD"
(
"TO_CHAR"
(curNo),3,
'0'
);
END
IF;
RETURN
'NoOutOfBounds!Check it!'
;
END
IF;
-- 没有投标书对该招标书
RETURN
'TB'
||ZBNo||
'001'
;
END
;
|
然后在两个表中注册触发器,当新增数据的时候动态生成编号! 。
招标书触发器,用于动态生成招标书编号:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE
OR
REPLACE
TRIGGER
newTender
BEFORE
INSERT
ON
TENDER
FOR
EACH ROW
BEGIN
-- 如果生成编号失败
IF (LENGTH(
"createZBNo"
) <> 13)
THEN
-- 此处根据我的提示信息报错可以直接如下操作
-- :NEW.TENDER_ID := NULL;
RAISE_APPLICATION_ERROR(-20222,
"createZBNo"
);
END
IF;
-- 如果生成编号成功,将编号注入查询语句中
:NEW.tender_id :=
"createZBNo"
;
END
;
|
然后是投标书的触发器:
1
2
3
4
5
6
7
8
9
10
11
|
CREATE
OR
REPLACE
TRIGGER
newBid
BEFORE
INSERT
ON
BID
FOR
EACH ROW
BEGIN
IF (LENGTH(
"createTBNo"
(:NEW.TENDER_ID)) <> 18)
THEN
RAISE_APPLICATION_ERROR(-20222,
"createTBNo"
(:NEW.TENDER_ID));
END
IF;
:NEW.BID_ID :=
"createTBNo"
(:NEW.TENDER_ID);
END
;
|
然后插入数据测试吧:
。
。
以上只是个人的一些观点,如果您不认同或者能给予指正和帮助,请不吝赐教.
最后此篇关于Oracle学习记录之使用自定义函数和触发器实现主键动态生成的文章就讲到这里了,如果你想了解更多关于Oracle学习记录之使用自定义函数和触发器实现主键动态生成的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!