`

Java之生成Oracle中用户定义的:函数,过程,包,触发器,并生成SQL文件

    博客分类:
  • Java
阅读更多
Oracle中查看用户定义的源码表名:user_source
在项目部署过程中,可能要执行sql文件,通常的方式为导出DMP,导入DMP文件解决,在有时也需要用到部署SQL文件,以下这个就为生成SQL文件的工具类,以后就方便多了呀!
具体代码如下:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 获取Oracle中用户定义的:函数,过程,包,触发器,并生成文件.sql
 * @author liuzd
 * @version 1.5 
 * */
public class CreateUserSQLUtil {	
	
	/**
	 * 默认生成文件路径为C盘
	 * */
	private String sqlFilePath = "c:/";
	
	/**
	 * 默认生成.sql文件名为:用户名.sql
	 * */
	private String sqlFileName = DBConnection.newInstance().getUsername();
	
	/**
	 * 默认间距为三Tab
	 * */
	public static final String DEFAULTTAB = "			";
	
	public CreateUserSQLSource(){
		
	}
	public CreateUserSQLSource(String sqlFileName){
		this.sqlFileName = sqlFileName;
	}
	
	public CreateUserSQLSource(String sqlFilePath,String sqlFileName){
		this(sqlFileName);
		this.sqlFilePath = sqlFilePath;		
	}	
	
	/**
	 * 系统表:user_source各列名
	 * */
	public static final String USERSOURCE_NAME = "NAME";
	public static final String USERSOURCE_TYPE = "TYPE";
	public static final String USERSOURCE_LINE = "LINE";
	public static final String USERSOURCE_TEXT = "TEXT";
	
	/**
	 * 查询用户资源SQL
	 * */
	public static final String SELECTUSERSOURCE = "select *From user_source";
	
	
	class UserSource{
		
		private String name;
		private String tyep;
		private Integer line;
		private String text;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getTyep() {
			return tyep;
		}
		public void setTyep(String tyep) {
			this.tyep = tyep;
		}
		public Integer getLine() {
			return line;
		}
		public void setLine(Integer line) {
			this.line = line;
		}
		public String getText() {
			return text;
		}
		public void setText(String text) {
			this.text = text;
		}
		public UserSource() {
			
		}
		public UserSource(String name, String tyep, Integer line, String text) {
			super();
			this.name = name;
			this.tyep = tyep;
			this.line = line;
			this.text = text;
		}		
	}
	
	/**
	 * 其实也可以直接在获取数据集时生成sql文件,但这样显示结构混乱
	 * */
	
	/**
	 * 获取用户资源表的数据
	 * */
	private Map<String,List<UserSource>> getMap(){
		Map<String,List<UserSource>> nameMap = new HashMap<String,List<UserSource>>(); 
		
		java.sql.Connection conn = null;
		java.sql.PreparedStatement ps = null;
		java.sql.ResultSet rs = null;		
		try {
			conn = DBConnection.newInstance().getConnection();
			ps = conn.prepareStatement(SELECTUSERSOURCE);
			ps.executeUpdate();
			rs = ps.getResultSet();
			String name = null;
			
			while(rs.next()){
				name = rs.getString(USERSOURCE_NAME);
				List<UserSource> list = nameMap.get(name);
				if(null == list){
					list = new ArrayList<UserSource>();
				}
				list.add(new UserSource(
						name,
						rs.getString(USERSOURCE_TYPE),
						rs.getInt(USERSOURCE_LINE),
						rs.getString(USERSOURCE_TEXT)
				));
				nameMap.put(name, list);				
			}
		
			
		} catch (Exception e) {
			throw new RuntimeException("获取用户资源表数据出错..." + e.getMessage(),e);
		}finally{
			try {
				if(null != rs){
					rs.close();					
				}
				if(null != ps){
					ps.close();					
				}
				if(null != conn){
					conn.close();					
				}				
			} catch (Exception e) {				
				rs = null;
				ps = null;
				conn = null;
				throw new RuntimeException("关闭数据库相关资源出错..." + e.getMessage(),e);
			}
			rs = null;
			ps = null;
			conn = null;
		}
		return nameMap;
	}
	
	/**
	 * 取出各个类型名称对应的源代码sql
	 * */
	private Map<String,Map<String,String>>  getTypeBySourceMap(){
		
		Map<String,List<UserSource>> nameMap = getMap();		
			
		String typeName = null;	
		String type = null;
		
		//统计类型个数Map
		Map<String,Map<String,String>> typeList = new HashMap<String,Map<String,String>>();
		
		StringBuilder info = new StringBuilder();
		
		for(Map.Entry<String,List<UserSource>> entity : nameMap.entrySet()){	
			
			//函数,过程...的名称
			typeName = entity.getKey();
			
			//存储函数或者过程的源代码
			StringBuilder sourceSbr = new StringBuilder();
			for(UserSource us : entity.getValue()){
				//可能值为:FUNCTION,PROCEDURE...
				type = us.getTyep();
				//sql文件中: --为注释性语句
				sourceSbr.append(us.getText()).append("\n");	
			}			
			
			//统计类型个数
			Map<String,String> typeBySourceMap = typeList.get(type);
			if(null == typeBySourceMap){
				typeBySourceMap = new HashMap<String,String>();
			}
			typeBySourceMap.put(typeName, sourceSbr.toString());			
			typeList.put(type, typeBySourceMap);	
		}
		
		return typeList;
	}
	
	/**
	 * 生成sql文件
	 * */
	public void createSqlFile(){
		
		Map<String,Map<String,String>> typeList = getTypeBySourceMap();
		
		String type = null;
		Integer counts = 0;
		
		StringBuilder showInfo = new StringBuilder();
		
		for(Map.Entry<String,Map<String,String>> entity : typeList.entrySet()){	
			
			type = entity.getKey();
			Map<String,String> sourceMap = entity.getValue();
			counts = sourceMap.size();
			
			showInfo.append("--"+type).append("--总共有:").append(counts).append("个\n");			
			int index = 0;			
			String typeName = null;
			
			for(Map.Entry<String,String> sourceEntity : sourceMap.entrySet()){	
				
				typeName = sourceEntity.getKey();				
				showInfo.append("--第").append((++index)).append("个").append(type).append("的名称是:").append(typeName).append(",内容如下: ").append("\n");
				showInfo.append(sourceEntity.getValue());	
			}			
		}
		
		//写入文本文件
		String fileName = getSqlFilePath()+getSqlFileName()+".sql";
		File file = new File(fileName);
		if(file.exists()){
			file.delete();
		}
		java.io.FileWriter fw = null;
		try {
			fw = new FileWriter(file);
			String fileContext = showInfo.toString(); 
			fw.write(fileContext);
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				fw.flush();
				fw.close();	
			} catch (IOException e) {				
				e.printStackTrace();
			}					
		}		
		System.out.println("生成sql文件成功,路径:" + fileName);		
	}
	
	public String getSqlFilePath() {
		return sqlFilePath;
	}
	public CreateUserSQLSource setSqlFilePath(String sqlFilePath) {
		this.sqlFilePath = sqlFilePath;
		return this;
	}
	public String getSqlFileName() {
		return sqlFileName;
	}
	public CreateUserSQLSource setSqlFileName(String sqlFileName) {
		this.sqlFileName = sqlFileName;
		return this;
	}
	
	public static void main(String[] args) {
		
		//默认路径及用户名.sql
		/*CreateUserSQLUtil cus = new CreateUserSQLUtil ();
		cus.createSqlFile();*/
		
		new CreateUserSQLUtil ().setSqlFilePath("d:/").setSqlFileName("liuzd").createSqlFile();
		//打印输出: 生成sql文件成功,路径:d:/liuzd.sql		
	}
}
分享到:
评论

相关推荐

    oracle 触发器实时调用java 中http接口

    总之,"Oracle触发器实时调用Java中HTTP接口"是一个数据库与应用程序实时通信的示例,涉及Oracle的触发器、存储过程和UTL_HTTP包,以及Java HTTP服务器的设计和实现。这样的设计需要对Oracle PL/SQL和Java网络编程有...

    oracle笔记(存储过程函数触发器游标流程控制等)

    这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...

    12oracle的PL/SQL编程-函数.包.触发器 PPT

    本文将深入探讨PL/SQL中的三个关键概念:函数、包和触发器,以及它们在Oracle数据库系统中的应用。 ### 1. 函数(Functions) 函数是PL/SQL中可重用的代码单元,它们接收输入参数,执行计算或操作,并返回一个结果...

    oracle函数触发器游标等几个小例子

    在`oracle函数.txt`中,你可能会找到关于如何声明、定义和调用函数的详细说明。 2. **Oracle游标**:游标允许我们处理查询结果集中的每一行数据。在`oracle游标.txt`中,你可以学习到如何声明、打开、读取和关闭...

    oracle中记录用户登录信息的触发器的例子

    ### Oracle中记录用户登录信息的触发器实例解析 #### 一、背景介绍 在Oracle数据库管理中,确保数据安全是一项至关重要的任务。其中,记录用户的登录信息(如登录时间、用户名和客户端IP地址等)可以帮助管理员更...

    Oracle中的函数、存储过程、包

    - **包**是封装相关函数和过程的容器,类似于Java中的接口,提供了一种组织和命名空间管理的方法。 - **包头(Specification)**:定义包的接口,包括函数和过程的签名,不包含实现细节。 - **包体(Body)**:...

    oracle pl/sql 存储过程和函数与触发器

    总之,Oracle PL/SQL中的存储过程、函数和触发器为数据库开发提供了强大的工具,它们使得数据库不仅仅是一个数据存储的地方,更是业务逻辑的执行平台。深入理解和熟练掌握这些概念,对于任何Oracle数据库管理员或...

    oracle存储过程、函数和触发器

    其中,存储过程、函数和触发器是Oracle数据库中的重要组件,它们极大地增强了数据库的灵活性和性能。接下来,我们将深入探讨这三个核心概念及其应用。 1. 存储过程: 存储过程是一组预先编译的SQL语句,存储在...

    oracle 触发器、存储过程、函数、包

    Oracle中的用户定义函数(UDF)允许开发者创建自定义的计算逻辑,例如,可以定义一个函数来计算员工的总薪酬,包括基本工资、奖金和津贴。 4. 包(Packages): 包是Oracle提供的高级封装机制,它可以将相关的函数...

    oracle调用java包

    在Oracle数据库系统中,有时我们需要将Java代码集成到PL/SQL程序中,以便利用Java的强大功能,例如处理复杂的算法、大数据操作或者与外部系统交互。本文将详细介绍如何在Oracle中调用Java包,并探讨相关知识点。 一...

    sqlserver自动生成sql语句工具sqlserver转oracle

    2. 函数和过程转换:SQL Server的某些内置函数在Oracle中可能没有直接对应的,需要找替代方案或者自定义函数。 3. 规则和约束:SQL Server的规则和约束在Oracle中可能需要重新定义,如检查约束、默认值、触发器等。...

    oracle触发器的创建与使用

    在Oracle中,存储过程是预先编译好的SQL语句集合,它可以接受参数、返回结果、包含流程控制和变量声明,类似于其他编程语言中的函数。存储过程的使用有以下几个主要优点: 1. **执行速度快**:由于存储过程在创建时...

    解密SQL触发器、存储过程、函数

    SQL触发器、存储过程和函数是数据库管理中的重要组成部分,它们极大地增强了数据库的功能性和灵活性。在本篇文章中,我们将深入探讨这些概念,并提供实用的示例来帮助理解它们的使用和重要性。 **SQL触发器...

    oracle 视图,函数,过程,触发器自动编译脚本

    3. **查询失效对象**:脚本通过`sqlplus`工具连接到Oracle数据库,并执行一段SQL脚本来查找所有类型为触发器(Trigger)、过程(Procedure)、函数(Function)和视图(View),且状态为无效的对象。为了排除系统...

    1-oracle培训整套教程(存储过程-函数-触发器,异常处理,游标.存储包)

    在`1-oracle教程之存储过程-函数-触发器.ppt`中,你将学习如何定义、调用和管理存储过程。 接着,我们探讨函数。函数与存储过程类似,但返回一个特定值。它们在查询中可作为表达式的一部分使用,增加了查询的灵活性...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    《Oracle触发器与存储过程高级编程》第3版是一本深入探讨Oracle数据库中触发器和存储过程技术的专业书籍。在Oracle数据库系统中,触发器和存储过程是数据库管理员和开发人员进行复杂业务逻辑处理和数据管理的重要...

    Oracle PL-SQL编程 创建存储过程、函数、触发器等

    本篇文章介绍了Oracle PL/SQL编程中的几个核心概念:存储过程、函数、包以及触发器。通过这些编程单元,开发者可以构建出高效、灵活和安全的数据库应用。理解这些概念对于有效地使用Oracle数据库至关重要。

    存储过程,存储函数和触发器

    在Java中,可以使用JDBC驱动来调用存储过程或存储函数。通常需要使用`CallableStatement`对象来进行调用。 #### 调用存储过程 ```java Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@...

    oracle触发器调用存储过程

    "Oracle触发器调用存储过程" Oracle触发器可以调用存储过程,以实现业务逻辑的自动化执行。然而,在触发器中调用存储过程时,需要注意事务的隔离性,以避免出现锁定和死锁的问题。Oracle自治事务(Autonomous ...

Global site tag (gtag.js) - Google Analytics