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

Пользую Sybase ASE + jconnect
...
Рейтинг: 0 / 0
JDBC и output параметр
    #32798735
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC и output параметр
    #32798773
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
Спасибо большое!

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

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

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


“{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
JDBC и output параметр
    #32800146
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо
Код: 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
JDBC и output параметр
    #32800194
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC и output параметр
    #32800201
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
б-р-ррр

собственно как я написал - я пробовал 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
JDBC и output параметр
    #32800212
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хехе, прикольно. По моему getString надо делать для ResultSet'a
...
Рейтинг: 0 / 0
JDBC и output параметр
    #32800226
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
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
JDBC и output параметр
    #32800235
Гости
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГостиХехе, прикольно. По моему getString надо делать для ResultSet'a
Извиняюсь, туплю. А вообще пишут что такое бывает, когда

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

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


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


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

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

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

соответственно первый параметр нужно как String или нет?
...
Рейтинг: 0 / 0
JDBC и output параметр
    #32800471
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC и output параметр
    #32800488
J--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
J--
Гость
Слона-то я и не заметил :-)

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

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

оно хотело, а

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

возможно, это от версии JDBC зависит.
...
Рейтинг: 0 / 0
JDBC и output параметр
    #32800492
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ проще и удобней обращаться к параметрам по именам
Код: plaintext
.setString("my_param","my_value")
...
Рейтинг: 0 / 0
JDBC и output параметр
    #32800499
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC и output параметр
    #32802655
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет, возвращаясь к обсуждаемой теме:

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


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