PLSQL 逻辑多线程
PROCEDURE get_sheetid(i_topic IN VARCHAR2, o_newsheetid OUT VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_sheettype NUMBER; --代码名称
BEGIN
SELECT t.sheettype
INTO v_sheettype
FROM sheetidrule t
WHERE t.sheettypename = i_topic
FOR UPDATE;
---调用函数返回sheetid
tl_getnewsheetid(v_sheettype, '', o_newsheetid);
commit;
END get_sheetid;
CREATE OR REPLACE PROCEDURE JVI2.TL_GetNewSheetID
(
I_SheetType IN VARCHAR2,
I_SpecifiedPrefix IN VARCHAR2,
O_NewSheetID OUT VARCHAR2
)
AS
-------------------------------------------------------------
--TL_GetNewSheetID 接口库取单据号码过程
--断 点: 99101nn
--参 数:
--返 回:
--算 法:
--建 立: DDP 2011-09-06
------------------------------------------------------------
v_Err INTEGER := -20101;
v_BreakPoint INTEGER;
v_Msg VARCHAR2(255);
v_PrefixType INTEGER;
v_PreFix VARCHAR2(6);
v_SerialNumber INTEGER;
v_SNumber VARCHAR2(6);
v_ResetDate DATE;
v_i_ResetDate INTEGER;
v_YYYYMMDD VARCHAR2(20);
v_i_YYYYMMDD VARCHAR2(20);
v_DailyReset INTEGER;
BEGIN
v_BreakPoint := 9910110;
v_Msg := ' ';
v_YYYYMMDD := to_char(SYSDATE,'yyyyMMdd');
BEGIN
SELECT prefix,prefixtype,serialnumber,trunc(ResetDate),DailyReset
INTO v_PreFix,v_PrefixType,v_SerialNumber,v_ResetDate,v_DailyReset
FROM sheetidrule WHERE sheettype=I_SheetType;
EXCEPTION WHEN NO_DATA_FOUND THEN
v_Msg := '单据类型['||to_char(I_SheetType)||'未设置!';
Raise_Application_Error(-20051,v_Msg);
END;
IF v_DailyReset = 1 THEN
-- 日结清零
v_i_YYYYMMDD := to_number(to_char(SYSDATE,'yyyyMMdd'));
v_i_ResetDate := to_number(to_char(v_ResetDate,'yyyyMMdd'));
IF v_i_YYYYMMDD != v_i_ResetDate THEN
UPDATE sheetidrule set ResetDate=SYSDATE,serialnumber=1 WHERE sheettype=I_SheetType;
v_SerialNumber :=1;
END IF;
ELSIF v_DailyReset=2 THEN
-- 月结清零
v_i_YYYYMMDD := to_number(to_char(SYSDATE,'yyyyMM'));
v_i_ResetDate := to_number(to_char(v_ResetDate,'yyyyMM'));
IF v_i_YYYYMMDD != v_i_ResetDate THEN
UPDATE sheetidrule SET ResetDate=SYSDATE,serialnumber=1 WHERE sheettype=I_SheetType;
v_SerialNumber :=1;
END IF;
END IF;
-- 将序号格式化成6位字符串,不够的补0
v_SNumber := lpad(to_number(v_SerialNumber),6,0);
IF v_PrefixType = 0 THEN
IF v_PreFix IS NOT NULL THEN
O_NewSheetID := 'JV'||I_SheetType||v_YYYYMMDD||v_SNumber;
ELSE
O_NewSheetID := v_YYYYMMDD||v_SNumber;
END IF;
ELSIF v_PrefixType = 1 THEN
RAISE_APPLICATION_ERROR(-20001,'机构编码(店号)暂时不能使用');
ELSIF v_PrefixType = 2 THEN
RAISE_APPLICATION_ERROR(-20002,'BUID暂时不能使用');
END IF;
-- 修改[流水号],递加
UPDATE sheetidrule SET serialnumber=serialnumber+1 WHERE sheettype=I_SheetType;
EXCEPTION WHEN OTHERS THEN
v_Msg := REPLACE(SQLERRM,'ORA' || V_Err || ': ');
RAISE_APPLICATION_ERROR(-20001,To_Char(v_BreakPoint) || '-' || v_Msg);
END TL_GetNewSheetID;
/
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?