转载—jdbc插入主从表时,如何取回主表id。以及对oracle的改进

1 篇文章 0 订阅
1 篇文章 0 订阅

用jdbc给数据库插入数据,主从表插入的过程中,需要先取出主表id。 

conn = DriverManager.getConnection(PL.DATABASE_URL ,
                        PL.DATABASE_UID,PL.DATABASE_PWD );
                pstmt = conn.prepareStatement(PL.InsertPerson,Statement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, this.person.getAddress());
                pstmt.executeUpdate();
                ResultSet rs=pstmt.getGeneratedKeys();
                long m=(long) 0;
                if(rs.next()){
                    /*mysql code*/    m=rs.getLong(1);   
                }
                pstmt.close();
                pstmt = null;

                return   m;

以上代码在mysql数据库环境下工作正常,转移到oracle环境出现以下异常:


void insertPersons(ServiceFormBean bean): SQLException 无效的列类型: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor

后在网上找到以下解决方法,感谢网友智慧:

 1,用JDBC的getGeneratedKeys,返回的是Oracle 的rowid.但是就是修改代码,比较麻烦,第一次返回rowid, 第二次再通过rowid再查一次数据库。
String sql = "insert into xx_cust(cust_type,cust_name,login_name)"
+ " values('ipn','aaa','bb')";
Connection conn = DBConnectionManager.getConnection();
PreparedStatement sta = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
sta.execute();
System.out.println(sta.getGeneratedKeys());
ResultSet rest = sta.getGeneratedKeys();
rest.next();
String rowid=rest.getString(1);
System.out.println("rowid="+rowid);
PreparedStatement stat=conn.prepareStatement("select cust_id from xx_cust where rowid=?");
stat.setString(1, rowid);
ResultSet rest2 = stat.executeQuery();
rest2.next();
String custId=rest2.getString(1);
System.out.println("custid="+custId);
2,通过用Oracle 的returning 语句
因为要用到oracle自己的API,所以如何用到像c3po等通用数据库连接池的话可以不能用。但是在数据库只连接一次。Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();?
String url="jdbc:oracle:thin:@192.168.3.95:1521:tdm"; //orcl为数据库的SID?
String user="pesup";?
String password="pesup";?
Connection conn= DriverManager.getConnection(url,user,password);
String sql = "insert into xx_cust(cust_type,cust_name,login_name)"
+ " values('ipn','aaa','bb') returning cust_id into ?";
OraclePreparedStatement sta = (OraclePreparedStatement) conn
.prepareStatement(sql);
sta.registerReturnParameter(1, OracleTypes.INTEGER);
int count = sta.executeUpdate();
if (count > 0) {
ResultSet rset = sta.getReturnResultSet();
while (rset.next()) {
String name = rset.getString(1);
System.out.println("name=" + name);}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值