create or replace procedure QUERY_DOMAIN
(
tableName          in    varchar2,                       –表名
resultFlag         out   varchar2,                       —1:返回为空,0:返回一条记录,1:返回多条记录
errorFlag          out   varchar2,                       —0:结果正常,1:发生异常
returningResultSet out   P_COMMON_PACKAGE.commonInfo     —结果集返回
)
is
v_sql          varchar2(3500);
v_tableName    varchar2(500);
begin
v_tableName:=tableName;
v_sql:=’ select  t.COLUMN_NAME,t.DATA_TYPE,s.COMMENTS   from  all_tab_columns  t left join
user_col_comments s    on   lower(s.TABLE_NAME)=lower(t.table_name)
where lower(s.table_name)=”’||v_tableName||”’ and t.COLUMN_NAME=s.COLUMN_NAME  ‘;
open  returningresultSet for  v_sql;
resultFlag:=1;
errorFlag:=0;
—出现运行异常
exception
when NO_DATA_FOUND
then
resultFlag:=-1;
errorFlag:=1;
open returningresultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
when others
then
resultFlag:=-1;
errorFlag:=1;
open returningresultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
end;
返回游标,可以供Java调用。

比如:有时候,数据库表字段非常多,而我们又需要去一个一个地写其属性的时候,重复性的工作非常多,这时候调用该存储过程,生成Java实体中的属性。

/**
* 设置domain的属性。
* @param conn 连接对象
* @param tableName 表名
*/
public static void getDomainProperties(Connection conn,String tableName) {
try {
//使用CallableStatement调用存储过程。
CallableStatement c = conn.prepareCall(“{call QUERY_DOMAIN(?,?,?,?)}”);
//设置存储过程参数
c.setString(1, tableName);
c.registerOutParameter(2, OracleTypes.CHAR);
c.registerOutParameter(3, OracleTypes.CHAR);
c.registerOutParameter(4, OracleTypes.CURSOR);
c.execute();
//得到游标返回值
ResultSet res = (ResultSet) c.getObject(4);
//循环遍历游标
while (res.next()) {
//从游标中获取列名,数据类型,注释。
String column_name = res.getString(“COLUMN_NAME”);
String type = res.getString(“DATA_TYPE”);
String comment = res.getString(“COMMENTS”);
//打印字段的注释
System.out.println(“\t/*” + comment + “*/”);
//将Oracle类型转为Java类型
if (“DATE”.equals(type.toUpperCase()) || “TIMESTAMP”.equals(type.toUpperCase())) {
type = “Date”;
} else if (type.toUpperCase().indexOf(“VARCHAR”) != -1) {
type = “String”;
} else if (“NUMBER”.equals(type.toUpperCase())) {
type = “Integer”;
} else if (“CLOB”.equals(type.toUpperCase())) {
type = “String”;
}
//使用驼峰命名法设置Java属性
column_name = column_name.toLowerCase();
char[] colArr = column_name.toCharArray();
String temp = “”;
for (int i = 0; i < colArr.length; i++) {
int letter = (int) colArr[i];
if (letter != 95) {
temp += colArr[i];
} else if (letter == 95) {
char ss = colArr[i + 1];
String values = String.valueOf(ss);
temp = temp + values.toUpperCase();
i = i + 1;
}
}
//打印属性
System.out.println(“\tprivate ” + type + ” ” + temp + “;”);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

生成的属性大概如下:

private String haveReport;
/*报告审核者*/
private String haveReportUser;
/*报告审核时间*/
private Date haveReportTime;
/*报告是否发送(0:未知;1:报告已发送;2:报告未发送)*/
private String reportSend;
/*报告发送者*/
private String reportSendUser;
/*报告发送时间*/
private Date reportSendTime;
/*检测者*/
private String labWorker;
/*报告审核者*/
private String reportUser;
/*样品记录创建者*/
private String sampleCreateUser;
/*样品记录创建时间*/
private Date sampleCreateTime;

非常方便尤其是字段非常多的时候。

更多:http://www.javaxxz.com/thread-66715-1-1.html

posted on 2013-01-15 12:55  Java学习者  阅读(962)  评论(0编辑  收藏  举报