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
}
}