Oracle SQL环境下如何基于两张表批量生成USER_ID可替换的INSERT语句脚本
Oracle批量生成权限关联INSERT脚本的实现方案
需求核心
基于固定的权限模板INSERT语句,仅替换动态字段USER_ID的取值,将模板规则批量应用到所有满足匹配条件的用户上,无需逐条手动修改语句。
方案1:拼接生成可复用的SQL文本脚本
适用于需要留存生成的INSERT语句、后续需在其他环境复用脚本的场景:
- 实现逻辑:把基准INSERT里的固定内容硬编码为字符串,需要替换的
USER_ID位置直接取USERS表的查询结果,通过字符串拼接输出完整的单条可执行INSERT语句 - 可直接运行的查询代码:
SELECT DISTINCT 'INSERT INTO SYS_USER_FUNCTIONS ( USER_ID, FUNCTION_ID_PARENT, FUNCTION_ID_CHILD, A, U, D, V, R, CREATING_USER, CREATING_DATE, CREATING_TIME, LAST_UPDATE_DATE, LAST_UPDATE_COUNT, LAST_UPDATE_USER, LAST_UPDATE_TRANSACTION, S ) ' || 'VALUES ( ''' || USER_ID || ''', ''DOCMDOC'', ''OPDA100'', 1, 1, 2, 1, 2, ''ZYAD'', 20210112, 1515, 20210112, 1, ''ZYAD'', ''I'', 2);' AS generated_sql FROM USERS WHERE USER_FUNCTION = 'DOCMDOC';
- 操作注意点:
- 代码中已按照Oracle语法要求,对所有固定值内的单引号做了双单引号转义,直接执行即可,无需调整字符串格式
- 拿到查询输出的所有
generated_sql结果后,在脚本末尾追加COMMIT;,就能得到完整可直接运行的批量权限脚本 - 如果使用SQL Developer/PLSQL Developer工具,记得提前把输出列的最大长度调整到足够值(建议设置为1000字符),避免长SQL被截断导致执行报错
方案2:通过INSERT...SELECT结构直接完成批量写入
适用于不需要留存生成脚本、直接在当前环境落地写入权限数据的场景,比生成脚本再手动执行的效率更高,也不存在人工复制粘贴的错漏:
-- 第一步:先执行同逻辑查询核对匹配的用户范围,避免错插数据 SELECT DISTINCT USER_ID FROM USERS WHERE USER_FUNCTION = 'DOCMDOC'; -- 第二步:核对用户范围无误后,执行批量插入 INSERT INTO SYS_USER_FUNCTIONS ( USER_ID, FUNCTION_ID_PARENT, FUNCTION_ID_CHILD, A, U, D, V, R, CREATING_USER, CREATING_DATE, CREATING_TIME, LAST_UPDATE_DATE, LAST_UPDATE_COUNT, LAST_UPDATE_USER, LAST_UPDATE_TRANSACTION, S ) SELECT DISTINCT USER_ID, 'DOCMDOC', 'OPDA100', 1, 1, 2, 1, 2, 'ZYAD', 20210112, 1515, 20210112, 1, 'ZYAD', 'I', 2 FROM USERS WHERE USER_FUNCTION = 'DOCMDOC'; -- 第三步:插入完成后提交事务 COMMIT;
- 操作注意点:
- 增加
DISTINCT关键字可以规避USERS表存在重复USER_ID记录时,生成重复的权限关联数据 - 插入操作前必须先跑SELECT部分的语句核对匹配的用户列表,确认范围符合预期后再执行插入,避免脏数据写入目标表
- 增加
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

