Oracle编写插入记录并返回SYS_GUID()主键的存储过程咨询
解决方案
核心使用Oracle内置的INSERT ... RETURNING INTO语法,该语法可以在执行插入操作的同时,直接将当前插入行自动生成的主键值返回到变量中,属于原子操作,完全不受并发插入影响,不会误获取其他会话生成的ID,完美适配SYS_GUID()默认值生成主键的场景。
完整存储过程代码
CREATE OR REPLACE PROCEDURE INSERT_ERROR_WITH_RELATION( P_SERVICE_CALL_ID IN RAW DEFAULT NULL, P_ERROR_TEXT IN CLOB ) AS -- 定义变量存储当前插入行生成的ERROR_LOG_ID V_ERROR_LOG_ID VARCHAR2(50); BEGIN -- 插入错误日志,同时返回自动生成的主键到变量 INSERT INTO ERROR_LOGS ( ERROR_TIMESTAMP, ERROR_TEXT ) VALUES ( CURRENT_TIMESTAMP, P_ERROR_TEXT ) RETURNING ERROR_LOG_ID INTO V_ERROR_LOG_ID; -- 入参SERVICE_CALL_ID非空时写入关联表 IF P_SERVICE_CALL_ID IS NOT NULL THEN INSERT INTO SERVICE_CALL_ERROR_LOG_RELATION ( SERVICE_CALL_ID, ERROR_LOG_ID ) VALUES ( P_SERVICE_CALL_ID, V_ERROR_LOG_ID ); END IF; -- 事务控制提示:如果上层应用有统一事务管理,请删除下方注释的COMMIT/ROLLBACK,由上层控制事务边界 -- COMMIT; EXCEPTION WHEN OTHERS THEN -- ROLLBACK; RAISE; -- 抛出异常给上层业务逻辑处理 END INSERT_ERROR_WITH_RELATION; /
核心特性说明
RETURNING子句直接绑定当前会话插入行生成的ERROR_LOG_ID,即使存在毫秒级高频并发插入,也不会拿到其他会话生成的ID,不存在数据串用风险- 完全保留原有表的
DEFAULT SYS_GUID()主键生成逻辑,不需要提前手动生成主键 - 天然适配需求中的两种分支逻辑,无多余性能开销
内容的提问来源于stack exchange,提问作者Wickerbough
相关产品推荐
相关产品推荐

