Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / PreparedStatement - Вопрос знатокам / 18 сообщений из 18, страница 1 из 1
08.02.2007, 12:04:49
    #34315254
ghleep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Народ подскажите пожалуйста почему возникает ошибка:
пишу код:
Код: 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
08.02.2007, 12:33:57
    #34315407
Изя Шниперсон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Уважаемый господин, какая у Вас СУБД?
IBM DB2 ?
...
Рейтинг: 0 / 0
08.02.2007, 12:35:10
    #34315415
Изя Шниперсон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
GETCOUNT_USER(?,table,?) - хранимая процедура ?
...
Рейтинг: 0 / 0
08.02.2007, 12:39:31
    #34315434
Изя Шниперсон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Хранимую процедуру СУБД нельзя вызывать через механизм PreparedStatement.

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

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

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

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

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

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


Виноват, ступил, не нужны никакие апострофы.
Sorry
...
Рейтинг: 0 / 0
08.02.2007, 15:59:08
    #34316436
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Зашедший TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
З.Ы. Не всегда так. Яркий пример - Firebird, который замечательно поддерживает использование процедур в селектах.
А то что в Firebird'e все ХП зовуцца процедурами - ниче? другое дело, что в нем процедура (create procedure) может возвращать значение (не аут параметром, а именно как функция в общем смысле). Поэтому Firebird не яркий пример, а нехороший. Терминологию путает.
...
Рейтинг: 0 / 0
08.02.2007, 16:10:30
    #34316486
ghleep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
А ка применить ваши советы
Изя Шниперсон
Хранимую процедуру СУБД нельзя вызывать через механизм 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
08.02.2007, 16:38:26
    #34316621
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Timm Зашедший TimmДело не в драйвере, а в том что процедуру нельзя использовать в селекте. Функцию - можно.
З.Ы. Не всегда так. Яркий пример - Firebird, который замечательно поддерживает использование процедур в селектах.
А то что в Firebird'e все ХП зовуцца процедурами - ниче? другое дело, что в нем процедура (create procedure) может возвращать значение (не аут параметром, а именно как функция в общем смысле). Поэтому Firebird не яркий пример, а нехороший. Терминологию путает.
В общем-то по сути ты прав (если считать, что функция - то, что возвращает), но формально высказывание было неточно. К тому же кроме Файра есть еще Информикс, в котором до девятки (если память не изменяет) поддерживалось такое же поведение.
...
Рейтинг: 0 / 0
08.02.2007, 16:39:13
    #34316630
Изя Шниперсон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
Странная задача какая-то.
Мне показалось что у вас в базе много разных таблиц с одинаковыми полями и разными названиями.

Я бы посоветовал для каждой таблицы отдельную хранимую процедуру делать.
...
Рейтинг: 0 / 0
08.02.2007, 17:48:37
    #34316932
Зашедший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PreparedStatement - Вопрос знатокам
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
Форумы / Java [игнор отключен] [закрыт для гостей] / PreparedStatement - Вопрос знатокам / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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