oralce创建种子表,使用存储过程生成最大值sql,考虑并发,不考虑并发的脚本,plsql调试存储过程,java调用存储过程示例代码

oralce创建种子表,使用存储过程生成最大值sql,考虑并发,不考虑并发的脚本,plsql调试存储过程,java调用存储过程示例代码

创建种子表(GY_IDENTITY_TABLE)

dmc 设置主键

sql 复制代码
-- Create table
create table GY_IDENTITY_TABLE
(
  bmc     VARCHAR2(30) not null,
  dqz     NUMBER(18),
  csz     INTEGER,
  dzz     INTEGER,
  tx_jlsj DATE
)
tablespace xxxSpace
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table GY_IDENTITY_TABLE
  add constraint KEY_6544287 primary key (BMC)
  using index 
  tablespace xxxSpace
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

获取主键存储过程PROD_GET_DQZ_MAX

(有并发问题,适用于基础数据维护模块)

sql 复制代码
CREATE OR REPLACE PROCEDURE PROD_GET_DQZ_MAX(V_IDENTITY  IN VARCHAR2,
V_TABLENAME IN VARCHAR2,
V_COUNT      IN NUMBER,
V_DQZ        OUT NUMBER) AS
V_SQL VARCHAR2(500);
BEGIN
IF V_COUNT IS NULL OR V_COUNT <= 0 OR V_IDENTITY IS NULL OR
V_TABLENAME IS NULL THEN
V_DQZ := 0;
RETURN;
END IF;
V_SQL := 'SELECT DQZ FROM ' || V_IDENTITY || ' WHERE BMC = :1';
BEGIN
EXECUTE IMMEDIATE V_SQL
INTO V_DQZ
USING V_TABLENAME;
EXCEPTION
WHEN OTHERS THEN
BEGIN
V_DQZ := 0;
END;
END;
IF V_DQZ > 0 THEN
V_DQZ := V_DQZ + V_COUNT;
V_SQL := 'UPDATE ' || V_IDENTITY || ' SET DQZ = :1 WHERE BMC = :2';
ELSE
V_DQZ := V_COUNT;
V_SQL := 'INSERT INTO ' || V_IDENTITY ||
'(DQZ,BMC,CSZ,DZZ) VALUES(:1,:2,1,1)';
END IF;
SAVEPOINT POINT;
BEGIN
EXECUTE IMMEDIATE V_SQL
USING V_DQZ, V_TABLENAME;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK TO SAVEPOINT POINT;
V_DQZ := -1;
RETURN;
END;
END;
COMMIT;
RETURN;
END PROD_GET_DQZ_MAX;

调用存储过程 V_COUNT为增量,输入1,每次执行后返回当前种子值+1

获取主键存储过程PROD_GET_DQZ_MAX_SYNCLOCK

(加了for update锁,考虑了并发问题,适用于业务高并发模块)

sql 复制代码
CREATE OR REPLACE PROCEDURE PROD_GET_DQZ_MAX_SYNCLOCK(
    V_IDENTITY  IN VARCHAR2,
    V_TABLENAME IN VARCHAR2,
    V_COUNT     IN NUMBER,
    V_DQZ       OUT NUMBER
) AS
    V_SQL        VARCHAR2(500);
    V_CURRENT_DQZ NUMBER;
BEGIN
    -- 参数校验
    IF V_COUNT IS NULL OR V_COUNT <= 0 OR V_IDENTITY IS NULL OR V_TABLENAME IS NULL THEN
        V_DQZ := 0;
        RETURN;
    END IF;

    -- 尝试锁定并读取现有记录(关键:FOR UPDATE)
    V_SQL := 'SELECT DQZ FROM ' || V_IDENTITY || ' WHERE BMC = :1 FOR UPDATE';
    BEGIN
        EXECUTE IMMEDIATE V_SQL INTO V_CURRENT_DQZ USING V_TABLENAME;
        -- 行存在:更新
        V_DQZ := V_CURRENT_DQZ + V_COUNT;
        V_SQL := 'UPDATE ' || V_IDENTITY || ' SET DQZ = :1 WHERE BMC = :2';
        EXECUTE IMMEDIATE V_SQL USING V_DQZ, V_TABLENAME;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            -- 行不存在:尝试插入(可能因并发冲突失败)
            V_DQZ := V_COUNT;
            V_SQL := 'INSERT INTO ' || V_IDENTITY ||
                     ' (DQZ, BMC, CSZ, DZZ) VALUES (:1, :2, 1, 1)';
            BEGIN
                EXECUTE IMMEDIATE V_SQL USING V_DQZ, V_TABLENAME;
            EXCEPTION
                WHEN DUP_VAL_ON_INDEX THEN
                    -- 并发插入冲突:说明另一个会话已插入,回退为更新
                    -- 重新读取并更新(递归调用或重试)
                    ROLLBACK; -- 回滚当前事务(释放隐式锁)
                    PROD_GET_DQZ_MAX_SYNCLOCK(V_IDENTITY, V_TABLENAME, V_COUNT, V_DQZ);
                    RETURN;
            END;
        WHEN OTHERS THEN
            V_DQZ := -1;
            RAISE; -- 抛出原始错误便于排查
    END;

    COMMIT;
END PROD_GET_DQZ_MAX_SYNCLOCK;

java调用存储过程代码部分代码

PROD_GET_DQZ_MAX 存储过程前3个参数为in类型,第4个参数为out类型

java 复制代码
 // 20190812 获取短信表主键调用HIS存储过程 begin
      int jlxh;
      conn = session_his.connection();
      callableStatement = conn.prepareCall("{call PROD_GET_DQZ_MAX('GY_IDENTITY','GY_QYDXXX',1,?)}");
      callableStatement.registerOutParameter(1, Types.DECIMAL);
      callableStatement.execute();// 执行
      jlxh = callableStatement.getInt(1);
      System.out.println("获取短信表主键调用HIS存储过程 返回结果为:" + jlxh);

plsql调试存储过程

右键存储过程 选择test,输入参数后点击 start debugger 启动调试,然后上面会有各种调试的按钮,

step into(步进)用的最多;

不过默认情况下目前调试不会进入存储过程内部,只调试调用的代码,没什么用

需要右键存储过程,选择 add debug information ,再次调试就会进入存储过程函数内部

鼠标移到对应的变量可以看到变量值

相关推荐
龙亘川4 分钟前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
狼爷8 分钟前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路12 分钟前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna1 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白1 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
晚安日记wanna1 小时前
索引建了却不走?7 个失效原因逐层排查
数据库·mysql·性能优化
QCoding1 小时前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能
用户094248568031 小时前
第25章:Java虚拟线程(Project Loom)实战与调度协作
java·jvm
砚底藏山河1 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
KID1412号1 小时前
PostgreSQL入门
数据库·postgresql