powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters)
25 сообщений из 89, страница 3 из 4
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
25 сообщений из 89, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC+Oracle(Parameters)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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