您的位置:首页 > 汽车 > 时评 > 妈吖,看过这个大厂的oracle主键自增,我的信心暴增!信创,国产数据库也能行。

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

2024/10/19 15:23:05 来源:https://blog.csdn.net/weixin_43688085/article/details/140780256  浏览:    关键词:妈吖,看过这个大厂的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     , aiNeedCountDecimal{0} llValue
Long llCount, llRetryIf IsNull(aiNeedCount) Or aiNeedCount < 1 ThenReturn -1
End IfProcess_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 ThenGoto Process_ErrorElsefunc_rollback_transaction(aoTransaction)Goto Process_BeginEnd If  Else                              // 记录不存在则插入新记录INSERT INTO SYS_MAX(BMC, DQZ) VALUES (:asTableName, :aiNeedCount) USING aoTransaction;If aoTransaction.SQLCode <> 0 Then Goto Process_ErrorEnd IfllValue = aiNeedCountGoto Process_SuccessEnd If  
ElseSELECT 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_ErrorEnd IfllValue = aiNeedCountGoto Process_SuccessEnd If  
End IfSetNull(llValue)
SELECT DQZ INTO :llValue FROM SYS_MAX WHERE BMC = :asTableName USING aoTransaction;If IsNull(llValue) Or llValue < aiNeedCount ThenGoto Process_Error
End IfProcess_Success:
func_commit_transaction(aoTransaction)Return llValue - aiNeedCount + 1Process_Error:
func_rollback_transaction(aoTransaction)Return -1
但行好事,莫问前程!

end

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

往期精彩:

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

图片|网络|侵删

关注我,我们共同成长

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com