Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1148|回复: 0

[JavaEE] 获取oracle表结构中的列名数据类型注释等信息的存储过程

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2013-12-22 14:53:53 | 显示全部楼层 |阅读模式
    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;
    非常方便尤其是字段非常多的时候。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 08:31 , Processed in 0.366485 second(s), 47 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表