Oracle DB Query在sqlDev中运行,但在Java程序中运行

时间:2011-08-15 17:17:00

标签: java database oracle oracle-sqldeveloper

我一直在搞乱从我的JAVA应用程序运行的Oracle数据库查询。我可以成功地将它们全部运行在SQL Developer中。但是当我尝试从我的JAVA应用程序执行它们时,我通常会在某些查询中获得UpdatadbleResultSet Error/Exception

另外,有时我收到ExhaustedResultset。正如我在底部提到的,我将重新解决这个问题(当我有机会时)。我一直在编辑,很快就会成为一本书。

这是为什么?我似乎无法确定问题所在。

某些查询成功运行,例如:

SELECT table_name 
FROM all_tables

SELECT column_name, data_length 
FROM all_tab_columns 
WHERE table_name = 'mytable'

但是当我尝试运行类似

的东西时
SELECT length(<myColumnName>) 
FROM mytable 

我得到了updateableResultSetError

我正在运行查询作为按钮点击调用的方法(例如下面的例子)。

static void testQuery() {   
 String query = "SELECT blah from blah"
 String length;
 ResultSet rs = db.runQuery(query);
 Length = rs.getString("length(myCol)")
 System.out.println(length);
}

我也试过while rs.next()

我只能认为由于某种原因我无法进入每张桌子而只能拉出“更大”的图片。

编辑:说明数据库连接

我使用已添加到项目中的其他jar文件进行连接。

private static IDriver driver = null;
private static Database db = null;

然后我以单独的方法传递所有连接凭据。

private void connectDB(){
driver = new OracleDriver();
db = new Database(driver)   
driver.getPassword;
driver.getetc;
driver.getEtc;
}

编辑:

当我收到所有我正在返回的东西时,是。

Ljava.lang.StatckTraceElement;(assortment of random characters).

我可能没有正确的堆栈痕迹,所以有人可以填补我。毕竟我提供了赏金。

此外,我会编辑这个问题,并在有空的时候再次将其分解。

3 个答案:

答案 0 :(得分:1)

尝试通过columnIndex而不是列名检索select语句中的值,看看是否有所不同。

目前,由于该代码未发布,很难说出db.runQuery()的内容。

String query = "SELECT length(myCol) FROM myTable";
String length;
ResultSet rs = db.runQuery(query);

while (rs.next()) {
 length = rs.getString(1);
 System.out.println(length);
}

答案 1 :(得分:1)

我已经了解了这里可能发生的事情(这可以解释为什么有些查询有效,有些查询无效)。当使用结果集的getString()方法时,根据jdbc ResultSet javadocs,列标签。

  

使用SQL AS子句指定的列的标签。   如果未指定SQL AS子句,则标签是列的名称

由于“length(myCol)”既不是标签也不是列名,因此可能因为它而失败(但没有堆栈跟踪,很难说出你的问题实际上是什么)。

尝试

String query = "SELECT length(myCol) AS myCol_len FROM myTable"
ResultSet rs = db.runQuery(query);
String length = rs.getString("myCol_len");

虽然你确定,但你不想要:

int length = rs.getInt("myCol_len");

或者(由Kal编写),您可以使用列索引从结果集中获取数据,从而无需SQL AS标签:

String query = "SELECT length(myCol) FROM myTable"
ResultSet rs = db.runQuery(query);
String length = rs.getString(1);

答案 2 :(得分:1)

您的问题是您正在尝试更新无法更新的查询,因此可更新的结果错误。似乎创建数据库连接或执行查询的任何人都在创建可更新的结果集。

您不能在可更新的结果集中使用某些类型的select:您不能使用聚合函数(例如length,min,max),您不能使用select * etc.)

有关完整列表,请参阅Result Set Limitations and Downgrade Rules