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

Имею такой код:

Код: plaintext
1.
2.
CallableStatement stmt = conn.prepareCall(sql);
ResultSetMetaData meta = cSt.getMetaData();

В результате meta==null. В примерах обычно метадата берется после выполнения, но я хочу выяснить изменяемые параметры, чтобы выдать соответствующие registerOutParameter. Это возможно вообще?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824162
Фотография Софтверный проктолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от СУБД и некоторых настроек.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824169
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, исчерпывающий ответ :-)

База - Oracle 9+, родной драйвер.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824199
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось, что ResultSetMetaData пусто и после выполнения. В чем грабли? Нужно что-то указать уровне Connection или Datasource?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824254
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
ResultSetMetaData meta = cSt.getMetaData();
ResultSetMetaData возвращаеться для ResultSet, а что такое cSt ?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824255
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СэмкаОказалось, что ResultSetMetaData пусто и после выполнения. В чем грабли? Нужно что-то указать уровне Connection или Datasource?
для Prepared/Callable statements getResultSetMetaData неприменимо.
можно пользоватсья только getParameterMetaData.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824299
Фотография Софтверный проктолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
для Prepared/Callable statements getResultSetMetaData неприменимо.
можно пользоватсья только getParameterMetaData.
Меня ввел в заблуждение Sybase.
А getParameterMetaData не реализован ни в Sybase, ни в Oracle драйверах.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824310
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Софтверный проктолог Timm
для Prepared/Callable statements getResultSetMetaData неприменимо.
можно пользоватсья только getParameterMetaData.
Меня ввел в заблуждение Sybase.
А getParameterMetaData не реализован ни в Sybase, ни в Oracle драйверах .
не ври. по крайней мере в дровах от 10-ки - реализован.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824318
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ачипятка:

CallableStatement stmt = conn.prepareCall(sql);
ResultSetMetaData meta = stmt.getMetaData();
-----

Спасибо, нашел ParameterMetaData и сам, но Oracle дает только getParameterCount(). Т.е. он ВООБЩЕ не может дать более подробно? Или нужно другой класс драйвера указать? DD не годится, нет его у меня.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824359
Фотография Софтверный проктолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
не ври. по крайней мере в дровах от 10-ки - реализован.
Что ты говоришь? Ась?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        OracleConnection conn = (OracleConnection) ConnectionPool.getInstance().configure(
                "com.forward.cfg.connection-pool-oracle-reports").getConnection();
        System.out.println(conn.getVersionNumber());

        CallableStatement st = conn.prepareCall("begin ? := AA; end;");
        

        st.registerOutParameter( 1 , Types.NUMERIC);
        
        st.execute();
        System.out.println(st.getParameterMetaData());


MANIFEST.MF
Manifest-Version: 1.0
Implementation-Version: "Oracle JDBC Driver version - 10.1.0.5.0"
Specification-Title: "Oracle JDBC driver classes for use with JDK1.
4"
Specification-Version: "Oracle JDBC Driver version - 10.1.0.5.0"
Implementation-Title: "ojdbc14_g.jar"
Created-By: 1.2.2 (Sun Microsystems Inc.)
Implementation-Time: "Wed Dec 28 05:22:29 2005"
Implementation-Vendor: "Oracle Corporation"
Specification-Vendor: "Oracle Corporation" .


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 10103 
Exception in thread "main" java.sql.SQLException: Не поддерживаемая функция
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java: 125 )
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java: 162 )
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java: 227 )
	at oracle.jdbc.driver.DatabaseError.throwUnsupportedFeatureSqlException(DatabaseError.java: 537 )
	at oracle.jdbc.driver.OraclePreparedStatement.getParameterMetaData(OraclePreparedStatement.java: 9073 )
	at xxxxxxxxxxxxxxxxxxxxxx.main(ForwardDBMSAuth.java: 222 )

...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824370
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Софтверный проктолог Timm
не ври. по крайней мере в дровах от 10-ки - реализован.
Что ты говоришь? Ась?

10r2.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824429
Фотография Софтверный проктолог
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm
10r2.
Действительно.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824433
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты о родных дровах говоришь или датадиректовских? Родные возвращают ParameterMetaData, но ни один метода там не имплементирован. Или у тебя другая информация?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824445
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сэмка
Спасибо, нашел ParameterMetaData и сам, но Oracle дает только getParameterCount(). Т.е. он ВООБЩЕ не может дать более подробно?
пнятно, оказываеццо не реализовано.
с другой стороны - в общем случае типы параметров в jdbc до выполнения (без разбора statement'a на клиенте) определить в принципе невозможно.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824467
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Timm Сэмка
Спасибо, нашел ParameterMetaData и сам, но Oracle дает только getParameterCount(). Т.е. он ВООБЩЕ не может дать более подробно?
пнятно, оказываеццо не реализовано.
с другой стороны - в общем случае типы параметров в jdbc до выполнения (без разбора statement'a на клиенте) определить в принципе невозможно.

А вот это полная фигня: большинство остальных баз при вызове PrapareCall действительно его разбирают, т.е. в терминах Oracle вызывают parse и describe_columns. Почему Oracle не делает этого - загадка.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824699
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сэмка Timm Сэмка
Спасибо, нашел ParameterMetaData и сам, но Oracle дает только getParameterCount(). Т.е. он ВООБЩЕ не может дать более подробно?
пнятно, оказываеццо не реализовано.
с другой стороны - в общем случае типы параметров в jdbc до выполнения (без разбора statement'a на клиенте) определить в принципе невозможно.

А вот это полная фигня: большинство остальных баз при вызове PrapareCall действительно его разбирают, т.е. в терминах Oracle вызывают parse и describe_columns. Почему Oracle не делает этого - загадка.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
cstmt = conn.prepareCall("begin ?:=?+1; end;");
cstmt.registerOutParameter( 1 , Types.INTEGER);
cstmt.setInt( 2 ,  1 );
cstmt.execute();
System.out.println(cstmt.getObject( 1 ));

cstmt.clearParameters();

cstmt.registerOutParameter( 1 , Types.DATE);
cstmt.setDate( 2 ,  new  java.sql.Date(System.currentTimeMillis()));
cstmt.execute();
System.out.println(cstmt.getObject( 1 ));
Код: plaintext
1.
 2 
 2007 - 09 - 26 
ы?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34824918
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это анонимный блок, в чистом JDBC используется конструкция { call <хранимая процедура> } и мне именно это и нужно. Могут быть, конечно, трудности с оверлоудингом, но без оного противовоказаний распарсить сразу нет. Ладно, придется использовать DatabaseMetaData.

Timm Сэмка Timm Сэмка
Спасибо, нашел ParameterMetaData и сам, но Oracle дает только getParameterCount(). Т.е. он ВООБЩЕ не может дать более подробно?
пнятно, оказываеццо не реализовано.
с другой стороны - в общем случае типы параметров в jdbc до выполнения (без разбора statement'a на клиенте) определить в принципе невозможно.

А вот это полная фигня: большинство остальных баз при вызове PrapareCall действительно его разбирают, т.е. в терминах Oracle вызывают parse и describe_columns. Почему Oracle не делает этого - загадка.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
cstmt = conn.prepareCall("begin ?:=?+1; end;");
cstmt.registerOutParameter( 1 , Types.INTEGER);
cstmt.setInt( 2 ,  1 );
cstmt.execute();
System.out.println(cstmt.getObject( 1 ));

cstmt.clearParameters();

cstmt.registerOutParameter( 1 , Types.DATE);
cstmt.setDate( 2 ,  new  java.sql.Date(System.currentTimeMillis()));
cstmt.execute();
System.out.println(cstmt.getObject( 1 ));
Код: plaintext
1.
 2 
 2007 - 09 - 26 
ы?
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825013
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СэмкаЭто анонимный блок, в чистом JDBC используется конструкция { call <хранимая процедура> } и мне именно это и нужно. Могут быть, конечно, трудности с оверлоудингом, но без оного противовоказаний распарсить сразу нет. Ладно, придется использовать DatabaseMetaData.

Ну и что?
Любой вызов в конечном счете превращается либо в SQL, либо в анонимный PL/SQL блок. другого не дано.
С DatabaseMetadata.getProcedureColumns я думаю надо бы поосторожнее - обращается в all_arguments, в условиях почти везде используются like :x.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825109
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, я в курсе, с Oracle 13 лет, поэтому и представляю прекрасно, что не сделано это исключительно из лени :-). DBMS_SQL справлялся с этим прекрасно еще в Oracle 6 (думаю, даже раньше). "Лайки" не сильно страшны: при отсутствии спецсимволов они чудесно превращаются в "равно" еще до выполнения. Странная вообще штука: родной драйвер не делает того, что 3-d party. Абыдна, да?

Timm СэмкаЭто анонимный блок, в чистом JDBC используется конструкция { call <хранимая процедура> } и мне именно это и нужно. Могут быть, конечно, трудности с оверлоудингом, но без оного противовоказаний распарсить сразу нет. Ладно, придется использовать DatabaseMetaData.

Ну и что?
Любой вызов в конечном счете превращается либо в SQL, либо в анонимный PL/SQL блок. другого не дано.
С DatabaseMetadata.getProcedureColumns я думаю надо бы поосторожнее - обращается в all_arguments, в условиях почти везде используются like :x.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825158
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СэмкаСпасибо, я в курсе, с Oracle 13 лет, поэтому и представляю прекрасно, что не сделано это исключительно из лени :-).
Насчет параметров процедур - категорически не согласен. Это просто бессмысленно.
СэмкаDBMS_SQL справлялся с этим прекрасно еще в Oracle 6 (думаю, даже раньше)
Пример в студию, для такого вызова: begin :x:=:y+1; end;
СэмкаСтранная вообще штука: родной драйвер не делает того, что 3-d party. Абыдна, да?
Нисколько.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825342
Сэмка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Timm СэмкаСпасибо, я в курсе, с Oracle 13 лет, поэтому и представляю прекрасно, что не сделано это исключительно из лени :-).
Насчет параметров процедур - категорически не согласен. Это просто бессмысленно.
СэмкаDBMS_SQL справлялся с этим прекрасно еще в Oracle 6 (думаю, даже раньше)
Пример в студию, для такого вызова: begin :x:=:y+1; end;
СэмкаСтранная вообще штука: родной драйвер не делает того, что 3-d party. Абыдна, да?
Нисколько.

Ладно, с dbms_sql погорячился, давно не пользовался :-). Но где связь между параметрами процедур и связанными переменными анонимного блока ??? Последний компилируется перед выполнением, о нем ничего не известно и все параметры потенциально in out. Т.е. в моем случае это вообще не интересно.

То, что вызов конкретной хранимой процедуры превращается в выполнение произвольного анонимного блока - вопрос реализации. Я уже показал выше, что прояснить параметры для конкретной процедуры возможно, вопрос - какой ценой.

ЗЫ Бесмысленность - дело такое, на кой говорить, что следуешь спецификации, если что ни метод - то not implemented? Это вопрос не смысла, а качества продукта.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825470
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СэмкаНо где связь между параметрами процедур и связанными переменными анонимного блока ??? Последний компилируется перед выполнением, о нем ничего не известно и все параметры потенциально in out. Т.е. в моем случае это вообще не интересно.

Нет такого понятия как "вызов процедуры/функции". Есть понятие "выполнение анонимного блока PL/SQL". Потенциально он может быть любым, это раз; с учетом неявного преобразования типов и разной семантики выполнения, типы параметров процедур, вообще говоря, бесполезны, это два.
СэмкаЗЫ Бесмысленность - дело такое, на кой говорить, что следуешь спецификации, если что ни метод - то not implemented? Это вопрос не смысла, а качества продукта.
Нельзя создать "универсальную" спеку, всегда будут какие-то разногласия в имплементации, особенно в случае с базами данных.
PS. в каком драйвере-то реализовано? так и не понял.
...
Рейтинг: 0 / 0
В какой момент доступно ResultSetMetaData?
    #34825716
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm СэмкаНо где связь между параметрами процедур и связанными переменными анонимного блока ??? Последний компилируется перед выполнением, о нем ничего не известно и все параметры потенциально in out. Т.е. в моем случае это вообще не интересно.

Нет такого понятия как "вызов процедуры/функции". Есть понятие "выполнение анонимного блока PL/SQL". Потенциально он может быть любым, это раз; с учетом неявного преобразования типов и разной семантики выполнения, типы параметров процедур, вообще говоря, бесполезны, это два.
На самом деле так оно и есть. Любой call some_stored_proc(...) на самом деле это выполнение анонимного блока begin some_stored_proc(...); end; Более того, например в случае наличия перегруженных версий процедур как раз информация о типах bind-переменных позволяет определить какую именно версию процедуры вызывать. Т.е. даже парсинг анонимного блока в таком случае невозможен без информации о типах параметров.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / В какой момент доступно ResultSetMetaData?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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