Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и output параметр / 20 сообщений из 20, страница 1 из 1
24.11.2004, 19:19
    #32798716
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Уважаемые гуру,
подскажите убогому - как из JDBC
получить возвращаемые параметры из хранимки?

Пользую Sybase ASE + jconnect
...
Рейтинг: 0 / 0
24.11.2004, 19:41
    #32798735
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
JDBC™ 3.0 Specification


13.3.2.2 OUT Parameters
The method registerOutParameter must be called to set the type for each OUT
parameter before a CallableStatement object is executed. When the stored
procedure returns from execution, it will use these types to set the values for any
OUT parameters.
The values of OUT parameters can be retrieved using the appropriate getter
methods defined in the CallableStatement interface. CODE EXAMPLE 13-22 shows
the execution of a stored procedure with two OUT parameters, a string and float,
and the retrieval of the OUT parameter values.
CallableStatement cstmt = conn.prepareCall(
“{CALL GET_NAME_AND_NUMBER(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.STRING);
cstmt.registerOutParameter(2, java.sql.Types.FLOAT);
cstmt.execute();
// Retrieve OUT parameters
String name = cstmt.getString(1);
float number = cstmt.getFloat(2);
CODE EXAMPLE 13-22 Registering and retrieving OUT parameters
...
Рейтинг: 0 / 0
24.11.2004, 20:49
    #32798773
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Спасибо большое!

Все гуд, только

вместо
cstmt.registerOutParameter(1, java.sql.Types.STRING);
оно захотело
cstmt.registerOutParameter(1, java.sql.Types.VARCHAR);
...
Рейтинг: 0 / 0
25.11.2004, 11:04
    #32799191
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
1, java.sql.Types.VARCHAR

угу - это опечатка в JDBC™ 3.0 Specification...
...
Рейтинг: 0 / 0
25.11.2004, 16:07
    #32800055
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
О, может еще подскажете:


“{CALL GET_NAME_AND_NUMBER(?, ?)}"

это хорошо.

А если параметр еще обычный есть (input) ???

“{CALL GET_NAME_AND_NUMBER('my_parameter',?, ?)}"


че-то не получается

Приведу часть кода:
(хранимка принимает три параметра, два из которых последние - output)

Вот таким вызовом

exec sp_myproc @chrString,@myStatus output,@myDate output

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Statement s=conn.createStatement();
 CallableStatement cstmt=conn.prepareCall("{CALL ADSL..sp_myproc('222',?,?)}");
 cstmt.registerOutParameter( 2 , java.sql.Types.VARCHAR);
 cstmt.registerOutParameter( 3 , java.sql.Types.SMALLINT);
 
 cstmt.execute();

 String mydate = cstmt.getString( 1 );
  int  mystatus = cstmt.getInt( 2 );
 System.out.println(mydate + ":" + mystatus);

тут он ругается на (уже при cstmt.registerOutParameter())
java.sql.SQLException: JZ0SB: Parameter index out of range: 3.

а если делать 1,2 [что imho неправильно]

То проходит cstmt.registerOutParameter()
но при getString()
но оно ругается как

java.sql.SQLException: JZ0SG: A CallableStatement did n
parameters as the application had registered for it.
...
Рейтинг: 0 / 0
25.11.2004, 16:43
    #32800146
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
вместо
Код: plaintext
1.
cstmt.registerOutParameter( 2 , java.sql.Types.VARCHAR);
cstmt.registerOutParameter( 3 , java.sql.Types.SMALLINT);
нужно
Код: plaintext
1.
cstmt.registerOutParameter( 1 , java.sql.Types.VARCHAR);
cstmt.registerOutParameter( 2 , java.sql.Types.SMALLINT);
где здесь параметр с индексом 3
Код: plaintext
CallableStatement cstmt=conn.prepareCall("{CALL ADSL..sp_myproc('222',?,?)}");
...
Рейтинг: 0 / 0
25.11.2004, 17:12
    #32800194
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
java.sql.SQLException: JZ0SB: Parameter index out of range: 3.

так ведь у вас два параметра - '222' - это не параметр а константа! Делайте так
Код: plaintext
CallableStatement cstmt=conn.prepareCall("{CALL ADSL..sp_myproc(?,?,?)}");

Ну и не забудьте его установить в '222' перед вызовом Execute()
cstmt.setString(1, "222");


PS> скачайте спецификацию на jdbc отсюда - http://java.sun.com/products/jdbc/download.html#corespec30
...
Рейтинг: 0 / 0
25.11.2004, 17:14
    #32800201
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
б-р-ррр

собственно как я написал - я пробовал 1,2
и при этом cstmt.registerOutParameter() проходит намана,
а когда

Код: plaintext
1.
2.
3.
 String mydate = cstmt.getString( 1 );  //на этом Exception!
  int  mystatus = cstmt.getInt( 2 );
 System.out.println(name + ":" + number);


вот что:
java.sql.SQLException: JZ0SG: A CallableStatement did not return as many output
parameters as the application had registered for it.
...
Рейтинг: 0 / 0
25.11.2004, 17:17
    #32800212
Гости
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Хехе, прикольно. По моему getString надо делать для ResultSet'a
...
Рейтинг: 0 / 0
25.11.2004, 17:20
    #32800226
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
funikovyuri

это пробовал тоже

У меня 1-й параметр input и varchar(20)

cstmt.setString(1,"222");

при execute()
ругается

com.sybase.jdbc2.jdbc.SybSQLException: Implicit conversion from datatype 'SMALLI
NT' to 'VARCHAR' is not allowed. Use the CONVERT function to run this query.
...
Рейтинг: 0 / 0
25.11.2004, 17:24
    #32800235
Гости
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
ГостиХехе, прикольно. По моему getString надо делать для ResultSet'a
Извиняюсь, туплю. А вообще пишут что такое бывает, когда

java.sql.SQLException - if a database access error occurs
...
Рейтинг: 0 / 0
25.11.2004, 17:26
    #32800242
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Я даже подумал,
что может быть

Код: plaintext
1.
cstmt.setString( 1 ,"'222'");


надо - вот до чего у меня крыша поехала :-)


2Гости до недавнего времени я тоже думал, что
"getString надо делать для ResultSet'a",
точнее что "getString МОЖНО делать ТОЛЬКО для ResultSet'a"
...
Рейтинг: 0 / 0
25.11.2004, 18:04
    #32800345
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
ну в exception же ясно сказано - что параметр типа smallint - так зачем же вы его с помощью setString() указываете???
...
Рейтинг: 0 / 0
25.11.2004, 18:47
    #32800417
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
funikovyuri в том-то и дело, что параметр varchar!

Вот заголовок процедуры

CREATE PROCEDURE dbo.sp_myproc
(
@myPhone varchar(7),
@myStatus smallint output,
@myDate datetime output
)

соответственно первый параметр нужно как String или нет?
...
Рейтинг: 0 / 0
25.11.2004, 19:34
    #32800471
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Statement s=conn.createStatement();
CallableStatement cstmt=conn.prepareCall("{CALL ADSL..sp_myproc(?,?,?)}");
cstmt.setString(1,"222");
cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
cstmt.registerOutParameter(3, java.sql.Types.DATETIME);

cstmt.execute();
...
Рейтинг: 0 / 0
25.11.2004, 19:54
    #32800488
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
Слона-то я и не заметил :-)

funikovyuri спасибо! Все супер!
...
Рейтинг: 0 / 0
25.11.2004, 19:56
    #32800489
J--
J--
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
и вдогонку - опять же почему-то не

cstmt.registerOutParameter(3, java.sql.Types.DATETIME);

оно хотело, а

cstmt.registerOutParameter(3, java.sql.Types.DATE);

возможно, это от версии JDBC зависит.
...
Рейтинг: 0 / 0
25.11.2004, 19:57
    #32800492
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
+ проще и удобней обращаться к параметрам по именам
Код: plaintext
.setString("my_param","my_value")
...
Рейтинг: 0 / 0
25.11.2004, 20:06
    #32800499
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/mapping.html

см. 9.3.13 DATE, TIME, and TIMESTAMP

и

//9.9.7 JDBC Types Mapped to Database-specific SQL Types

так что если у вас MS SQL - то надо использовать .sql.TIMESTAMP, если что-то другое - то см. таблицу
...
Рейтинг: 0 / 0
27.11.2004, 21:34
    #32802655
Alexander2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC и output параметр
привет, возвращаясь к обсуждаемой теме:

в описании класса формы Employees пишу следущее:

Object[][] data = DB.ExecStoredProc(activeStatus);

а в классе DB пишу:

public static Object[][] ExecStoredProc(String activeStatus) {
...
CallableStatement cs = null;

//System.out.println("a="+ activeStatus);
try {
cs = con.prepareCall("{CALL SelEmployees(?)}");
cs.setString("@status",activeStatus);
....

не работает - ругается так:

java.lang.AbstractMethodError: com.microsoft.jdbc.base.BaseCallableStatement.setString(Ljava/lang/String;Ljava/lang/String;)V
at DB.ExecStoredProc(DB.java:195)

в самой хранимой процедуре у меня 8 параметров ВХОДНЫХ:
CREATE proc dbo.SelEmployees
@strOrder char(100) = ' Office',
@office int = -1,
@dept int = -1,
@position int = -1,
@workgroup char(50) ='',
@discipline char(50) ='',
@status int = -1,
@my_select varchar(1000) = ''

подскажите, плиз, как мне сделать вызывающий метод, чтоб я мог посылать избирательно (или все сразу 8) IN параметров в процедуру и получать результат.

Кстати, я проверил на примере простой процедуры с единственным входным параметром

если передать так, то срабатывает
cs.setFloat(1,1);
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC и output параметр / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]