powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / PreparedStatement - Вопрос знатокам
18 сообщений из 18, страница 1 из 1
PreparedStatement - Вопрос знатокам
    #34315254
ghleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ подскажите пожалуйста почему возникает ошибка:
пишу код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Connection con = getConnection();
PreparedStatement ps =  null ;
ResultSet rslt =  null ; 
StringBuffer query= new  StringBuffer();
		query.append("SELECT ID, NAME, DESCRIPTION");
		query.append(" FROM ");
		query.append(" USERS");
		query.append(" WHERE ID >10 ");
		query.append(" AND NAME=?");
		query.append(" AND GETCOUNT_USER("+userid+",table,'"+nickname+"')>0");
ps = preparedst(con, query);
ps.setString( 1 ,param_name);
rslt = ps.executeQuery();
этот код работает и заполняет ResultSet rslt значениями
Теперь я хочу строку
Код: plaintext
query.append(" AND GETCOUNT_USER("+userid+",table,'"+nickname+"')>0");
заменить на
Код: plaintext
query.append(" AND GETCOUNT_USER(?,table,?)>0");
т. е заполнять
Код: plaintext
"+userid+"
и
Код: plaintext
'"+nickname+"'
в PreparedStatement ps
соттветственно код преобразуется в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Connection con = getConnection();
PreparedStatement ps =  null ;
ResultSet rslt =  null ; 
StringBuffer query= new  StringBuffer();
		query.append("SELECT ID, NAME, DESCRIPTION");
		query.append(" FROM ");
		query.append(" USERS");
		query.append(" WHERE ID >10 ");
		query.append(" AND NAME=?");
		query.append(" AND GETCOUNT_USER(?,table,?)>0");
ps = preparedst(con, query);
ps.setString( 1 ,param_name);
ps.setInt( 2 ,param_userid);
ps.setString( 3 ,param_nickname);
rslt = ps.executeQuery();
запускаю код и получаю ошибку
Exeption e= [IBM][CLI Driver] SQL0418N Оператор содержит неверное использование маркера параметра. SQLSTATE=42610
Не могу понять почему?
да GETCOUNT_USER - это пользовательская функция
или параметры в функцию нельзя заполнять через знак (?)
подскажите пожалуйста где можно о таких тонкостях прочитать?
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315407
Фотография Изя Шниперсон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый господин, какая у Вас СУБД?
IBM DB2 ?
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315415
Фотография Изя Шниперсон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GETCOUNT_USER(?,table,?) - хранимая процедура ?
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315434
Фотография Изя Шниперсон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранимую процедуру СУБД нельзя вызывать через механизм PreparedStatement.

Нужно использовать механизм CalledStatement для вызова хранимых процедур.
Причем передача параметров и возвращение результатов могут быть разными в зависимости от СУБД
(на Oracle и IBM DB2) отличаются.

Решение: Создайте еще одну хранимую процедуру и поместите Ваш запрос, который вызывает GETCOUNT_USER(?,table,?), а затем вызывайте новую хранимую процедуру через CalledStatement.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315518
ghleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GETCOUNT_USER(?,table,?) - это пользовательская функция
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315529
ghleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изя ШниперсонХранимую процедуру СУБД нельзя вызывать через механизм PreparedStatement.

Нужно использовать механизм CalledStatement для вызова хранимых процедур.
Причем передача параметров и возвращение результатов могут быть разными в зависимости от СУБД
(на Oracle и IBM DB2) отличаются.

Решение: Создайте еще одну хранимую процедуру и поместите Ваш запрос, который вызывает GETCOUNT_USER(?,table,?), а затем вызывайте новую хранимую процедуру через CalledStatement.
Спасибо! попробую так сделать
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315653
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghleepGETCOUNT_USER(?,table,?) - это пользовательская функция
Пользовательские функции вызывать из PreparedStatement можно, но здесь, видимо, зависит от конкретного JDBC-драйвера. Для MSSQL2K/MSSQL2K5 я такие вызовы использую, через jtds-1.2. Для Oracle 9 тоже работало. Так что Вам можно попробовать еще посмотреть более новые версии "родных" драйверов для DB2 или третьесторонние продукты.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315697
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315879
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
Тут - именно функция.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315902
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, а в значении param_nickname апострофы не забыли?
т.е.
Код: plaintext
param_nickname = "'coolnickname'";
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34315926
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
З.Ы. Не всегда так. Яркий пример - Firebird, который замечательно поддерживает использование процедур в селектах.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316378
ghleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michael Ponomarevизвините, а в значении param_nickname апострофы не забыли?
т.е.
Код: plaintext
param_nickname = "'coolnickname'";

Конечно я вас извиняю но если вы повнимательней посмотрите то

может все таки правильно написано
ghleep
Код: plaintext
query.append(" AND GETCOUNT_USER("+userid+",table,'"+nickname+"')>0");
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316379
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Ponomarevизвините, а в значении param_nickname апострофы не забыли?
т.е.
Код: plaintext
param_nickname = "'coolnickname'";


Виноват, ступил, не нужны никакие апострофы.
Sorry
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316436
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
З.Ы. Не всегда так. Яркий пример - Firebird, который замечательно поддерживает использование процедур в селектах.
А то что в Firebird'e все ХП зовуцца процедурами - ниче? другое дело, что в нем процедура (create procedure) может возвращать значение (не аут параметром, а именно как функция в общем смысле). Поэтому Firebird не яркий пример, а нехороший. Терминологию путает.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316486
ghleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ка применить ваши советы
Изя Шниперсон
Хранимую процедуру СУБД нельзя вызывать через механизм PreparedStatement.
Нужно использовать механизм CalledStatement для вызова хранимых процедур.
Решение: Создайте еще одну хранимую процедуру и поместите Ваш запрос, который вызывает GETCOUNT_USER(?,table,?), а затем вызывайте новую хранимую процедуру через CalledStatement.

в случае если например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
StringBuffer query= new  StringBuffer();
		query.append("SELECT ID, NAME, DESCRIPTION");
		query.append(" FROM ");
		query.append("+table+");
		query.append(" WHERE ID >10 ");
		query.append(" AND NAME=?");
		query.append(" AND GETCOUNT_USER("+userid+",table,'"+nickname+"')>0");
т. е динамически задавать таблицу, ведь в хранимую процедуру нельзя передать параметром таблицу из которой необходимо сделать выборку,
т. е если динамически формировать sql запрос, как быть тогда?
как вместо ("+table+") использовать (?)
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316621
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Зашедший TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
З.Ы. Не всегда так. Яркий пример - Firebird, который замечательно поддерживает использование процедур в селектах.
А то что в Firebird'e все ХП зовуцца процедурами - ниче? другое дело, что в нем процедура (create procedure) может возвращать значение (не аут параметром, а именно как функция в общем смысле). Поэтому Firebird не яркий пример, а нехороший. Терминологию путает.
В общем-то по сути ты прав (если считать, что функция - то, что возвращает), но формально высказывание было неточно. К тому же кроме Файра есть еще Информикс, в котором до девятки (если память не изменяет) поддерживалось такое же поведение.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316630
Фотография Изя Шниперсон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странная задача какая-то.
Мне показалось что у вас в базе много разных таблиц с одинаковыми полями и разными названиями.

Я бы посоветовал для каждой таблицы отдельную хранимую процедуру делать.
...
Рейтинг: 0 / 0
PreparedStatement - Вопрос знатокам
    #34316932
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghleepА ка применить ваши советы
Изя Шниперсон
Хранимую процедуру СУБД нельзя вызывать через механизм PreparedStatement.
Нужно использовать механизм CalledStatement для вызова хранимых процедур.
Решение: Создайте еще одну хранимую процедуру и поместите Ваш запрос, который вызывает GETCOUNT_USER(?,table,?), а затем вызывайте новую хранимую процедуру через CalledStatement.

в случае если например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
StringBuffer query= new  StringBuffer();
		query.append("SELECT ID, NAME, DESCRIPTION");
		query.append(" FROM ");
		query.append("+table+");
		query.append(" WHERE ID >10 ");
		query.append(" AND NAME=?");
		query.append(" AND GETCOUNT_USER("+userid+",table,'"+nickname+"')>0");
т. е динамически задавать таблицу, ведь в хранимую процедуру нельзя передать параметром таблицу из которой необходимо сделать выборку,
т. е если динамически формировать sql запрос, как быть тогда?
как вместо ("+table+") использовать (?)
У Вас пользовательская функция, а не хранимая процедура, так что сначала стоит попробовать найти поддерживающий этот функционал JDBC-драйвер.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / PreparedStatement - Вопрос знатокам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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