TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
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;
非常方便尤其是字段非常多的时候。
|
|