创作不易 只因热爱!!
热衷分享,一起成长!
“你的鼓励就是我努力付出的动力”
1.数据库oracle自增主键字段思维导图
在Oracle数据库中,可以通过创建序列(SEQUENCE)来实现自增功能。但也可以不在数据库中实现,而是通过程序中实现,以下是XX大厂的应用端对oracle表主键字段的类似自增,并可一次多增的方法分析,后附代码。
刚使用时觉得挺有学习意义,分享一下,通过程序实现表主键的自增,适合任意数据库。
国产数据库,也是可以用此方法通过程序实现。
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
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
图片|网络|侵删
关注我,我们共同成长
“你的鼓励就是我分享的动力”