powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Oracle JDBC и маркированные параметры
23 сообщений из 23, страница 1 из 1
Oracle JDBC и маркированные параметры
    #39499355
c0ff75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем

Столкнулся я с неожиданной проблемой, пытаясь работать с анонимными 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 блок вручную.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39499380
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c0ff75,
Анонимный блок это просто кусок кода - скрипт.
Вам критично что будут именно анонимные?
Если дать имя, станут хранимкой, откомпилируются то на клиент потянется только имя. И быстрее будет.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39499438
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c0ff75, пример с кодом привести можете?
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500577
c0ff75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Критично. Эти блоки по сути правила, хранящиеся как выражения на PL/SQL. Их надо выполнять как написаны.

Обошел проблему, разбирая PL/SQL и составляя список маркированных параметров в нем. А потом уже по списку подстановка по номеру стандартными вызовами setXXX

Оказывается не я первый такой. Вон уже даже написали sql2o и дошли до версии 1.5.2. Но мне она не подошла.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500579
c0ff75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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!"
}
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500595
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему ты не используешь registerOutParameter?

Как здесь https://stackoverflow.com/questions/15120715/calling-an-oracle-sql-function
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500864
c0ff75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Потому что на вход у меня PL/SQL блок с маркированными параметрами типа

begin
:par1 := foo(:par2, :par3);
end;

А с маркированными параметрами простой registerOutParameter() не работает. Ораклом придуман нестандартный registerOutParameterAtName(). Он отлично работает, но вот как получить значение зарегистрированного выходного параметра после execute() - неясно.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500885
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку исходник тебе дан в пользование то никто не запретит тебе перед исполнением
его слегка подкорректировать. Замени Oracle-style на Ansi-SQL-style и проблема этих так называемых
именованных (боже что за термин такой?) параметров должна уйти.

Как-то так
Код: sql
1.
{ ? = foo(?, ?) }
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500889
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c0ff75Критично. Эти блоки по сути правила, хранящиеся как выражения на PL/SQL. Их надо выполнять как написаны.
Разумеется.
Сейчас у вас куски кода на PL, а требуетя их привести в ПРАВИЛА а ля МЕТОДЫ или API-хранимки СУБД.
Тут уж сами там смотрите.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500890
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
private int[] getIndexes(String name) {
        int[] indexes=(int[])indexMap.get(name);
        if(indexes==null) {
            throw new IllegalArgumentException("Parameter not found: "+name);
        }
        return indexes;
    }


Т.е парсистся Ваш pl/sql
Подготавливается таблица
Имя параметра-Номер
И далее по номерам работает.

Одна проблема (что я пока не решил)(ПО тому же примеру)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
begin
if :action=0 then
killdupsproc(:newfirms_id,:oldfirms_id);
/*myprocedure(:newfirms_id)*/
elsif :action=1 then null;
end if;
end;



Нельзя комментировать,- тот парсер(не игнорирует комментарий) добавляет newfirms_id в таблицу и его номер становится принадлежащий action.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500979
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигня какая-то. Не верю я, что современный Oracle JDBC драйвер настолько корявый.
Пошел доку читать.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500980
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
- or
    CallableStatement cstmt = conn.prepareCall("begin :a := :b + 1; end;");
    cstmt.registerOutParameter("a", Types.INTEGER);
    cstmt.setInt("b", 100);
    cstmt.execute();
    int newValue = cstmt.getInt("a");

- or
    CallableStatement cstmt = conn.prepareCall("begin ? := ? + 1; end;");
    cstmt.registerOutParameter(1, Types.INTEGER);
    cstmt.setInt(2, 100);
    cstmt.execute();
    int newValue = cstmt.getInt(1);
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500984
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_alНе работают как следует именованные параметры...

Ну у Вас достаточно специфический случай. Именованный параметр встречается два раза в блоке. Тут даже не очень понятно, с точки зрения internal oracle, что это. Один параметр который встречается два раза или два разных параметра но названные одинаково.

irbis_al...парсер...
Как-то больно это все сложно

Вполне доступно получение метаданных о запросе (и анонимном Pl-sql блоке, в принципе, оно все анонимный блок), нафига нужны какие-то сторонние парсеры, не ясно совершенно. IMHO, близко с проблемой не сталкивался. Возможно полностью не прав.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39500988
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Дело в том,что моя ИС не знает что будет исполнять...
Тут Выше были какие-то хардкодные решения.(sql прямо в коде...Это не мой формат,так неограниченное кол-во решений не получить)
ИС читает базу,читает инструкцию...загружает к себе pl/sql.(или sql для набора данных)
(Неизвестный заранее вообще)
Связывает его с экранными формами...биндит.
Повторяющихся переменных может быть "вагон и маленькая тележка"...это уж как разработчик pl,/sql решит.
Пользует тот алгоритм что выше...для связывания имени в pl/sql и java.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39501216
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТут даже не очень понятно, с точки зрения internal oracle, что это.
Самому Оракулу одноимённые параметры срывают крышу. Так что, аффтар, не надо так делать. Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную. Точнее, раз код не твой, объясни его писателям, как это надо делать.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39501287
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov...
Самому Оракулу одноимённые параметры срывают крышу. Так что, аффтар, не надо так делать. Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную. Точнее, раз код не твой, объясни его писателям, как это надо делать.
у аффтара вроде никаких таких сложностей нету

только, зачем-то, в какие-то дебри полез

обычные setXXX и getXXX методы должны нормально с именованными параметрами работать. Можно и по номеру обращаться и по имени. IMHO & AFAIK
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39501289
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov...Создавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную....
+100500
я всегда так и делаю и результат так же возвращаю. Типо такого:

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare
  x_result number;
  x_myVar number := :PARAM1;
begin
  ....
  :PARAM2 := x_result;
end;
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39501857
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevобычные setXXX и getXXX методы должны нормально с именованными параметрами работать.
Ну, может, в JDBС они и должны. OCI - не может, глючит.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39501978
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСоздавай переменную, которой присваивай этот параметр и потом уже используй в блоке эту переменную.
Так это хороший совет для входного параметра. А для выходного - это сильно перепахивать код, под единственную точку выхода.
Вот ТС и мается. :)
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39502027
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевТак это хороший совет для входного параметра. А для выходного - это сильно перепахивать код, под единственную точку выхода.
Вот ТС и мается. :)
иметь больше одной точки выхода, а тем более разбросанное по всему коду присвоение выходных данных - жесть при отладке и саппорте
при отладке и поиске багов, желательно все же входные и выходные параметры более-менее оперативно логировать/отслеживать. Если по коду присвоение и вход/выход разбросано, то когда понадобится: ни логи не вставишь, ни бреакпоинты, ни отдебажить по нормальному. IMHO & AFAIK

Ну, может, в JDBС они и должны. OCI - не может, глючит.
не сталкивался

тот случай, когда анти-паттерн в одном месте (pl/sql), порождает проблемы в казалось бы совершенно не связанных местах (вызов с клиента) IMHO
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39502124
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор сбежал походу.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39502217
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
+1
голые сырые куски кода лежат на сервере. Могут даже не PL, а на Java там лежать.
Потом кто-то догадался вместо моделирования и программирования вызывать с сервера на клиента куски и сшивать запускать в виде ИС.
...
Рейтинг: 0 / 0
Oracle JDBC и маркированные параметры
    #39502578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevне сталкивался
Я сталкивался. Делаешь одноимённые параметры, препарируешь запрос - проблем нет, одноименные парамеры считаются одним. Присваиваешь им значения by name - проблем нет. Пытаешься выполнить запрос - "не заданы значения всех параметров". Пытаешься присваивать значения by pos - "номер позиции больше, чем число параметров". Плюёшь, переписываешь запрос как сказано выше.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Oracle JDBC и маркированные параметры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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