不知道大家会不会遇到这样的问题,辛辛苦苦开发完准备上线了,一大堆的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窗口执行演示:![](https://i-blog.csdnimg.cn/blog_migrate/39c83d29c6cb2ea6cfc0446113ddd15c.png)
以下为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;
/