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

Со знаками "?" в качестве плесхолдера есть одна существенная проблема - очень сильно завязываешься на порядок указания параметров. Как обойти? Возможны ли именованные плейсхолдеры?
...
Рейтинг: 0 / 0
Oracle JDBC: возможны ли именованные плейсхолдеры?
    #33448971
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможны. CallableStatement +свежий драйвер.
...
Рейтинг: 0 / 0
Oracle JDBC: возможны ли именованные плейсхолдеры?
    #33449060
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты про привязку параметров по их именам? Возможны в JDBC от Oracle10g, которые ненавязчиво рекомендуют, мол, SQL types to Java types conversion up to 30 times faster Рабочий пример есть здесь под именем Named Parameters Sample . Но не везде и не всегда. У меня еще получилось следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   private   static   void  testResultSetParameters(Connection con)
     throws  SQLException {
    OraclePreparedStatement cst =  null ;
    ResultSet rs =  null ;
     try  {
      cst = (OraclePreparedStatement) con.prepareStatement(
        "select e.*\n" +
          "from scott.emp e\n" +
          "where e.empno = :empno\n" +
          "   or e.empno = :empno"
      );
      cst.setIntAtName("empno",  7369 );
      rs = cst.executeQuery();
       while  (rs.next()) {
        System.out.println("ename=" + rs.getString("ename"));
      }
    }  finally  {
       if  (rs !=  null ) { rs.close(); }
       if  (cst !=  null ) { cst.close(); }
    }
  }

Для OUT-параметров я такого не нашел, использование метода OracleCallableStatement.registerOutParameter(String, int) приводит к исключению при execute():
Код: plaintext
1.
2.
3.
java.sql.SQLException: Incorrectly set or registered parameters.
	at oracle.jdbc.driver.OracleSql.setNamedParameters(OracleSql.java:211)
	at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4221)

Также не получается одновременно использовать привязки IN-параметров по именам, а OUT-по порядку, получаешь
Код: plaintext
1.
2.
3.
4.
java.sql.SQLException: operation not allowed: Ordinal binding and Named binding cannot be combined!
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4219)

В качестве полумеры, на всякий случай, можно использовать pl/sql-привязку по имерам, наподобе
Код: plaintext
PreparedStatement pst = con.prepareStatement("{call foo(param=>?,param2=>?)}")
чтобы не зависить от последовательности указания параметров в самой оракловой процедуре.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Oracle JDBC: возможны ли именованные плейсхолдеры?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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