PLSQL 逻辑多线程

简介: PROCEDURE get_sheetid(i_topic IN VARCHAR2, o_newsheetid OUT VARCHAR2) IS    PRAGMA AUTONOMOUS_TRANSACTION;    v_sheettype NUMBER; --代码名称  BEGIN    SELECT t.

  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;
/

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
7月前
|
设计模式 Java
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
|
7月前
|
监控 安全
线程死循环是多线程应用程序开发过程中一个难以忽视的问题,它源于线程在执行过程中因逻辑错误或不可预见的竞争状态而陷入永久运行的状态,严重影响系统的稳定性和资源利用率。那么,如何精准定位并妥善处理线程死循环现象,并在编码阶段就规避潜在风险呢?谈谈你的看法~
避免线程死循环的关键策略包括使用同步机制(如锁和信号量)、减少共享可变状态、设置超时、利用监控工具、定期代码审查和测试、异常处理及设计简洁线程逻辑。通过这些方法,可降低竞态条件、死锁风险,提升程序稳定性和可靠性。
106 0
|
7月前
|
存储 监控 程序员
线程死锁检测组件逻辑与源码
线程死锁检测组件逻辑与源码
87 2
|
JavaScript 安全 Java
深入Netty逻辑架构,从Reactor线程模型开始(一)
深入Netty逻辑架构,从Reactor线程模型开始(一)
434 0
深入Netty逻辑架构,从Reactor线程模型开始(一)
|
消息中间件 Java 调度
深入Netty逻辑架构,从Reactor线程模型开始(二)
深入Netty逻辑架构,从Reactor线程模型开始(二)
220 0
深入Netty逻辑架构,从Reactor线程模型开始(二)
|
存储 Dart Shell
探索Flutter中线程模型/消息循环的底层逻辑
多线程模型以及线程中的事件循环机制在 OS 里都是必不可少的一部分,也扮演着非常重要的角色,主要用来做异步任务的分发与调度。例如浏览器 JSEngine 中的单线程事件循环机制,那么 Flutter 中的线程模型与事件循环是如何实现的呢?
探索Flutter中线程模型/消息循环的底层逻辑
|
Oracle 关系型数据库
PLSQL 逻辑多线程机制
CREATE OR REPLACE PACKAGE jv_para_pkg IS  PROCEDURE main(i_job_name   VARCHAR2,                 i_job_action VARCHAR2,                 i_job_count  NU...
844 0
|
4天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
16 1
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
60 1