在实际项目开发过程中,sql脚本需要多次执行。而一般的DML和DDL语句一般只能执行一次,再次执行执行时就会报错(操作对应已存在/不存在),所以必须将sql脚本生成可重复执行的。本文共分为4部分:1.什么是DDL和DML;2.DDL可重复执行脚本;3.DML可重复执行脚本。

1.什么是DDL和DML

  DDL: Data Defination Language,即数据定义语言。主要是是对表进行操作(DROP, CREATE,ALTER...)

  DML: Data Management Language,即数据控制语句。主要是对记录进行操作(INSERT,DELETE,UPDATE....)

2.DDL可重复执行脚本

  2.1 通用格式:

-- 定义便变量并赋值
DECLARE
varName SqlType := value;
V_SQL VARCHAR2(1000) := SqlStatement;
-- 执行逻辑
BEGIN
IF IfCondition THEN
EXECUTE IMMEDIATE V_SQL;
END IF;
END;
-- ‘/’可看作结束符
/

  2.2  创建一张新的表单以及序列

DECLARE
V_TABLE VARCHAR2(100):='T_DEFINE';
V_CREATE_SQL VARCHAR2(2000):='CREATE TABLE T_GRI_TREATY_DEFINE(
ID NUMBER(10) PRIMARY KEY,
TREATY_ID NUMBER(10) not null,
RISK_CAT NUMBER(10) not null,
ANNUAL_AGG_LIMIT_FLAG NUMBER(1) DEFAULT 2,
ANNUAL_AGG_LIMIT_AMOUNT NUMBER(24,4),
INSERT_BY NUMBER(10),
INSERT_TIME DATE,
UPDATE_BY NUMBER(10),
UPDATE_TIME DATE
)';
V_SEQUENCE_SQL VARCHAR2(2000):='CREATE SEQUENCE S_GRI_TREATY_DEFINE_ID';
V_CNT NUMBER:=0;
BEGIN
  -- 查询表是否存在(0:不存在,1:存在)
SELECT COUNT(1) INTO V_CNT FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME=V_TABLE;
IF V_CNT=0 THEN
EXECUTE IMMEDIATE V_CREATE_SQL;
EXECUTE IMMEDIATE V_SEQUENCE_SQL;
END IF;
END;
/

  2.2 给表中的列添加注释

DECLARE
V_COLUMN VARCHAR2(100):='ID';
V_TABLE VARCHAR2(100):='T_DEFINE';
-- 注释的内容必须用两个单引号括起来
V_SQL VARCHAR2(2000):='COMMENT ON COLUMN T_DEFINE.ID IS ''PK S_DEFINE_ID''';
V_CNT NUMBER:=0;
BEGIN
  -- 查询列是否存在
SELECT COUNT(1) INTO V_CNT FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME=V_TABLE AND T.COLUMN_NAME=V_COLUMN ;
IF V_CNT>0 THEN
EXECUTE IMMEDIATE V_SQL;
END IF;
END;
/

  2.3 给表添加一列(alter其他语句例子基本相同,只需要修改V_SQL的值和IF的条件)

DECLARE
V_COLUMN VARCHAR2(100):='LIMIT_AMOUNT';
V_TABLE VARCHAR2(100):='T_TREATY';
V_SQL VARCHAR2(2000):='ALTER TABLE T_TREATY ADD LIMIT_AMOUNT NUMBER(24,4) ';
V_CNT NUMBER:=0;
BEGIN
SELECT COUNT(1) INTO V_CNT FROM USER_TAB_COLUMNS T WHERE T.TABLE_NAME=V_TABLE AND T.COLUMN_NAME=V_COLUMN ;
IF V_CNT=0 THEN
EXECUTE IMMEDIATE V_SQL;
END IF;
END;
/

3. DML可重复执行脚本

  3.1 update语句本身就可以多次执行,因此不用进行特殊处理

  3.2 insert语句只需要在insert之前追加delete语句即可。

delete from t_vehicle_info where VEHICLE_ID = 1763154645;

insert into t_th_int_redbook_info (VEHICLE_ID,MAKE_NAME, FAMILY_NAME, DESCRIPTION, UPDATE_TIME)
values (1763154645, 'BMW', '430i', 'BMW 430i Coupe M Sport', '11-JUL-17');

4. 用Java生成DDL可重复执行脚本

package com.ebao.th.gs.integration.util;

import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date; public class GeneraterPKGUtils { public static final String FILE_SPLIT="_"; public static void main(String[] args) { //调用函数 //生成文件 } public static String generaterModifyColType(String column,String tableName,String type){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName+"';\r\n");
pkg.append(" v_sql varchar2(2000):='ALTER TABLE "+tableName+" MODIFY "+column+type+"';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table and t.COLUMN_NAME=v_column;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String generaterRenameColumn(String column,String tableName){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName+"';\r\n");
pkg.append(" v_sql varchar2(2000):='alter table "+tableName.toUpperCase()+" rename column "+column+" to "+column.replaceAll("Insured", "Holder").toUpperCase()+"';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table and t.COLUMN_NAME=v_column ;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String generateCreateTable(String tableStr,String tableName){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_table varchar2(100):='"+tableName+"';\r\n");
pkg.append(" v_sql varchar2(2000):='"+tableStr.trim()+"';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tables t where t.TABLE_NAME=v_table ;\r\n");
pkg.append(" if v_cnt=0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String renameColumn(String column,String tableName,String type){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column.trim()+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName.trim()+"';\r\n");
pkg.append(" v_sql varchar2(2000):='ALTER TABLE "+tableName+" rename column "+column+" to "+type+"';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table and t.COLUMN_NAME=v_column ;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String generatePrimaryKey(String column,String tableName,String type,String constraintName){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column.toUpperCase()+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName.toUpperCase()+"';\r\n");
pkg.append(" v_sql varchar2(2000):='alter table "+tableName.toUpperCase()+" add constraint "+constraintName.toUpperCase()+" primary key ("+column.toUpperCase()+") ';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_constraints t where t.CONSTRAINT_NAME='"+constraintName.toUpperCase()+"' and constraint_type='"+type.toUpperCase()+"' and table_name=v_table ;\r\n");
pkg.append(" if v_cnt=0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String createIndex(String column,String tableName,String type,String indexName){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column.toUpperCase()+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName.toUpperCase()+"';\r\n");
pkg.append(" v_sql varchar2(2000):='create index "+indexName.toUpperCase()+" on "+tableName.toUpperCase()+"("+column.toUpperCase()+")';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_indexes t where t.INDEX_NAME='"+indexName.toUpperCase()+"' and index_type='"+type.toUpperCase()+"' and table_name=v_table ;\r\n");
pkg.append(" if v_cnt=0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String dropColumn(String column,String tableName){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName+"';\r\n");
pkg.append(" v_sql varchar2(2000):='alter table "+tableName+" drop column "+column+"';\r\n");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table and t.COLUMN_NAME=v_column ;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String addComment(String column,String tableName,String comments){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_column varchar2(100):='"+column+"';\r\n");
pkg.append(" v_table varchar2(100):='"+tableName.toUpperCase()+"';\r\n");
pkg.append(" v_sql varchar2(2000):='COMMENT ON COLUMN "+tableName+"."+column+" IS ''"+comments+"'''\r\n;");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table and t.COLUMN_NAME=v_column ;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static String addCommentOnTable(String tableName,String comments){
StringBuffer pkg = new StringBuffer();
pkg.append("declare\r\n");
pkg.append(" v_table varchar2(100):='"+tableName.toUpperCase()+"';\r\n");
pkg.append(" v_sql varchar2(2000):='comment on table "+tableName.toUpperCase()+" IS ''"+comments+"'''");
pkg.append(" v_cnt number:=0;\r\n");
pkg.append("begin\r\n");
pkg.append(" select count(1) into v_cnt from user_tab_columns t where t.TABLE_NAME=v_table ;\r\n");
pkg.append(" if v_cnt>0 then\r\n");
pkg.append(" execute immediate v_sql;\r\n");
pkg.append(" end if;\r\n");
pkg.append("end;\r\n");
pkg.append("/\r\n");
return pkg.toString().toUpperCase();
} public static void generateFile(String sql,String name) throws Exception{
String path="D:"+File.separator+"dbscript"+File.separator;
File f = new File(path);
if(!f.exists()){
f.mkdirs();
}
FileWriter writer=null;
String dateStr ="";
SimpleDateFormat sim = new SimpleDateFormat("yyyyMMddHHmmss");
dateStr = sim.format(new Date());
String fileName = path+dateStr+FILE_SPLIT+name.trim().toUpperCase()+"_ddl.sql";
try {
writer = new FileWriter(fileName);
writer.write(sql);
writer.flush();
Runtime.getRuntime().exec("notepad.exe "+fileName);
}
catch (Exception e) {
//e.printStackTrace();
}finally{
writer.flush();
if(writer!=null){
writer.close();
}
} }
}

  更多内容,请访问:http://www.cnblogs.com/BlueStarWei

java之生成可重复执行的sql脚本的更多相关文章

  1. 查看oracle数据库下面的所有的表,执行某个sql脚本:

    查看oracle数据库下面的所有的表: select * from user_tables;//user为用户名 执行某个sql脚本: SQL>@e 文件名.sql

  2. mysql中如何在命令行中,执行一个SQL脚本文件?

    需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况, ...

  3. MySQL执行外部sql脚本文件的命令

    sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件.基本步骤如下:1.创建包含sql命 ...

  4. MySQL执行外部sql脚本文件命令是报错:unknown command

    使用source导入外部sql文件: mysql> source F:\php\bookorama.sql; -------------- source F: -------------- ER ...

  5. kettle job如何利用java的反射机制获取执行的sql语句

    kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...

  6. 可重复执行的SQL Script

    问题 在工作中偶尔会遇到这样的问题:SQL script重复执行时会报错. 理想的状态下,SQL script跑一遍就够了,是不会重复执行的,但是实际情况往往很复杂. 比如Dev同学在开发时在A环境把 ...

  7. shell脚本中执行mysql sql脚本文件并传递参数

    1 shell 文件内容替换 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法. 调用sed命 ...

  8. 执行大SQL脚本方法

    当我们需要在SQLServer数据库里面执行一个大的文件时,会发现数据库根本无法打开该脚本文件,原因是因为查询分析器只能执行100M以内的文件,所以脚本过大就会造成内存溢出.此时我们可以使用osql工 ...

  9. java中生成不重复随机的数字

    Java中产生随机数 1 . 调用java.lang下面Math类中的random()方法产生随机数 新建一个文件后缀名为java的文件,文件名取为MyRandom,该类中编写如下的代码: publi ...

随机推荐

  1. CSS3-loading动画(五)

    CSS3-loading加载动画 在线示例demo:http://liyunpei.xyz/loading.html 之前发了四篇,二十二个效果,今天再分享六个效果,总计二十八个效果. 二十三.效果二 ...

  2. vue的增删改查

    我们把这些用户信息保存到list的数组中,然后增删改查就在这个数组上进行: list: [ { username: 'aaaaa', email: '123@qq.com', sex: '男', pr ...

  3. PHP中的数据结构

    PHP7以上才能安装和使用数据结构,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置  Coll ...

  4. 自定义VS程序异常处理及调试Dump文件(一)

    自定义VS程序异常处理及调试Dump文件(一) 1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件 ...

  5. cognos安装和配置即席报表流程

    安装前的配置: 1.  Cognos数据库的创建和用户的创建 注意:字符集需要设置为UTF-8:Cognos用户权限可以给dba: 2.系统上原有JDK的删除(因为Cognos已经自带JDK) 安装- ...

  6. php 设计模式之策略模式

    策略模式:定义算法,并将其封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 步骤:1.抽象策略角色:定义接口或抽象类 2.具体策略角色:实现该接口(抽象类),即具体的算法实现 ...

  7. JPush 使用教程

    JPush 使用教程 自己使用的一些经验,为了方便直接从这里复制过去就行. 就当做个笔记,防止长时间忘记之后,还需要去官网看文档. 主要思路: sdk文件 + 三方依赖系统库 + 头文件 + 添加代理 ...

  8. 【HTML】DocType

    一.docType是什么 <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 在 HTML 4.01 中,<!D ...

  9. 关于EF第一次加载慢或过一段时间不访问时再次访问加载慢问题的总结

    优化方案 1.安装Application Initialization 这是在iis8出来后才有的,iis8内置的功能,而对于iis7.5也提供了一个扩展以支持这个功能. Application In ...

  10. spring是什么,Spring能帮我们做什么

    1. spring是什么? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由一组相 ...