oracle生产sql上线,可重复执行脚本写法(支持insert into、update、delete、alter、drop等语法)

本文讨论了在软件开发过程中如何解决SQL脚本部署中的问题,如脚本遗漏、重复执行和错误处理。作者提出了一种目录结构清晰、可重复执行的解决方案,包括使用PL/SQL代码片段进行插入、更新操作,并通过Command窗口批量执行,确保高效、安全的生产环境部署。
摘要由CSDN通过智能技术生成

不知道大家会不会遇到这样的问题,辛辛苦苦开发完准备上线了,一大堆的sql脚本需要刷到生产环境,多的时候容易漏脚本、重复执行等问题,导致生产环境执行sql的时候报错,部分sql已经刷到生产数据库中,这时候需要清理数据,重新刷,浪费时间且头疼。

所以我们需要一种可重复执行的脚本,目录层次分明,就算报错了,也可快速定位,快速解决,解决完,还可以重复执行,其价值不必多说。

代码演示:

--记录新增
DECLARE
  AN_FLAG NUMBER;
BEGIN
  SELECT COUNT(1)
    INTO AN_FLAG
    FROM SYS_ROLE
   WHERE ROLE_ID IN ('5057922332704');
  IF AN_FLAG = 0 THEN
    insert into SYS_ROLE (ROLE_ID, ROLE_NAME, ROLE_KEY, ROLE_SORT, DATA_SCOPE, MENU_CHECK_STRICTLY, DEPT_CHECK_STRICTLY, STATUS, IS_VALID, CREATE_BY, CREATE_DEPT, CREATE_TIME, UPDATE_BY, UPDATE_DEPT, UPDATE_TIME, REMARK, CREATE_NAME, UPDATE_NAME, DATA_CREATE_TIME, DATA_UPDATE_TIME, ROLE_BIZ_ID)
    values (5057922332704, '审核员', 'shy', 1, '1', 1, 0, '0', 1, '1', '202105909052402', to_date('26-12-2023 11:20:44', 'dd-mm-yyyy hh24:mi:ss'), '1', '202105909052402', to_date('27-12-2023 15:24:22', 'dd-mm-yyyy hh24:mi:ss'), null, '超级管理员', '超级管理员', to_date('26-12-2023 11:20:44', 'dd-mm-yyyy hh24:mi:ss'), to_date('27-12-2023 15:24:22', 'dd-mm-yyyy hh24:mi:ss'), 10009);
    commit;
  
  END IF;
END;
/

以上sql代码解释:首先查询是否存在指定的 ROLE_ID,然后根据查询结果决定是否进行插入操作。在插入操作之后使用了 COMMIT 命令来提交事务。

以PL/SQL Developer工具举例,可使用SQL窗口、Command窗口执行,以下为SQL窗口执行演示:
以下为Command窗口执行方式:
执行命令为:@C:\Users\28235\Desktop\sys_role.sql
出现successfully字样则执行成功

Command窗口中,我已经重复执行多次,并不会因为主键冲突也报错,数据库表中也仅有一条记录

举一反三,创建表、新增表、删除表、删除函数、存储过程也可以使用类似语法

1.新增表字段参考写法:
DECLARE
  AN_FLAG NUMBER;
BEGIN
  SELECT COUNT(1)
    INTO AN_FLAG
    FROM ALL_TAB_COLS
   WHERE OWNER = 'NPTD_QWKJ'
     AND TABLE_NAME = 'T_REPORT_CONFIG_DETAIL'
     AND COLUMN_NAME = 'NEED_CONVERSION';
  IF AN_FLAG = 0 THEN
      EXECUTE IMMEDIATE 'alter table T_REPORT_CONFIG_DETAIL add NEED_CONVERSION NUMBER(1)';
	  EXECUTE IMMEDIATE 'comment on column T_REPORT_CONFIG_DETAIL.NEED_CONVERSION is ''是否需要进行数值的转换''';
  END IF;
  
  SELECT COUNT(1)
    INTO AN_FLAG
    FROM ALL_TAB_COLS
   WHERE OWNER = 'NPTD_QWKJ'
     AND TABLE_NAME = 'T_REPORT_CONFIG_DETAIL'
     AND COLUMN_NAME = 'CONVERSION_SIZE';
  IF AN_FLAG = 0 THEN
      EXECUTE IMMEDIATE 'alter table T_REPORT_CONFIG_DETAIL add CONVERSION_SIZE NUMBER(10)';
	  EXECUTE IMMEDIATE 'comment on column T_REPORT_CONFIG_DETAIL.CONVERSION_SIZE is ''需要转换的大小''';
  END IF;
  
END;
/
2.删除函数参考语法:
DECLARE
  AN_FLAG NUMBER;
BEGIN
  SELECT COUNT(1)
    INTO AN_FLAG
    FROM USER_PROCEDURES
   WHERE OBJECT_NAME = 'FUNC_GET_BIRTH_DT'
     AND OBJECT_TYPE = 'FUNCTION';
  IF AN_FLAG > 0 THEN
    EXECUTE IMMEDIATE 'DROP FUNCTION FUNC_GET_BIRTH_DT';
  END IF;

  SELECT COUNT(1)
    INTO AN_FLAG
    FROM USER_PROCEDURES
   WHERE OBJECT_NAME = 'FUNC_GET_DATASCOPE_DATA_DT'
     AND OBJECT_TYPE = 'FUNCTION';
  IF AN_FLAG > 0 THEN
    EXECUTE IMMEDIATE 'DROP FUNCTION FUNC_GET_DATASCOPE_DATA_DT';
  END IF;
END;
/
3.删除存储过程参考语法
DECLARE
  AN_FLAG NUMBER;
BEGIN
  SELECT COUNT(1)
    INTO AN_FLAG
    FROM USER_PROCEDURES
   WHERE OBJECT_NAME = 'RPT_SUMMARY_STATIC';
  IF AN_FLAG > 0 THEN
    EXECUTE IMMEDIATE 'DROP PROCEDURE RPT_SUMMARY_STATIC';
  END IF;

  SELECT COUNT(1)
    INTO AN_FLAG
    FROM USER_PROCEDURES
   WHERE OBJECT_NAME = 'I_MOIA_WARN';
  IF AN_FLAG > 0 THEN
    EXECUTE IMMEDIATE 'DROP PROCEDURE I_MOIA_WARN';
  END IF;

END;
/

附:利用Command窗口执行机制,我们可使用一个总的执行文件去执行这次所有的sql脚本

1.总的目录结构如下,HANDLE_ALL.pdc为总的执行文件,脚本上线仅需要执行这一个文件即可:

1.1.HANDLE_ALL.pdc文件内容如下:

2.init目录下结构如下,init_all.sql会去执行当前init下其他的sql文件

2.1.init_all.sql内容如下:

3.同理table目录下结构如下,table_all.sql会去执行当前table下其他的sql文件

3.1.table_all.sql内容如下:

4.sql脚本整理完成后,只需执行HANDLE_ALL.pdc即可

以上sql方案仅供参考,如有更好的上线方案,也可一起探讨交流!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值