powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters)
89 сообщений из 89, показаны все 4 страниц
JDBC+Oracle(Parameters)
    #36405725
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используется
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
JDBC+Oracle(Parameters)
    #36405746
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bl_beard,
Код: plaintext
1.
((OraclePreparedStatement)stmt).setStringAtName("p1", workDate);
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36405786
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDbl_beard,
Код: plaintext
1.
((OraclePreparedStatement)stmt).setStringAtName("p1", workDate);


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

Oracle JDBC Driver version - "10.2.0.4.0"

А точно у тебя драйвер от 10g, может 9, а там этого нет(посмотри META-INF\MANIFEST.MF).
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36405878
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36405975
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36405979
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bl_beard,

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

@//host_name:port_number/service_name

jdbc:oracle:thin:@//10.10.0.23:1521/risk
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36406006
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вместо oracle.jdbc.driver.OraclePreparedStatement лучше использовать oracle.jdbc.OraclePreparedStatement
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36406010
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bl_beardВообщем ошибка при соединении.
Что фиксить?..
Поменяй oracle.jdbc .driver .OraclePreparedStatement на oracle.jdbc.OraclePreparedStatement. И для остальных тоже, если в пакете oracle.jdbc есть класс одноименный с классом из пакета oracle.jdbc.driver, то бери первый.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36406050
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36406086
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36406152
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36406180
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36406865
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #36406924
bl_beard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #36407041
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bl_beard wrote:

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

Забавно, в документации это явно не указано... Боюсь, придется с этим жить, по крайней мере при текущей версии
ораклового JDBC-драйвера.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
JDBC+Oracle(Parameters)
    #37687138
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один "сюрприз"
Код: 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
JDBC+Oracle(Parameters)
    #37687551
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilych2000,

Ничего не понял. О чём всё это?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687557
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О том, что в 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
JDBC+Oracle(Parameters)
    #37687589
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilych2000,
а кому оно надо, писать на PSQL в Java на клиенте?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687602
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странный вопрос.
В моем проекте все чтение из БД идет селектами,
а изменение строго вызовом хранимок.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687644
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JDBC+Oracle(Parameters)
    #37687687
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Это просто пример по баг с параметрами.

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

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

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

Код: 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

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

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



и оно все равно работает. А для поименного привязывания в оракловом драйвере есть методы setXXXAtName, да только нет метода registerOutputParameterAtName().
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687771
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilych2000Причем тексты PSQL хранятся на серваке в блобах
и могут написаны как угодно, но выполняются, в толстом клиенте и PLSQLDevelopere.

И они должны вызываться из Java без изменений.
Вау-у-у!
Про функции и процедуры с параметрами в базах данных ничего не слышали?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687779
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Вы правы для хранимок
Для селектов все работает как надо - нужны правильные имена
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687810
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garrick,

Анонимные процедуры хранятся в блобах или формируются непосредственно в коде.
Клиент представляет собой инструмент не предоставляющий пользователю возможность
создавать в БД функции или процедуры.

Это как система управления сайтом (CMS) не создает файлы контента на сайте, а хранит их в БД.

В общем суть проста в части выполнения селектов драва правильно работуют с именованными параметрами,
а в части процедур просто заимплементили java.sql.CallableStatement setString(String parameterName, String x)
на бинд тупо по порядку следования параметров в процедуре. Такое поведение не описано в доках.
Считаю это багом. И дровам в этом месте надо выдавать SQLFeatureNotSupportedException так как так и есть, а не пудрить мозг программистам.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687822
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilych2000Denis Popov,

Вы правы для хранимок
Для селектов все работает как надо - нужны правильные имена
А у меня работает...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    String proc = "select * from scott.EMP where ename = :a";

    System.out.println(proc);

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

    st.setString("x", "SMITH");

    ResultSet rs = st.executeQuery();
    if (rs.next()) {
      System.out.println(rs.getString("empno") + " : " + rs.getString("ename"));
    }


Код: plaintext
1.
select * from scott.EMP where ename = :a
7369 : SMITH


Правда, еесли заменить на OraclePreparedStatement, то у него метода st.setString(String, String) нет.
Код: plaintext
1.
2.
3.
Java version : 1.7.0_02
Database     : Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Driver       : Oracle JDBC driver 11.2.0.3.0
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687837
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilych2000Клиент представляет собой инструмент не предоставляющий пользователю возможность
создавать в БД функции или процедуры.

===== ну дак пишите на Delphi или Java :) Зачем вам PSQL?

Это как система управления сайтом (CMS) не создает файлы контента на сайте, а хранит их в БД.

===== не путай ядро ИС с USER-контентом cms
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #37687867
ilych2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Перефразирую
В общем суть проста в части выполнения PreparedStatement драва правильно работуют с именованными параметрами,
а в части CallableStatement просто заимплементили java.sql.CallableStatement setString(String parameterName, String x)
на бинд тупо по порядку следования параметров в процедуре. Такое поведение не описано в доках.
Считаю это багом. И дровам в этом месте надо выдавать SQLFeatureNotSupportedException так как так и есть, а не пудрить мозг программистам.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
JDBC+Oracle(Parameters)
    #39209291
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Апну, ибо не нашел. Говорит:
Попытка присвоения имени параметра, которое не встречается в данном SQL: param1
При том, что параметр с именем "param1" в процедуре точно есть.
Пробовал менять регистр, пробовал вместо CallableStatement, PreparedStatement: ругаецо на класс, типа не может преобразовать PreparedStatement в CallableStatement.
ojdbc6, ora11.2.

При обращении по индексу работает нормально, но надо по именам параметров.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209309
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
        DatabaseMetaData dbmd = dbconn.getMetaData();
        if (dbmd.supportsNamedParameters() == true){
          System.out.println("NAMED PARAMETERS FOR CALLABLE STATEMENTS IS SUPPORTED");
        }


Говорит, что поддерживаются.
Есть подозрение, что должен соблюдаться порядок следования этих параметров.
То есть если задаем первый параметр, для стейтмента, то даже обращаясь по имени, он и в параметрах хранимки в БД тоже должен быть первым. Видимо об этом и речь в топике. Но это ж косяк как-то. Смысл тогда в таких параметрах.
Как использовать PreparedStatement вместо CallableStatement пока не понял :(
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209318
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что должен соблюдаться порядок следования этих параметров.
Подозрение не подтвердилось. В чем засада не ясно.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209360
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSПодозрение не подтвердилось. В чем засада не ясно.нету Java именованных параметров.
Т.к. мало челов пишут на голом JDBC imho
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209362
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JDS,

побуду буквоедом, но тут ошибка:
NAMED PARAMETERS FOR CALLABLE STATEMENTS IS SUPPORTED
во множественном числе ARE
сорри
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209377
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123нету Java именованных параметров.
Т.к. мало челов пишут на голом JDBC imho
Это было бы просто дико, особенно учитывая, что в спецификации setString/Int/...itc есть возможность обращаться не только по индексу, но и по имени. Без этого jdbc превращается в суровый хардкод инструмент же )

И больше того, у меня похоже, все-таки получилось: надо когда пишешь фукнцию в колблстейтмент параметры писать не вопросиками, а именами с двоеточием типа:
Код: java
1.
...prepareCall("{call proc_name(:param1_name, :param1_name)});


тогда вроде нормуль.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209382
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2побуду буквоедом, но тут ошибка
Мопед не мой )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209386
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSтогда вроде нормуль.
попробуешь отпишись. Я свой переделаю под имена.
НО!
Должен работать .SetObject!
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209493
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понимаю чего тут не понятного. Классический вариант заполнения параметров в запросе JDBC выглядит следующим образом
Код: plsql
1.
2.
3.
4.
5.
PreparedStatement p = con.prepareStatement("select * from people where 
(first_name = ? or last_name = ?) and address = ?");
p.setString(1, name);
p.setString(2, name);
p.setString(3, address);


Т.е. знаки вопросов в строке запроса и последовательно с соблюдением порядка следования "вопросов" заполнение параметров.
Но в JDBC от Oracle (возможно и другие) есть возможность использовать, т.н. именованные параметры. Выглядит это примерно так:
Код: plsql
1.
2.
OraclePreparedStatement p = conn.prepareStatement ("SELECT name FROM emp WHERE id = :EmpId");
p.setIntAtName("EmpId", 314159);


Т.е. вместо вопросов указываем имена параметров, предваряя их двоеточием. Заполняем параметры по имени с использованием методов setXXXAtName(), порядок следования не важен.

Binding by name is not supported when using the setXXX methods. Under certain circumstances, previous versions of Oracle JDBC drivers have allowed binding statement variables by name when using the setXXX methods.... Starting from Oracle Database 10g JDBC drivers, bind by name is supported using the setXXXAtName methods. тут

Аналогичная штука с именованными параметрами есть в Spring JDBCTemplate.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209502
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и так
Код: java
1.
...prepareCall("{call proc_name("+param1_name+"," + param1_name+")}");
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209507
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GarrickНо в JDBC от Oracle (возможно и другие) есть возможность использовать, т.н. именованные параметры. Выглядит это примерно так:
Если на входе Null то будет raise
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209510
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrickp.setIntAtName
кроме того, сам код)) не в состоянии тип определить?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209514
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
в Delphi так
p.ParamByName(цццццц).выбирай_далее_что_угодно
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209524
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123попробуешь отпишись
Попробовал:
1. работает конечно, можно обращаться по именам не важно в каком порядке
2. все-таки надо прежде сначала все проиницилизировать именно потому, что:
Petro123Если на входе Null то будет raise
Надо проверить, но думаю не совсем так.
Точнее наверно будет: если параметр не проинициализирован, то будет райс.
Т.е. сначала можно проинициализировать все параметры например пустым значением, потом уже заполнять, существующие.
3. С типами все-таки беда, setObject в большинстве случаев преобразует в строку и вызов ломается.
Сделал все входные параметры процедуры строковыми, заработало, но тогда придется в самой хранимке уже преобразовывать, для вставки в поля таблиц. Геморрой короче. Но видимо, еще сами данные такие, что фиг преобразуешь толком. Плюс еще CLOB-ы предвидятся )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209528
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS...С типами все-таки беда, setObject в большинстве случаев преобразует в строку и вызов ломается.
Сделал все входные параметры процедуры строковыми, заработало, но тогда придется в самой хранимке уже преобразовывать, для вставки в поля таблиц. Геморрой короче. Но видимо, еще сами данные такие, что фиг преобразуешь толком. Плюс еще CLOB-ы предвидятся )
IMHO Какой-то поток сознания. Без примера кода - ни фига не понятно.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209536
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevIMHO Какой-то поток сознания.
Речь о том, что хотелось бы иметь возможность при работе с ojdbc
распознавать типы параметров хранимки, чтобы явно преобразовывать параметры к нужному типу.
Есть например ParameterMetaData, но максимум получается только достать количество параметров, а их тип - нет.
Поэтому остается:
- или все параметры хранимки делать строковыми и уже в самой хранимке приводить к нужному типу для вставки в таблицы
- пытаться определить тип косвенно по формату строки
- или хардкодить по всем полям
Вообще изначальная задача загрузка xml :) поэтому может быть конечно еще куча вариантов, типа залить в xml целиком как clob в базу и работать с ним уже там ), но пока мучаю sax-парсер.
В общем беда :/
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209546
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSраспознавать типы параметров хранимки, чтобы явно преобразовывать параметры к нужному типу
И в чем проблема?

JDSЕсть например ParameterMetaData
Зачем ParameterMetaData? С учетом, что документация ничего не обещает.

ДокументацияAn object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object. For some queries and driver implementations, the data that would be returned by a ParameterMetaData object may not be available until the PreparedStatement has been executed.

Some driver implementations may not be able to provide information about the types and properties for each parameter marker in a CallableStatement object.

Что в общем и логично. Т.к. CallbableStatement не обязательно хранимка, а может быть и анонимный PL/SQL блок, у которого типов параметров может не быть.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209554
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
Есть доки из какого типа в какой приводит jdbc.
У меня тоже xml импорт. И решил как написал выше.
Код в 2 строки. Null ничего не ломает, т.к xml его может не быть.
Нет именованных, но зато компактность кода для 30 параметров.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209559
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Нет именованных, но зато компактность кода для 30 параметров.
Согласен, но это похоже, только если типы простые совсем типа строка и целое число.
Буду приводить все к строковым параметрам в хп :(
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209562
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, насчет анонимного блока прояснило суть почему не определить тип.
Других вариантов в ojdbc нет? )
Не ясно зачем тогда вообще ParameterMetaData.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209565
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПоэтому остается:
- или все параметры хранимки делать строковыми и уже в самой хранимке приводить к нужному типу для вставки в таблицы
- пытаться определить тип косвенно по формату строки
- или хардкодить по всем полям
строковые от не строковых для
...prepareCall("{call proc_name("+param1_name+"," + param1_name+")}");
будут отличаться только наличием кавычек
можешь выбрать все строковые из твоих входных, добавить одинарные кавычки в начале и в конце, слить в строку и скормить
...prepareCall("{call proc_name("+набор_параметров+")}");
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209575
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSPetro123Нет именованных, но зато компактность кода для 30 параметров.
Согласен, но это похоже, только если типы простые совсем типа строка и целое число.
Буду приводить все к строковым параметрам в хп :(
Ты не прав и тебе лень дать поиск соответствий
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209576
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Он хочет в хранимке все парам строками. Даже даты. А так нельзя.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209586
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Он хочет в хранимке все парам строками. Даже даты. А так нельзя.
Допустим, в xml дата: 2007-03-16T14:15:15.743
Если бы мог доставать тип параметра из хранимки, то мог явно преобразовать к дате или там таймстэмпу или еще как,
а просто setObject что-то для данной строки не лезет в поле даты :/
Кстати еще ж вариант брать типы параметров хранимок из словаря БД )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209587
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSДругих вариантов в ojdbc нет?
Вариантов чего?

Если:
JDSраспознавать типы параметров хранимки, чтобы явно преобразовывать параметры к нужному типу
В Oracle это делается без проблем и без всякого ParameterMetaData. См. представления Oracle. Для public процедур (а что бы вызвать, она должна быть public) все параметры описаны в соответствующих представлениях.

Кроме того, пишут, что через Connection.getMetaData() можно получить метаданные для БД и уже оттуда, через getProcedures и getProcedureColumns получить типы параметров.

JDSНе ясно зачем тогда вообще ParameterMetaData.
Наверное, что бы их можно было получить, если типы параметров известны )))
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209598
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevвсе параметры описаны в соответствующих представлениях
Об этом уже подумал выше. Но это как-то жестоко все-таки )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209608
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSОб этом уже подумал выше. Но это как-то жестоко все-таки
Почему. Нормальный, документированный способ для работы с Oracle.

Другие СУБД, обычно, тоже метаописания имеют. Если хочется удалять гланды через жопу быть true java программистом - можно через Connection.getMetaData()
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209609
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
SetObj не работае с датами?
Стек ошибки дай. Завтра проверю
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209625
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevПочему. Нормальный, документированный способ для работы с Oracle.
После тех же делфей это уже геморройный способ )
Сделали бы при вызове prepareCall, чтобы он в стейтменте собирал инфу и о параметрах все-таки, было бы замечательно )
Petro123SetObj не работае с датами? Стек ошибки дай. Завтра проверю
Суть, в поле даты xml файла пишем например 2007-03-16T14:15:15.743
Ну и подаем это через setObj в параметр типа дата - не явное преобразование не проходит конечно:
Код: plsql
1.
ORA-01861: литерал не соответствует формату строки


В timestamp тоже не лезет однако ):
Код: plsql
1.
ORA-01843: месяц неверен
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209643
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSСуть, в поле даты xml файла пишем например 2007-03-16T14:15:15.743
Ну и подаем это через setObj в параметр типа дата - не явное преобразование не проходит конечно:
Ты так и не понял что ли?
Какие нафиг в Java неявные преобразования?
Драйвер определяет тип по типу класса. Значит в SetObject нужно передать класс Даты а не Класс строка.
Неужели не понятно?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209645
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
массивПростыхТипов = ПарсерXML
ЗаписатьВБД(массивПростыхТипов);

//внутри:
цикл
ps.setObject(i+1, массивПростыхТипов[i]);


почти 4 строки кода. Что не работает?
Парсер XML любыми способами готовит массив или коллекцию.
Не должен Java код бизнес уровня быть замусорен техническим кодом уровня СУБД.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209647
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Драйвер определяет тип по типу класса. Значит в SetObject нужно передать класс Даты а не Класс строка.
Это уже лучше и даже здорово, но тогда снова возвращаемся к тому с чего начали: определение типа параметра :)
И если так, то выход один значит: юзать словарь БД.
При этом сейчас наткнулся на вообще странное поведение - параметры, не смотря на то, что заданы четко в соответствии именам
и порядок их следования в объявлении стейтмента четко соответствует порядку в ХП, приходят они в ХП вообще наперекосяк перепутавшись местами )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209648
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSЭто уже лучше и даже здорово, но тогда снова возвращаемся к тому с чего начали: определение типа параметра :)
нет.
Из XML ты должен знать что приходит и трансформировать в объекты типа.
Иначе заливай строку XML одной строкой.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209649
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал указать явно все параметры таким макаром:
Код: plsql
1.
ins = dbconn.prepareCall ("{call some_proc(param_name => :param_name)}");


Нипамагает. Все равно в ХП значения приходят наперекосяк. Печаль
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209650
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
я тебя понял.
Ты от ленности максимально оттягиваешь момент разбора мусора в XML для заливки в БД.
Имена полей и типы полей известны на момент разработки. И никак иначе.
Просто чтобы дважды не писать длинный код ты валидируешь XML парам. самим парсером, а в БД тип заливается автоматом.
Ты же пытаешься в рантайме определить не только тип поля из XML, но и залить его в зависимости от типа серверного программиста. Так не бывает.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209652
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSНипамагает
ну тогда только мой вариант в 4 строки. И не ленись парсить XML по настоящему.
Удачи!
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209655
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Из XML ты должен знать что приходит и трансформировать в объекты типа.
Не улавливаю. Тогда получается, мне надо обработать каждое поле.
Хотел так:
1. Есть xml c известными полями (при этом определенных тегов для разных сущностей может и не быть)
2. Согласно сущностям xml делаем хранимки в БД, так чтобы имена параметров совпадали с именами тегов (благо имена позволяют)
3. Читаем тег, по его имени достаем параметр хранимки, по этому параметру определяем какого он типа, приводим к этому типу и засовываем значение тега в значение параметра (как ты говоришь, уже трансформированное в нужный тип/класс)

Попробую сделать вариант такой, и наверно это имеется в виду:
1. для сущности в xml создается соответствующий класс в яве с полями соответствующих типов.
2. читаем xml в этот класс
3. переливаем в параметры стейтмента поля нашего класса
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209660
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSPetro123Из XML ты должен знать что приходит и трансформировать в объекты типа.
Не улавливаю. Тогда получается, мне надо обработать каждое поле.
Хотел так:
1. Есть xml c известными полями (при этом определенных тегов для разных сущностей может и не быть)

== да

2. Согласно сущностям xml делаем хранимки в БД, так чтобы имена параметров совпадали с именами тегов (благо имена позволяют)

=== почти. Можно и однаХПнаОднуXML_Накладная

3. Читаем тег, по его имени достаем параметр хранимки, по этому параметру определяем какого он типа,

=== да. Валидация обязательна т.к. это общение 2-х ИС между собой. И версию ещё внутрь XML засунуть.

приводим к этому типу и засовываем значение тега в значение параметра (как ты говоришь, уже трансформированное в нужный тип/класс

=== да. Тут как удобней при заливке. Я простым линейным списком статического массива делал. Т.к. insert в одну таблу сразу

)

Попробую сделать вариант такой, и наверно это имеется в виду:
1. для сущности в xml создается соответствующий класс в яве с полями соответствующих типов.
2. читаем xml в этот класс
3. переливаем в параметры стейтмента поля нашего класса
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209664
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS1. для сущности в xml создается соответствующий класс в яве с полями соответствующих типов.
если есть автомат для этого дела, то я за.
Но я думаю, понадобится маппинг или DTD схема или ....
В общем тут поправят, но нужны простые классы для отрибутов.
Я читал ноды XML руками и мне легко было читать дату ДатаРождения и я знал что это дата)))) LOL
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209699
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Я читал ноды XML руками и мне легко было читать дату ДатаРождения и я знал что это дата)))) LOL
Если xml сложный, содержит много сущностей для разных таблиц, с зависимостями, глубоким деревом, кучей тегов, которые могут пропускаться, если нет значения, то ладно еще в БД прописать куда что раскладывать, но когда это же еще надо и в яве прописывать, по-моему это уже не рационально: ты же прописал все в БД, то есть у тебя есть уже типы параметров(полей), вот их достаешь (придется из словаря все же видимо) и дальше уже просто по имени тега сопоставляешь, не перебирая в яве, типа если это такое поле, то это поле даты, если такое, то это число и т.д. И я сначала так и подумал, что setObject чудесным образом сам все поймет и преобразует к нужному типу )))

В общем ясно.
Но возникает вопрос, есть в яве возможность индексировать массив строковыми ключами? ) То есть ну создал ты массив, где явно прописал: такое-то поле преобразуем к такому-то типу, такое-то к такому, но потом бегать по всему массиву, выискивая по имени тега нужный параметр совсем не норма имхо.
Или например есть ли возможность обратиться к полю класса динамически задавая имя поля?
Типа как в js можно обращаться например не
Код: javascript
1.
some_obj.some_field, а еще и some_obj['some_field']
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209705
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто если это реализовать, то парсер получится маленький, практически универсальный и довольно шустрый. По-моему наоборот, в части загрузки того же xml явой не должно быть здесь никакой бизнес-логики - просто утилита загрузки и ничего более, транзит, а вот уже в базе все и разруливается куда что класть. Больше того, в базе по-любому же придется прописывать все поля и типы. Не уверен, что имеет смысл все это дублировать в яве )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209711
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSа вот уже в базе все и разруливается куда что класть
тебя тут не поймут.
На каком ЯП в базе разруливать. Приведи пример.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209713
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
так что ли?
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
select 
    extractvalue(Value (dtl), '//id') id,
    extractValue(Value (dtl), '//nom') nom,
    extractValue(Value (dtl), '//filial_id') filial_id,
    extractValue(Value (dtl), '//rko_id') rko_id,
    extractValue(Value (dtl), '//plat_type_id') plat_type_id,
    extractValue(Value (dtl), '//doc_state_id') doc_state_id,
    extractValue(Value (dtl), '//provider_id') provider_id,
    extractValue(Value (dtl), '//lic_id') lic_id,
    extractValue(Value (dtl), '//dat') dat,
    extractValue(Value (dtl), '//client_dat') client_dat,
    extractValue(Value (dtl), '//summ') summ,
    extractValue(Value (dtl), '//summ_komis') summ_komis,
    extractValue(Value (dtl), '//client_komis') client_komis,
    extractValue(Value (dtl), '//input_summ') input_summ,
    extractValue(Value (dtl), '//sdacha_summ') sdacha_summ,
    extractValue(Value (dtl), '//client_fio') client_fio,
    extractValue(Value (dtl), '//client_address') client_address,
    extractValue(Value (dtl), '//client_phone') client_phone,
    extractValue(Value (dtl), '//import_plat') import_plat,
    extractValue(Value (dtl), '//create_user_id') create_user_id,
    extractValue(Value (dtl), '//schet_izv') schet_izv,
    extractValue(Value (dtl), '//period') period,
    extractValue(Value (dtl), '//res') res,
    extractValue(Value (dtl), '//styear') styear,
    extractValue(Value (dtl), '//stmonth') stmonth,
    extractValue(Value (dtl), '//servicerps_id') servicerps_id,
    extractValue(Value (dtl), '//namerpsprovider') namerpsprovider,
    extractValue(Value (dtl), '//timeresponserps') timeresponserps,
    extractValue(Value (dtl), '//referenceresrps') referenceresrps,
    extractValue(Value (dtl), '//parametrsrps') parametrsrps,
    extractValue(Value (dtl), '//param') params,
    extractValue(Value (dtl), '//nom_detsad') nom_detsad,
    extractValue(Value (dtl), '//komis_provaider') komis_provaider
                                                          
   from TABle(XMLSequence(extract(xmltype('
             <com_payments>
                <id>2062707</id>
                <nom>2062707</nom>
                <filial_id>2</filial_id>
                <rko_id>203</rko_id>
                <plat_type_id>5</plat_type_id>
                <doc_state_id>3</doc_state_id>
                <provider_id>697</provider_id>
                <lic_id>210275</lic_id>
                <dat>2015-11-12t16:36:23.124799</dat>
                <client_dat>2015-11-12t00:00:00.000000</client_dat>
                <summ>1212</summ>
                <summ_komis>0</summ_komis>
                <client_komis>100</client_komis>
                <input_summ>12121</input_summ>
                <sdacha_summ>10809</sdacha_summ>
                <client_fio>амангалиева улдай амангалиевна</client_fio>
                <client_address>нурсая 22-33</client_address>
                <client_phone>2</client_phone>
                <import_plat></import_plat>
                <create_user_id>154</create_user_id>
                <schet_izv></schet_izv>
                <period></period>
                <res>0</res>
                <styear></styear>
                <stmonth></stmonth>
                <servicerps_id>1</servicerps_id>
                <namerpsprovider></namerpsprovider>
                <timeresponserps></timeresponserps>
                <referenceresrps></referenceresrps>
                <parametrsrps></parametrsrps>
                <param></param>
                <nom_detsad></nom_detsad>
                <komis_provaider></komis_provaider>
             </com_payments>
             
   '),'//com_payments'))) dtl;

...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209725
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123На каком ЯП в базе разруливать. Приведи пример.
Что значит на каком ЯП? Если брать оракл, то PL/SQL.
Вариант селекта из xml тоже вариант, кстати и может быть довольно мощный, не пробовал.
Т.е. xml в виде CLOBа тащим в базу и в хранимке делаем из него селект, - мощно будет :)
Но говорю о том, что.
Когда мы заливаем данные в базу, то мы:
- готовим под эти данные структуры в базе, в частности таблицы
- готовим ХП в базе, которые кладут в конечном итоге данные в эти таблицы
при чем здесь внутри БД мы уже вольны писать гораздо эффективнее, чем на яве в плане работы с данными, можем делать на этом этапе кучи проверок, трансформаций, дополнений и т.д. (и если делать это же самое через яву, то мы просто удвоим и себе объем работы и машине).
Т.е. по-моему данная задача должна сводиться к созданию в яве интерфейса для БД, чтобы она могла "прочитать" этот файл. Т.е. достаточно явой сопоставить сущности+поля БД, с сущностями+полями в xml и привести их к типам в БД, никакой бизнес-логики в яве здесь не вижу :(, просто транзит/маппинг данных из файла в БД.
По-моему мы об одном говорим, но может чего-то не понимаю или не понимаю выражение "бизнес-логика" )
Например:
Petro123=== почти. Можно и однаХПнаОднуXML_Накладная
Вот эта ХП. Она же будет раскладывать данные по разным таблицам (контрагенты, товары, склады, цены). При этом, как правило, в будет делаться куча проверок, как явных в ХП, так и на автомате (констрейнты, обновление различных мат. вью, консолидация данных для отчетов и т.д.), данные в большинстве случаев в дальнейшем или сразу на лету трансофрмируются в зависимости от уже существующих в БД других данных и т.д. вот это и понимаю под бизнес-логикой. Делать это на яве мне кажется странным.
По-моему ява ж не заточна на манипуляции с данными в контексте реляционной БД.
Или я чего-то не знаю? )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209767
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
Off
- а если у вас Postgre то будем на PostgrePL писать?
- а если импорт придёт от ИС с этого же домена по REST?
Все индивидуально.
Ты java программист или разработчик бд? В одном лице может крышу снести)))).
Удачи.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209806
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Garrickp.setIntAtName
кроме того, сам код)) не в состоянии тип определить?
Можно использовать setObjectAtName . Spring, например, так делает.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209843
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick,
замечательно. Попробую.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209849
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- а если у вас Postgre то будем на PostgrePL писать?
- а если импорт придёт от ИС с этого же домена по REST?
Все индивидуально.
А как еще? Конечно придется писать на PostgrePL.
Куда денешься от того, чтобы прописывать сущности в БД? )
И потом ojdbc работает с Postgre? Если нет, то придется ж и загрузчик на яве все равно переписывать или писать его с каким-нибудь универсальным провайдером данных типа одбц или датасорсы того же гласфиша
Но посыл понял ) Просто практически не работал с коробочными решениями, ориентированными на большой круг потребителей и потому заточенных на работу с любой БД. Все крупные конторы, которые видел, как правило, имеют свою систему очень плотно завязанную на конкретную СУБД. По-моему нельзя добиться эффективной отдачи от СУБД, используя ее только как таблички, а всю обработку данных, бизнес-логику вынести в яву, точнее можно, но тогда зачем тот же oracle? Бери таблички MSSQL и вперед )) Истина где-то посредине наверно, конечно все индивидуально )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209860
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
давай завязывать OFF. Хибер, ОРМ и АппСервер работают со всеми СУБД сразу.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209892
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и JDBC, Select и Insert от БД к БД меняются не сильно. Особенно в контексте задачи разобрать XML и разложить по полям таблицы.

У JDS какой-то поток сознания:
1. Хочешь на Java - делай на Java. В чем проблема?
2. Хочешь на PL/SQL - делай на PL/SQL. Опять таки, в чем проблема? Oracle PL/SQL базовые средства работы с XML (но только через DOM) имеет, т.ч. можно и весь разбор на PL/SQL написать. Скорее всего будет работать значительно медленнее, чем на Java, но решать Вам.
3. Проблема сформулированная изначально "определить типы параметров сторед процедуры" - надуманная. Т.к. все необходимые средства для этого есть. И в Oracle (вьюшки с метаописанием) и в JDBC (независимо от типа БД).
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209977
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, Petro123, со всем согласен.
Написать-то можно, не вопрос, но хочется ж оптимально и грамотно, а получается какое-то мясо пока.
Более предметно.
В соседней теме посоветовали юзать hashmap, для доступа к "массиву" по строковым ключам, набросал такой треш ) :
Код: 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.
38.
    private class someObject {
        private final Map<String, Integer> idx = new HashMap<>(); // порядковые номера параметров в ХП, т.е. <имя тега, пор.№ параметра в ХП>
        private final Map<String, Integer> types = new HashMap<>();  // тип параметра
        public  final Map<Integer, Object> fieldValues = new HashMap<>(); // значение параметра ХП

        someObject() {
           idx.put("FIELD1", 1);   types.put("FIELD1", 0);
           idx.put("FIELD2", 2);   types.put("FIELD2", 1);
           idx.put("FIELD3", 3);   types.put("FIELD3", 1);
           idx.put("FIELD4", 4);   types.put("FIELD4", 1);
           idx.put("FIELD5", 5);   types.put("FIELD5", 1);
           idx.put("FIELD6", 6);   types.put("FIELD6", 4);
           idx.put("FIELD7", 7);   types.put("FIELD7", 1);
           idx.put("FIELD8", 8);   types.put("FIELD8", 1);
           idx.put("FIELD9", 9);   types.put("FIELD9", 1);
           idx.put("FIELD10", 10); types.put("FIELD10", 1);
           idx.put("FIELD10", 11); types.put("FIELD11", 2);
           idx.put("FIELD12", 12); types.put("FIELD12", 2);
           clearFieldValues();
        }
        
        public void clearFieldValues() {
            for (int i=1; i<13; i++) 
               fieldValues.put(i, null); 
        }        
        
        public void setFieldValue(String fieldName, String fieldValue) {
            int ix = idx.get(fieldName);
            switch  (types.get(fieldName)) {
                case 0: fieldValues.put(ix, fieldValue); break; // String
                case 1: fieldValues.put(ix, getDateFromStringFunc(fieldValue)); break; // Date
                case 2: fieldValues.put(ix, Integer.parseInt(fieldValue)); break; // Integer
                case 3: fieldValues.put(ix, getDateFromStringFunc(fieldValue)); break; // TimeStamp
                case 4: fieldValues.put(ix, Double.parseDouble(fieldValue)); break; // Double
                case 5: fieldValues.put(ix, getClobFromString(fieldValue)); break; // Clob
            }
        }
    }


Еще не пробовал, т.к. не нравится.
Т.е. для каждой сущности создаем свой класс, в котором по мере разбора xml заполняем fieldValues.
Пошла новая сущность, добавили все значения fieldValues в пакет стейтмента, очистили fieldValues, читаем xml дальше.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209989
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS
Код: java
1.
 private class someObject {


поздравляю.
Ты изобрёл java.sql.DataSet
ну, или JDBC RowSet (Sun JCP, JSR 114)
JDSно хочется ж оптимально и грамотно
перфекционист? ))
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39209996
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSТ.е. для каждой сущности создаем свой класс,
осталось чуть до маппинга и ОРМ в виде хибера или iBatis.
....
Дайте ему сериализацию или маппинг из XML сразу в обхекты.
И пусть парит мозги соисполнителю если его XML не такой.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39210000
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Може вам это надо?
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39210001
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,
тебе дали разработку Модуля импорта из XML в БД.
Версия 1.0 - пол дня работы.
Сделал?
Это imho
В след.версиях улучшишь.
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39210011
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garrick, возможно, но думал, без стороннего все можно сделать.
Petro123, "потом" как правило не наступает, т.к. появляются новые задачи ) поэтому лучше по возможности делать сразу нормально, чем потом переделывать. В общем, если других нормальных вариантов кроме хиберов, то придется жить с этим пока )
...
Рейтинг: 0 / 0
JDBC+Oracle(Parameters)
    #39213208
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSGarrick, возможно, но думал, без стороннего все можно сделать.
Petro123, "потом" как правило не наступает, т.к. появляются новые задачи ) поэтому лучше по возможности делать сразу нормально, чем потом переделывать. В общем, если других нормальных вариантов кроме хиберов, то придется жить с этим пока )

А что, есть уверенность что хибернейт вызов хранимки в oracle сможет нормально сделать? К примеру,
Код: plsql
1.
2.
3.
4.
5.
create or replace package pkg is
  
  procedure run_it (p_var1 varchar2, p_var2 varchar2, p_var3 out varchar2);

end;


и далее,
Код: plsql
1.
2.
3.
begin
   pkg.run_it(:a, :a, :a);
end;



я думаю, тоже ничего хорошего не получится.
...
Рейтинг: 0 / 0
89 сообщений из 89, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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