Oracle DB Query выполняется в sqlDev, но не в программе Java - PullRequest
0 голосов
/ 15 августа 2011

Я возился с запросами БД Oracle, которые запускаются из моего приложения JAVA.Я могу успешно заставить их всех работать в 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()

Я могу только думать, что по какой-то причине я не могучтобы попасть в каждую таблицу, и я могу вытащить только "большую" картинку.

РЕДАКТИРОВАТЬ: Объясненное Соединение с БД

Я подключаюсь, используя некоторыедругие jarfiles, которые были добавлены в мой проект.

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;
}

EDIT:

КогдаЯ получаю отслеживание, все, что я возвращаю, это.

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

Возможно, я не получаю правильные следы стека, так что кто-то может заполнить меня. В конце концов, я предлагаю вознаграждение.

Также я буду редактироватьэтот вопрос и разбить его снова, когда у меня будет время.

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Я имею в виду, что здесь может происходить (что объясняет, почему некоторые запросы работают, а некоторые нет).Согласно jdbc ResultSet javadocs , при использовании метода getString () набора результатов метка столбца.

метка для столбца, указанного в предложении 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);
1 голос
/ 21 августа 2011

Ваша проблема в том, что вы пытаетесь обновить запрос, который не может быть обновлен, следовательно, ошибка результата обновления.Кажется, что тот, кто создает соединение с вашей базой данных или выполняет ваш запрос, создает обновляемый набор результатов.

Вы не можете использовать определенные типы выбора в обновляемом наборе результатов: вы не можете использовать агрегированные функции (например,как длина, мин., макс.), вы не можете использовать select * и т. д.)

Полный список см. Ограничения набора результатов и Правила понижения

1 голос
/ 15 августа 2011

Попробуйте извлечь значение в вашем операторе выбора через columnIndex вместо имени столбца и посмотрите, имеет ли это значение.

В настоящее время трудно сказать, что делает ваш 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);
}
...