|
|
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Привет всем Столкнулся я с неожиданной проблемой, пытаясь работать с анонимными PL/SQL блоками, содержащими маркированные параметры (типа :param1 :param2). Анонимные PL/SQL блоки я получаю из самой базы и мне их надо вызвать из Java, передать/получить значения маркированных параметров. OracleCallableStatement содержит методы setXXXAtName(), которые предназначены для установки значений таких маркированных параметров. Есть также метод registerOutParameterAtName() для регистрации выходных маркированных параметров. Но теперь вопрос - как же получить значение выходного маркированного параметра после execute() ? Методов getXXXAtName() нет, а обычный getXXX() из спецификации JDBC выдает ошибку "Ordinal binding and Named binding cannot be combined!" Кто-нибудь решал такую проблему? Видел код, где в анонимном блоке регулярным выражением составляется список всех маркированных параметров, в самом блоке они заменяются на стандартные для JDBC "?", потом ориентируясь по составленному списку параметров их значения проставляются по номеру через setXXX() и также извлекаются. Конечно, можно и так, но ведь медленно получится каждый раз парсить PL/SQL блок вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 02:36 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
c0ff75, Анонимный блок это просто кусок кода - скрипт. Вам критично что будут именно анонимные? Если дать имя, станут хранимкой, откомпилируются то на клиент потянется только имя. И быстрее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 07:19 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
c0ff75, пример с кодом привести можете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2017, 09:14 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Petro123, Критично. Эти блоки по сути правила, хранящиеся как выражения на PL/SQL. Их надо выполнять как написаны. Обошел проблему, разбирая PL/SQL и составляя список маркированных параметров в нем. А потом уже по списку подстановка по номеру стандартными вызовами setXXX Оказывается не я первый такой. Вон уже даже написали sql2o и дошли до версии 1.5.2. Но мне она не подошла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2017, 02:23 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Garrick, Упрощу пример, ибо много букав у меня в оригинальном коде String sql = "begin :par1 := pack.foo(:par2); end;"; try (OracleCallableStatement cs = (OracleCallableStatement)conn.prepareCall(sql)) { cs.registerOutputParameterAtName("par1", Types.INTEGER); cs.setIntAtName("par2", 10); cs.execute(); // Как теперь получить значение параметра par1 ? int res1 = cs.getIntAtName("par1"); // Такого метода нет, хотя логично было бы его иметь int res2 = cs.getIn("par1"); // Логично не работает и вызывает ошибку "Ordinal binding and Named binding cannot be combined!" } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2017, 02:27 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Почему ты не используешь registerOutParameter? Как здесь https://stackoverflow.com/questions/15120715/calling-an-oracle-sql-function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2017, 08:33 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
mayton, Потому что на вход у меня PL/SQL блок с маркированными параметрами типа begin :par1 := foo(:par2, :par3); end; А с маркированными параметрами простой registerOutParameter() не работает. Ораклом придуман нестандартный registerOutParameterAtName(). Он отлично работает, но вот как получить значение зарегистрированного выходного параметра после execute() - неясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 01:54 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Поскольку исходник тебе дан в пользование то никто не запретит тебе перед исполнением его слегка подкорректировать. Замени Oracle-style на Ansi-SQL-style и проблема этих так называемых именованных (боже что за термин такой?) параметров должна уйти. Как-то так Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 09:08 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
c0ff75Критично. Эти блоки по сути правила, хранящиеся как выражения на PL/SQL. Их надо выполнять как написаны. Разумеется. Сейчас у вас куски кода на PL, а требуетя их привести в ПРАВИЛА а ля МЕТОДЫ или API-хранимки СУБД. Тут уж сами там смотрите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 09:42 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
c0ff75, Я тоже исследовал этот вопрос но давно http://www.sql.ru/forum/813625/oraclepreparedstatement-i-named-parametr?hl= Не работают как следует именованные параметры... В той де ветке или...ссылка ответ...Вот так я сделал http://www.javaworld.com/article/2077706/core-java/named-parameters-for-preparedstatement.html?page=2 Основа это Код: plsql 1. 2. 3. 4. 5. 6. 7. Т.е парсистся Ваш pl/sql Подготавливается таблица Имя параметра-Номер И далее по номерам работает. Одна проблема (что я пока не решил)(ПО тому же примеру) Код: plsql 1. 2. 3. 4. 5. 6. 7. Нельзя комментировать,- тот парсер(не игнорирует комментарий) добавляет newfirms_id в таблицу и его номер становится принадлежащий action. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 09:44 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Фигня какая-то. Не верю я, что современный Oracle JDBC драйвер настолько корявый. Пошел доку читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 18:04 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
c0ff75...OracleCallableStatement содержит методы setXXXAtName(), которые предназначены для установки значений таких маркированных параметров. ... Нафига эти методы нужны, лично мне вообще не понятно. Первый раз о них услышал И setXXX и getXXX методы, имеют 2-а переопределенных вариант, когда первый параметр с типом int и когда он с типом String. Зачем нужна порнография с ...AtName мне не известно. Первые попавшиеся примеры в I-net, просты как 5-ть копеек https://community.oracle.com/thread/4028467 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 18:14 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
irbis_alНе работают как следует именованные параметры... Ну у Вас достаточно специфический случай. Именованный параметр встречается два раза в блоке. Тут даже не очень понятно, с точки зрения internal oracle, что это. Один параметр который встречается два раза или два разных параметра но названные одинаково. irbis_al...парсер... Как-то больно это все сложно Вполне доступно получение метаданных о запросе (и анонимном Pl-sql блоке, в принципе, оно все анонимный блок), нафига нужны какие-то сторонние парсеры, не ясно совершенно. IMHO, близко с проблемой не сталкивался. Возможно полностью не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 18:23 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Дело в том,что моя ИС не знает что будет исполнять... Тут Выше были какие-то хардкодные решения.(sql прямо в коде...Это не мой формат,так неограниченное кол-во решений не получить) ИС читает базу,читает инструкцию...загружает к себе pl/sql.(или sql для набора данных) (Неизвестный заранее вообще) Связывает его с экранными формами...биндит. Повторяющихся переменных может быть "вагон и маленькая тележка"...это уж как разработчик pl,/sql решит. Пользует тот алгоритм что выше...для связывания имени в pl/sql и java. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2017, 18:50 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevТут даже не очень понятно, с точки зрения internal oracle, что это. Самому Оракулу одноимённые параметры срывают крышу. Так что, аффтар, не надо так делать. Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную. Точнее, раз код не твой, объясни его писателям, как это надо делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2017, 13:50 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov... Самому Оракулу одноимённые параметры срывают крышу. Так что, аффтар, не надо так делать. Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную. Точнее, раз код не твой, объясни его писателям, как это надо делать. у аффтара вроде никаких таких сложностей нету только, зачем-то, в какие-то дебри полез обычные setXXX и getXXX методы должны нормально с именованными параметрами работать. Можно и по номеру обращаться и по имени. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2017, 15:06 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov...Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную.... +100500 я всегда так и делаю и результат так же возвращаю. Типо такого: Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2017, 15:08 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevобычные setXXX и getXXX методы должны нормально с именованными параметрами работать. Ну, может, в JDBС они и должны. OCI - не может, глючит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 13:53 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovСоздавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную. Так это хороший совет для входного параметра. А для выходного - это сильно перепахивать код, под единственную точку выхода. Вот ТС и мается. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 16:50 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевТак это хороший совет для входного параметра. А для выходного - это сильно перепахивать код, под единственную точку выхода. Вот ТС и мается. :) иметь больше одной точки выхода, а тем более разбросанное по всему коду присвоение выходных данных - жесть при отладке и саппорте при отладке и поиске багов, желательно все же входные и выходные параметры более-менее оперативно логировать/отслеживать. Если по коду присвоение и вход/выход разбросано, то когда понадобится: ни логи не вставишь, ни бреакпоинты, ни отдебажить по нормальному. IMHO & AFAIK Ну, может, в JDBС они и должны. OCI - не может, глючит. не сталкивался тот случай, когда анти-паттерн в одном месте (pl/sql), порождает проблемы в казалось бы совершенно не связанных местах (вызов с клиента) IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 17:49 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Автор сбежал походу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 19:56 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, +1 голые сырые куски кода лежат на сервере. Могут даже не PL, а на Java там лежать. Потом кто-то догадался вместо моделирования и программирования вызывать с сервера на клиента куски и сшивать запускать в виде ИС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 22:59 |
|
||
|
Oracle JDBC и маркированные параметры
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevне сталкивался Я сталкивался. Делаешь одноимённые параметры, препарируешь запрос - проблем нет, одноименные парамеры считаются одним. Присваиваешь им значения by name - проблем нет. Пытаешься выполнить запрос - "не заданы значения всех параметров". Пытаешься присваивать значения by pos - "номер позиции больше, чем число параметров". Плюёшь, переписываешь запрос как сказано выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:00 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39501289&tid=2122678]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 508ms |

| 0 / 0 |
