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


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