妈吖,看过这个大厂的oracle主键自增,我的信心暴增!信创,国产数据库也能行。

创作不易 只因热爱!!

热衷分享,一起成长!

“你的鼓励就是我努力付出的动力”


1.数据库oracle自增主键字段思维导图

在Oracle数据库中,可以通过创建序列(SEQUENCE)来实现自增功能。但也可以不在数据库中实现,而是通过程序中实现,以下是XX大厂的应用端对oracle表主键字段的类似自增,并可一次多增的方法分析,后附代码。
刚使用时觉得挺有学习意义,分享一下,通过程序实现表主键的自增,适合​任意数据库。
国产数据库,也是可以用此方法通过程序实现。

OK
成功
失败
失败
不存在结果
存在
成功
存在
不存在
三次失败后
失败1
失败2
失败3
失败
成功
参数判断
更新表table
更新成功,
再看结果记录
判断是否
存在记录
插入新记录
回滚,返回-1
提交, 获取新记录返回
继续更新表
最多三次
插入新记录
回滚,返回, 重新更新表

2.oracle表主键字段自增使用说明

  • 表SYS_XTCS主键自增1 ,每次程序调用,当前主键值autovalue=func_getmax(sqlhis,‘SYS_XTCS’,1)

获取主键后写入表 insert into SYS_XTCS values(autovalue,…)

  • 表SYS_XTCS主键增加多行,如9,每次程序调用,当前主键值autovalue=func_getmax(sqlhis,‘SYS_XTCS’,9)

获取主键后写入表 insert all …或游标循环写入…

如下,首列表名称BMC,当前主键值DQZ,数据库连接名 transaction
首列表名称BMC

3.通过程序实现ora表主键自增代码示例

代码是powerbuilder写的

// func_getmax()
//  功能:取最大值, 错误时返回:-1
// 传参N,      类型        , 参数名
// 传参1,      transaction , aoTransaction
// 传参2,      string      , asTableName
// 传参3,      integer     , aiNeedCount

Decimal{0} llValue
Long llCount, llRetry

If IsNull(aiNeedCount) Or aiNeedCount < 1 Then
  Return -1
End If

Process_Begin:
func_begin_transaction(aoTransaction) 
UPDATE SYS_MAX SET DQZ = DQZ + :aiNeedCount WHERE BMC = :asTableName USING aoTransaction;

If aoTransaction.SQLCode <> 0 Then // update失败,判断是否存在记录
  SELECT COUNT(*) INTO :llCount FROM SYS_MAX WHERE BMC = :asTableName USING aoTransaction;
  If llCount > 0 Then              // 记录存在继续update(最多三次)
    llRetry ++
    If llRetry >= 3 Then
      Goto Process_Error
    Else
      func_rollback_transaction(aoTransaction)
      Goto Process_Begin
    End If  
  Else                              // 记录不存在则插入新记录
    INSERT INTO SYS_MAX(BMC, DQZ) VALUES (:asTableName, :aiNeedCount) USING aoTransaction;
    If aoTransaction.SQLCode <> 0 Then 
      Goto Process_Error
    End If
    
    llValue = aiNeedCount
    Goto Process_Success
  End If  
Else
  SELECT COUNT(*) INTO :llCount FROM SYS_MAX WHERE BMC = :asTableName USING aoTransaction;
  If IsNull(llCount) Or llCount <= 0 Then // 记录不存在则插入新记录
    INSERT INTO SYS_MAX(BMC, DQZ) VALUES (:asTableName,:aiNeedCount) USING aoTransaction;
    If aoTransaction.SQLCode <> 0 Then 
      Goto Process_Error
    End If
    
    llValue = aiNeedCount
    Goto Process_Success
  End If  
End If

SetNull(llValue)
SELECT DQZ INTO :llValue FROM SYS_MAX WHERE BMC = :asTableName USING aoTransaction;

If IsNull(llValue) Or llValue < aiNeedCount Then
  Goto Process_Error
End If

Process_Success:
func_commit_transaction(aoTransaction)

Return llValue - aiNeedCount + 1

Process_Error:
func_rollback_transaction(aoTransaction)

Return -1

但行好事,莫问前程!

end

**你好呀,我是一个医信行业工程师,喜欢学习,喜欢搞机,喜欢各种捣,也会持续分享,如果喜欢我,那就关注我吧!**

往期精彩:

作者|医信工程师随笔|Carltiger_github

图片|网络|侵删

关注我,我们共同成长

“你的鼓励就是我分享的动力”

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值