SECOND结果集给出了错误

时间:2014-07-31 06:04:44

标签: java sql oracle oracle11g resultset

我正在尝试访问2个不同数据库的列名;一个是SQL,另一个是Oracle。该程序编译正常,但执行时它给rsmo(oracle的结果集)一个错误:没有调用ResultSet.next。

关于该计划:

我从数据库名称,ip,userid传递文本文件并将其存储在字符串中,然后再将其传递给连接。目的是将数据从一个数据库复制到另一个数据库,但是现在我所做的就是在插入之前找到列名和列数。在任何时候,只有2个表,一个是SQL,另一个是oracle,要复制到和来。因此,我有一个colNames数组,用于存储各列的名称。

Code snippet:
    Connection CONN_SQL = DriverManager.getConnection(URL_SQL, USER_SQL, PASS_SQL);     
    Connection CONN_ORA = DriverManager.getConnection(URL_ORA, USER_ORA, PASS_ORA);

    DatabaseMetaData dmds = CONN_SQL.getMetaData();
    DatabaseMetaData dmdo = CONN_ORA.getMetaData();

    ResultSet rsms = dmds.getColumns(null, null, SQLTABLENAME, null);
    ResultSet rsmo = dmdo.getColumns(null, null, ORACLETABLENAME, null);
    String rs;
    int columns=1, columno=1;
    while(rsms.next() || rsmo.next()){
    if(rsms!=null){
            colNames[0][columns]=rsms.getString(4);
            System.out.println("colnames:" +colNames[0][columns]);
            columns++;}
    if(rsmo!=null){
        System.out.println(rsmo.getString(1));
        colNames[1][columno] = rsmo.getString(4);
        System.out.println("columno: "+colNames[1][columno]);
        columno++;
    }
    }

我尝试过的事情和他们的失败:

  1. 尝试了2个while循环的2个结果集,rsms(SQL one)运行完美,返回列名。但是rsmo(oracle one)没有运行。它会跳过while循环,但会在AND之后执行任何语句。
  2. 我试图创建另一个结果集,它只对SQL和oracle执行SELECT前20个查询。再次,它适用于SQL,但跳过了ORACLE的ResultSet。
  3. 我尝试过stackoverflow的一些解决方案,例如:

    1. 将结果集设置为first,这会导致运行时异常,并说明" Exhausted ResultSet"。

    2. if(!rs.next()),这也会导致Exhausted ResultSet异常。

  4. 我只是想知道我做错了什么,或者总是欣赏解决方案。感谢。

    更新:

    发现结果集不允许多次迭代。尝试在使用后关闭SQL的ResultSet,然后打开另一个。仍然没有用,Oracle RS再次被跳过。

4 个答案:

答案 0 :(得分:2)

在此代码中

while(rsms.next() || rsmo.next()){

如果rsms.next()被评估为真,则rsmo.next()甚至不会被调用,可能是假的。

while循环中,rsmsrsmo何时突然变为空?

while (true) {
     boolean foundms = false;
     boolean foundmo = false;
     if (rsms.next()) {
         // do stuff
         foundms = true;
     }
     if (rsmo.next()) {
         // do stuff
         foundmo = true;
     }

     if (!foundms && !foundmo) break;
 }

如果仍然无效,请尝试借用(来自Darshan的回答)

ResultSet rsmo = dmdo.getColumns(null, null, ORACLETABLENAME, null);
ResultSetMetaData md = rsmo.getMetaData();
for (int i=1; i<=md.getColumnCount(); i++)
{
  System.out.println(md.getColumnName(i));
}

答案 1 :(得分:0)

你已经把OR条件。每次都满足,并且对于SQL来说是正确的。尝试分离while循环并执行

 while(rsms.next()){
    if(rsms!=null){
            colNames[0][columns]=rsms.getString(4);
            System.out.println("colnames:" +colNames[0][columns]);
            columns++;}}
while(rsmo.next()){
    if(rsmo!=null){
        System.out.println(rsmo.getString(1));
        colNames[1][columno] = rsmo.getString(4);
        System.out.println("columno: "+colNames[1][columno]);
        columno++;
    }
    }

答案 2 :(得分:0)

运营商'||'在你的while循环中,如果第一个语句为true,那么他不会检查任何后面的语句。这就是所谓的短路。尝试使用单个'|'在两个单独的while循环中签名或分裂。

答案 3 :(得分:0)

尝试使用以下代码进行oracle

ResultSet rsmo = dmdo.getColumns(null, null, ORACLETABLENAME, null);
ResultSetMetaData md = rsmo.getMetaData();
for (int i=1; i<=md.getColumnCount(); i++)
{
 System.out.println(md.getColumnLabel(i));
}

希望它有所帮助。