Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 java storedproc  [new]
alexander_reshetnikov
Member

Откуда:
Сообщений: 5
Может кто уже сталкивался с подобным...
соединяюсь из хранимой процедуры к другой базе, пробую сделать запрос.
Соединение проходит успешно, вот только запрос ничего не выдает. В чем может быть дело???
использую DB2 8. процедура написана на java.

import java.sql.*; // Классы JDBC

public class PRdeb
{
public static void pRdeb ( int[] SQLCODE,
String[] SQLMessage,
String[] comment,
ResultSet[] rs1 ) throws Exception {
try { // Load the JDBC driver
Class.forName("com.ibm.db2.jcc.DB2Driver");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}

// Задать возвращаемые параметры
SQLCODE[0] = 0; // Правильная SQLCODE
SQLMessage[0] = "sql mess"; // Правильная SQLMessage
comment[0] = "comment";

PreparedStatement stmt = null;
boolean bFlag;
String sql;

String userid="userid"; // Declare variables for user ID and password
String password="password";

try{
Connection con = DriverManager.getConnection("jdbc:db2://host:50000/DATABASE", userid, password);
if (con == null){
comment[0] = "con == null";
}

sql = "SELECT PROCSCHEMA, PROCNAME FROM SYSCAT.PROCEDURES";
stmt = con.prepareStatement( sql );
bFlag = stmt.execute();
rs1[0] = stmt.getResultSet();
}
catch (SQLException e) {
// Задать возвращаемые параметры
SQLCODE[0] = e.getErrorCode();
SQLMessage[0] = e.getMessage();

// Закрыть открытые ресурсы
try {
if (rs1[0] != null) rs1[0].close();
if (stmt != null) stmt.close();
}
catch (SQLException e2) {
};
}
}
}
20 мар 07, 14:28    [3919393]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
А так:
rs1[0] = stmt.executeQuery();
?
20 мар 07, 15:26    [3919821]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
alexander_reshetnikov
Member

Откуда:
Сообщений: 5
Mark Barinstein
А так:
rs1[0] = stmt.executeQuery();
?


это уже пройдено, и так пробовал...
Могу только гадать - может что не то с правами, но подключаемый из процедуры пользователь - админ базы.
20 мар 07, 15:32    [3919878]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
А вот это
if (rs1[0] != null) rs1[0].close();
if (stmt != null) stmt.close();
убрать?
20 мар 07, 16:05    [3920162]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
alexander_reshetnikov
Member

Откуда:
Сообщений: 5
Mark Barinstein
А вот это
if (rs1[0] != null) rs1[0].close();
if (stmt != null) stmt.close();
убрать?


Не лечит.
что примечательно, вставка выполнилась успешно
INSERT INTO sa.persons (person_name, person_lastname) VALUES('new name','new lastname')
20 мар 07, 16:30    [3920371]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
alexander_reshetnikov
Member

Откуда:
Сообщений: 5
Спасибо моему коллеге по работе, бросил верную идею:
результирующий набор данных срабатывал только для default:connection.
Т.е. при подключении к другой базе мы отрабатывали все sql-скрипты, получали наборы данных, но не могли вернуть из процедуры набор данных, принадлежащие другому соединению, отличному от родной базы для хранимой процедуры. Почему? ответ не известен.
20 мар 07, 16:49    [3920539]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
alexander_reshetnikov
Mark Barinstein
А вот это
if (rs1[0] != null) rs1[0].close();
if (stmt != null) stmt.close();
убрать?


Не лечит.
Если вы будете закрывать ResultSet внутри процедуры, который хотите выдавать наружу, то, согласно доке, вы его не вернете.
20 мар 07, 16:59    [3920629]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
alexander_reshetnikov
Member

Откуда:
Сообщений: 5
Этот кусок сгенерил мастер построений в центре разработки DB2.
ResultSet закрывается при генерации SQLException, что вполне логично.
20 мар 07, 17:25    [3920851]     Ответить | Цитировать Сообщить модератору
 Re: java storedproc  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
alexander_reshetnikov
Этот кусок сгенерил мастер построений в центре разработки DB2.
ResultSet закрывается при генерации SQLException, что вполне логично.
Виноват, не обратил внимание на то, что он в catch блоке закрывается.
Тут дело вот в чем:
Все это работает с db2:default:connection из-за специальной обработки такого соединения.
В своих примерах они в теле процедуры его (Connection) закрывают и ничего - ResultSet виден.
Но если закрыть внешнее (не default) соединение, то связанный с ним ResultSet тоже закрывается до его обработки.
Выход: копировать ResultSet во временную таблицу через default connection и возвращать результат запросом из временной таблицы.
20 мар 07, 18:01    [3921123]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить