Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters) / 25 сообщений из 89, страница 1 из 4
12.01.2010, 16:35
    #36405725
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Используется
ojdbc14.jar
Oracle 10g
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

Есть запрос типа
Код: plaintext
1.
2.
3.
4.
5.
    select * from table1 t1 
    where field1 = :p1
    union
    select * from table1 t2
    where field1 = :p1

В Д7 я делал так
Код: plaintext
1.
   oraquery.ParamByName("p1").Value :=   10 ;
однако в Java такое не прокатывает:
Код: plaintext
1.
    ((OraclePreparedStatement)stmt).setString( 1 , workDate);
   
получаю
Код: plaintext
java.sql.SQLException: ORA- 00911 : invalid character
если я правильно понял не назначились все параметры,
так как использован позиционный метод установки параметров.

Именованный не поддерживается драйвером.
Кто может дать дельный совет?
Как определить количество параметров и назначить все?
Или какой драйвер(линк) и как использовать(пример кода), в котором
имплементирована именованная установка параметров?


_______
Жизнь - это два CD c Half-Life (λ)
...
Рейтинг: 0 / 0
12.01.2010, 16:42
    #36405746
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard,
Код: plaintext
1.
((OraclePreparedStatement)stmt).setStringAtName("p1", workDate);
...
Рейтинг: 0 / 0
12.01.2010, 16:54
    #36405786
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
0FDbl_beard,
Код: plaintext
1.
((OraclePreparedStatement)stmt).setStringAtName("p1", workDate);


в какой версии драйвера?
в моей(указана в первом письме) такого метода нет.
по крайней мере Eclipse в подсказке не дает такого метода.
...
Рейтинг: 0 / 0
12.01.2010, 17:13
    #36405862
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard,

Oracle JDBC Driver version - "10.2.0.4.0"

А точно у тебя драйвер от 10g, может 9, а там этого нет(посмотри META-INF\MANIFEST.MF).
...
Рейтинг: 0 / 0
12.01.2010, 17:17
    #36405878
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beardИспользуется
ojdbc14.jar
Oracle 10g
java version "1.6.0_13"
...
в какой версии драйвера?
в моей(указана в первом письме) такого метода нет.

Скачай последние драйвера : http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_112010.html и переключись на ojdbc6.jar.
...
Рейтинг: 0 / 0
12.01.2010, 17:44
    #36405975
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Denis Popov,

скачал. поменял. но сейчас на строке коннекта
Код: plaintext
1.
2.
   toCon = DriverManager.getConnection(props.getProperty("url"), 
	props.getProperty("username"), props.getProperty("password"));
Код: plaintext
1.
<entry key="url">jdbc:oracle:thin:@ 10 . 10 . 0 . 23 : 1521 :risk</entry>
Код: plaintext
1.
2.
3.
4.
5.
Exception in thread "Thread-1" java.lang.IllegalAccessError: tried to access  class  oracle.jdbc.driver.OraclePreparedStatement from  class  GetData
	at GetData.Initialize(GetData.java: 83 )
	at GetData.TryInitialize(GetData.java: 245 )
	at GetData.run(GetData.java: 264 )
	at java.lang.Thread.run(Unknown Source)
...
Рейтинг: 0 / 0
12.01.2010, 17:46
    #36405979
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard,

случайно рано запостил.
Вообщем ошибка при соединении.
Что фиксить?..
...
Рейтинг: 0 / 0
12.01.2010, 17:57
    #36406004
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard,

@//host_name:port_number/service_name

jdbc:oracle:thin:@//10.10.0.23:1521/risk
...
Рейтинг: 0 / 0
12.01.2010, 17:58
    #36406006
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
И вместо oracle.jdbc.driver.OraclePreparedStatement лучше использовать oracle.jdbc.OraclePreparedStatement
...
Рейтинг: 0 / 0
12.01.2010, 18:00
    #36406010
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beardВообщем ошибка при соединении.
Что фиксить?..
Поменяй oracle.jdbc .driver .OraclePreparedStatement на oracle.jdbc.OraclePreparedStatement. И для остальных тоже, если в пакете oracle.jdbc есть класс одноименный с классом из пакета oracle.jdbc.driver, то бери первый.
...
Рейтинг: 0 / 0
12.01.2010, 18:18
    #36406050
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
0FD, Denis Popov

первыми строками в файле класса
Код: plaintext
1.
2.
 import  oracle.jdbc.OraclePreparedStatement;
 import  oracle.jdbc.OracleCallableStatement;

строку коннекта тоже поменял, но ошибка таже самая.
еще Eclipse перед компиляцией говорит что у меня в проекте "Error exist",
но при этом не показывает где. подозреваю что это в
"Java Build Path"/Libraries/Jre System Library
осталась ссылка на ojdbc14.jar, она показана как "(missing)" -
как убрать ее из списка библиотек?
...
Рейтинг: 0 / 0
12.01.2010, 18:41
    #36406086
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard
еще Eclipse перед компиляцией говорит что у меня в проекте "Error exist",
но при этом не показывает где. подозреваю что это в
"Java Build Path"/Libraries/Jre System Library
осталась ссылка на ojdbc14.jar, она показана как "(missing)" -
как убрать ее из списка библиотек?
У тебя ojdbc14.jar подключен прямо в JRE System Library? На мой взгляд, лучше убрать оттуда все сторонние архивы, оформить их в виде отдельных библиотек и эти библиотеки подключать к проекту по необходимости. JRE правится по меню Window->Preferences, ветка Java\Installed JREs
...
Рейтинг: 0 / 0
12.01.2010, 19:23
    #36406152
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Denis Popov
У тебя ojdbc14.jar подключен прямо в JRE System Library? На мой взгляд, лучше убрать оттуда все сторонние архивы, оформить их в виде отдельных библиотек и эти библиотеки подключать к проекту по необходимости. JRE правится по меню Window->Preferences, ветка Java\Installed JREs

здесь "Java\Installed JREs" пусто.

Denis Popov
У тебя ojdbc14.jar подключен прямо в JRE System Library?
как узнать подключен или нет?

У Хорстмана и Корнелла прочитал что по их мнению некошерно подключать
наборы библиотек к проектам глобально, используя "jre\lib\ext\",
но не дали никаких рекомендаций, как это сделать по хорошему. :(
...
Рейтинг: 0 / 0
12.01.2010, 19:42
    #36406180
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beardздесь "Java\Installed JREs" пусто.
Я бы создал здесь JRE. чтобы использовать в проектах

bl_beard
Denis Popov
У тебя ojdbc14.jar подключен прямо в JRE System Library?
как узнать подключен или нет?
Если в списке библиотек проекта развернуть ветку начиная с "JRE System Library", то там должен быть список архивов в него входящих. Только здесь этот список только на чтение, а редактируется в "Java\Installed JREs".

bl_beard
У Хорстмана и Корнелла прочитал что по их мнению некошерно подключать
наборы библиотек к проектам глобально, используя "jre\lib\ext\",
но не дали никаких рекомендаций, как это сделать по хорошему. :(
Чтобы не путаться, давай в этой фразе под "набором библиотек" я буду понимать набор jar-архивов. Практические все среды разработки позволяют организовывать "библиотеки", т.е. набор jar-архивов. Лежать они могут где угодно на диске, но, действительно, лучше их не класть в jre\lib\ext, а то в конце концов сам запутаешься в этой свалке.
...
Рейтинг: 0 / 0
13.01.2010, 10:34
    #36406865
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
...
Рейтинг: 0 / 0
13.01.2010, 10:59
    #36406924
bl_beard
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Denis Popov,

Спасибо за советы, помогло.
И даже с первым вопросом разобрался. :)
Назначение по имени заработало, но ошибка "инвалид чарактер"
осталась. оказалось в конце запроса стояла ";", запрос во всех
средах (Oracle SQL Dev, Toad) выполнялся, а в моей java-проге нет.
теперь все хорошо. :)

Итог:
- перешел на новый драйвер
- заработало назначение параметров по имени (***)
- организовал библиотеку

пысы
в пункте (***) тут остался нюанс: оно оказывается регистрозависимое :(
Код: plaintext
1.
stmt.setStringAtName("p_date", workDate);
Код: plaintext
1.
2.
3.
4.
java.sql.SQLException: Попытка присвоения имени параметра, которое не встречается в данном SQL: p_date
	at oracle.jdbc.driver.OraclePreparedStatement.setStringAtName(OraclePreparedStatement.java: 12137 )
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.setStringAtName(OraclePreparedStatementWrapper.java: 863 )
	at GetData.run(GetData.java: 306 )
	at java.lang.Thread.run(Unknown Source)
в запросе в "P_DATE".
кто то знает что с этим можно сделать?
...
Рейтинг: 0 / 0
13.01.2010, 11:45
    #36407041
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
bl_beard wrote:

> в пункте (***) тут остался нюанс: оно оказывается регистрозависимое :(
....
> кто то знает что с этим можно сделать?

Забавно, в документации это явно не указано... Боюсь, придется с этим жить, по крайней мере при текущей версии
ораклового JDBC-драйвера.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
01.03.2012, 20:47
    #37687138
ilych2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Еще один "сюрприз"
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
		Connection con = .....;

		String proc ="declare \n"
				+ " q1 VARCHAR2(20) := :a1; \n"
				+ " q2 VARCHAR2(20) := :a2; \n"
				+ "begin \n"
				+ "  :b1 := q1;\n"
				+ "  :b2 := q2;\n"
				+ "end;\n";
		System.out.println(proc);

		OracleCallableStatement stmt = (OracleCallableStatement) con.prepareCall(proc);

		stmt.setString("a1", "a1");
		stmt.setString("a2", "a2");

		stmt.registerOutParameter("b1", OracleTypes.VARCHAR);
		stmt.registerOutParameter("b2", OracleTypes.VARCHAR);

		stmt.execute();

		System.out.println("b1=" + stmt.getString("b1") + ", b2=" + stmt.getString("b2"));
		System.out.println("Меняем порядок сетов");

		stmt = (OracleCallableStatement) con.prepareCall(proc);

		stmt.setString("a2", "a2");
		stmt.setString("a1", "a1");

		stmt.registerOutParameter("b1", OracleTypes.VARCHAR);
		stmt.registerOutParameter("b2", OracleTypes.VARCHAR);

		stmt.execute();

		System.out.println("b1=" + stmt.getString("b1") + ", b2=" + stmt.getString("b2"));

		con.close();


Результат выпонения:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare 
 q1 VARCHAR2(20) := :a1; 
 q2 VARCHAR2(20) := :a2; 
begin 
  :b1 := q1;
  :b2 := q2;
end;

b1=a1, b2=a2
Меняем порядок сета
b1=a2, b2=a1


Вот так!
Драва: ojbc6.jar
Implementation-Version: 11.2.0.2.0
Java 1.6
...
Рейтинг: 0 / 0
02.03.2012, 08:56
    #37687551
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
ilych2000,

Ничего не понял. О чём всё это?
...
Рейтинг: 0 / 0
02.03.2012, 09:08
    #37687557
ilych2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
О том, что в OracleCallableStatement при бинде именованных параметров не должен быть важен порядок сетов.
То есть
Код: java
1.
2.
stmt.setString("a1", "a1");
stmt.setString("a2", "a2");


и
Код: java
1.
2.
stmt.setString("a2", "a2");
stmt.setString("a1", "a1");


Не должно иметь значение.
А мой пример показывает обратное.

Причем в OraclePreparedStatement, то есть в селектах этот пример работает как должен.
...
Рейтинг: 0 / 0
02.03.2012, 09:33
    #37687589
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
ilych2000,
а кому оно надо, писать на PSQL в Java на клиенте?
...
Рейтинг: 0 / 0
02.03.2012, 09:39
    #37687602
ilych2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Странный вопрос.
В моем проекте все чтение из БД идет селектами,
а изменение строго вызовом хранимок.
...
Рейтинг: 0 / 0
02.03.2012, 10:02
    #37687644
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
ilych2000,
ну, дак я вас тоже не понял, как и Garrick.
Например, зачем PSQL ниже:

String proc ="declare \n"
+ " q1 VARCHAR2(20) := :a1; \n"
+ " q2 VARCHAR2(20) := :a2; \n"
+ "begin \n"
+ " :b1 := q1;\n"
+ " :b2 := q2;\n"
+ "end;\n";
...
Рейтинг: 0 / 0
02.03.2012, 10:17
    #37687687
ilych2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
Petro123,
Это просто пример по баг с параметрами.

Все просто.
Есть толстый клиент на Дельфях.
В нем это все работает без проблем.

Причем тексты PSQL хранятся на серваке в блобах
и могут написаны как угодно, но выполняются, в толстом клиенте и PLSQLDevelopere.

И они должны вызываться из Java без изменений.
...
Рейтинг: 0 / 0
02.03.2012, 10:23
    #37687703
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JDBC+Oracle(Parameters)
ilych2000Причем тексты PSQL хранятся на серваке в блобах
вот с этого и начинай.
IMHO
- это изврат на любом ЯП (для этого есть сам сервер).
- это всё равно, что хранить Дату в строке.
Поэтому ваш баг малоинтересен в практике.
Удачи!
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters) / 25 сообщений из 89, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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