在学习数据库和 ERP 底层的内容时,发现一个新概念——存储过程。借助于强大的 AI,可以先快速构建知识,从而获得几个关键点:
- 存储结构是预先在数据库中编辑、存储好的 SQL 代码
- 存储结构可以被外部调用,并实现输入、输出,因此实现了轻度编程,相当于特定自定义方法的封装
不过,从”存储过程”的英文来看,Stored Procedure翻译为“存储程式”或者“存储程序”更加准备,从而强调内部的可执行性。
Stored Procedure在 1999 年 SQL 版本中正式引入,距今也已经超过二十多年历史了。
//如下内容来自于 Copilot
存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。它允许我们将一系列SQL语句编译并保存在数据库中,以便随后通过指定存储过程的名称和参数来调用执行。存储过程的思想在于封装和重用数据库层面的SQL代码12。
以下是关于MySQL存储过程的一些关键语法和示例:
- 创建存储过程:
- 使用
CREATE PROCEDURE
语句创建存储过程。存储过程可以接受参数,可以定义输入(IN)、输出(OUT)或输入输出(INOUT)参数。存储过程体内包含有效的SQL语句,以及BEGIN和END块来定义存储过程的范围。
CREATE PROCEDURE delete_matches (IN p_playerno INTEGER)
BEGIN DELETE FROM MATCHES WHERE playerno = p_playerno;
END; - 使用
- 调用存储过程:
- 使用
CALL
语句来调用存储过程并传递参数。 - 例如,调用上述示例中的存储过程:
CALL delete_matches(57);
- 使用
- 存储过程的优点和缺点:
- 优点:
- 封装和隐藏复杂的商业逻辑。
- 可以回传值,并接受参数。
- 用于数据检验和强制实行商业逻辑。
- 缺点:
- 定制化于特定数据库,切换到其他厂商的数据库时需要重写存储过程。
- 性能调校受限于不同数据库系统。
- 优点:
总之,存储过程是数据库中强大的工具,用于处理复杂的业务逻辑和数据操作13。如果您有更多关于存储过程的问题,欢迎继续提问!
了解详细信息:
1. runoob.com1. runoob.com2. wiki.mbalib.com
二、案例解析
基于上述的内容,我就可以ERP 底层的如下逻辑了。
首先,创建了一个名称为“IdGenerator”的可执行程序,它包含一个名称为seqNo的参数,并指定 bigint 为数据类型,它返回的数据类型也是 bigint。
其次,begin 到 end 部分指明了它的程序主体,返回从’2015-11-01’到当前时间戳current timestamp的毫秒间隔。
create function "monitor"."IdGenerator"( @seqNo bigint )
returns bigint
as
begin
declare @value bigint
select @value = ("DATEDIFF"("millisecond",'2015-11-01',current timestamp)/250)*1073741824+(@seqNo&1073741823)
return @value
end de
可见,monitor ERP 中应该用这个来生成程序内部全局唯一编码。用这个结果来作为主键,就能保证任何表之间的主键都是唯一的了。
还可以看一下更加复杂一点的,使用两个参数,返回某个日期所在周的第一天。
create function "monitor"."GetFirstDayOfWeek"( @date "DATETIME",@weekStartDay integer )
returns "datetime" /*
Find the first date on or before @DATE that matches
day of week of @weekStartDay.
*/
as
begin
declare @StartOfWeekDate "datetime"
declare @FIRST_BOW "datetime"
-- Check for valid day of week
if @weekStartDay between 1 and 7
begin
-- Find first day on or after 1900-01-01
-- matching day of week of @weekStartDay
select @FIRST_BOW = "ymd"(1900,1,1+("remainder"((@weekStartDay+5),7)))
-- Verify beginning of week not before 1900-01-01
if @DATE >= @FIRST_BOW
begin
select @StartOfWeekDate = "dateadd"("dd",("datediff"("dd",@FIRST_BOW,@DATE)/7)*7,@FIRST_BOW)
end
end
return @StartOfWeekDate
end
上述考虑了一周从周一或是周二开始这样的特殊性。
参考:
— SQL 标准 http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
了解 喜乐君 的更多信息
订阅后即可通过电子邮件收到最新文章。