powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / jdbc, при получении данных меняется значение поля varchar2
25 сообщений из 27, страница 1 из 2
jdbc, при получении данных меняется значение поля varchar2
    #39276961
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
нужна помощь

выполняю sql запрос в БД oracle
через sqlplus и через pl/sql developer возвращается строка "0,04"
если выполняю тот же самый запрос через jdbc, то приходит ",04", при этом смотрю тип столбца - varchar2.
java код крутится на glassfish4, коннектиться к БД через него.

в чем может быть проблема?

пример кода java:
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup("jdbc/askd_cons_rpt");
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from table (test.test())");
resultSet.next();
String columnTypeName = resultSet.getMetaData().getColumnTypeName(1); //VARCHAR2
String val = resultSet.getString(1); //,04
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39276972
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой конкретно запрос? Если прямо в таблице тип колонки VARCHAR, то это предельно странно. Ноль может отрезаться при приведении числа к строке. А разное поведение может быть обусловлено локалью, например.

Лучше конкретизировать SQL запрос и спросить в форуме по БД Oracle.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277004
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, это выглядит логично.
но как с моей стороны это проверить? Админы говорят, что возвращается varchar2
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277008
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TivakДа, это выглядит логично.
но как с моей стороны это проверить? Админы говорят, что возвращается varchar2
Что именно вы хотите проверить? При чем тут вообще админы? Они вам SQL пишут?
Про то что "возвращается varchar2" вопроса нет. Вопрос в том откуда эти данные берутся и в какой момент приводятся к строке.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277027
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TivakResultSet resultSet = statement.executeQuery("select * from table (test.test())");
убери звёздочку.
Скорее всего где то невнимательность. Ищи.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277167
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по всему где-то на уровне БД происходит неявное преобразование, при этом это как-то зависит от клиента (или настроек на клиенте).
SQL скрипты пишу не я, но по утверждения SQL разработчика test.test() возвращает именно varchar2.

провел следующий эксперимент, поменял запрос на:
select '__'||val as val from table (test.test())
при этом в sqlplus приходит "__0,04"
а в jdbc приходит "__,04"
Таким образом исключаем вероятность преобразования значения в драйвере.

Если кто знает какая настройка может на это влиять, то напиши.

Но в целом вопрос с java снят. надо задавать вопрос в oracle sql форуме.
всем спасибо за помощь.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда автор знает что мы получаем varchar2

Это типичный запрос к табличной функции

Код: plsql
1.
select * from table (test.test())



И ее desc мы не видим.

Ну а тот забавный факт что мы получаем форматирование вещественного
числа можно пояснить тем что функция возвращает как-раз number
а мы (возможно) делаем кастинг в varchar2.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277179
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Скорее, у поля структуры, которая передается в pipe row, вместо number, тип varchar.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277184
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277192
it_andrei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо посмотреть, что внутри функции test.test(), которая возвращает коллекцию.
Там скорее всего коллекция float (number(x,x)).

А можно не смотреть и вместо
String val = resultSet.getString(1);
написать

String val = NumberFormat.getInstance(Locale.ENGLISH).format(resultSet.getFloat(1));

Если получится так, то виновата Locale по-умолчанию, которую изменили на клиенте. (Можно и другие Locale попробовать)
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277193
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonАвтор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]



Попробовать могу, но в рамках задачи это не имеет смысл. т.к. sql должен отдавать полностью отформатированные значения. А мы их должны просто выводить. Поэтому мы ожидаем от sql именно varchar.
но я конечно попробую ближе к вечеру.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277223
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tivak,

а попробуйте getObject() и посмотрите что это за тип.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277255
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GarrickTivak,

а попробуйте getObject() и посмотрите что это за тип.

Это пробовал. тип String
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277263
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В целом я выше написал. проблема не в том, что тип не тот приходит. А проблема в том, что в SQL число по разному форматируется при разных коннектах.
если подключаюсь через sqlPlus, что все ок, если через jdbc и glassfish, то все не так ок. при этом приходит строка. просто число отформатирована по другому.
На мой взгляд надо лезть в кишки sql кода и смотреть как там формируется строчка из числа. Может там станет более понятно почему форматирование меняется.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277284
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tivak, сделай еще пару выборок из табличек:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table fuckenVarcharTable(
  v varchar2(2000)
);

insert into fuckenVarcharTable select * from table (test.test());

commit;


create table fuckenNumberTable(
  v number(9,2)
);

insert into fuckenNumberTable select * from table (test.test());

commit;



И посмотри как форматируется число.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277508
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TivakВ целом я выше написал. проблема не в том, что тип не тот приходит. А проблема в том, что в SQL число по разному форматируется при разных коннектах.
Это не проблема. Это фича. Настройкой коннекта можно по разному просить по умолчанию делать многие вещи.
Например, одним отделять дробную часть числа одним людям запятой, а другим точкой.
Не нужно этого - делайте явное преобразование к той маске, которая нужна в рамках запроса.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277527
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое , что надо знать - это ddl таблицы, а потом уже всё остальное,
jdbc не делает преобразование типов.
если на входе число - на выходе будет число.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277532
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TivakmaytonАвтор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]



Попробовать могу, но в рамках задачи это не имеет смысл. т.к. sql должен отдавать полностью отформатированные значения. А мы их должны просто выводить. Поэтому мы ожидаем от sql именно varchar.
но я конечно попробую ближе к вечеру.
это имеет смысл для определения причины, чтоб не гадать на кофейной гуще.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277596
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевTivakВ целом я выше написал. проблема не в том, что тип не тот приходит. А проблема в том, что в SQL число по разному форматируется при разных коннектах.
Это не проблема. Это фича. Настройкой коннекта можно по разному просить по умолчанию делать многие вещи.
Например, одним отделять дробную часть числа одним людям запятой, а другим точкой.
Не нужно этого - делайте явное преобразование к той маске, которая нужна в рамках запроса.

А как этой фичей воспользоваться? Как передавать формат числа?
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277599
Tivak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяпервое , что надо знать - это ddl таблицы, а потом уже всё остальное,
jdbc не делает преобразование типов.
если на входе число - на выходе будет число.

А можно по подробнее? или ссылочку )
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277619
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TivakА как этой фичей воспользоваться?
сначала вот это
Код: java
1.
"select * from table (test.test())"


замените на что нибудь другое, с гарантированными типами и тестируйте.
А то из за ерундового вопроса на страницы топика пойдём.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277681
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tivakвадяпервое , что надо знать - это ddl таблицы, а потом уже всё остальное,
jdbc не делает преобразование типов.
если на входе число - на выходе будет число.

А можно по подробнее? или ссылочку )
сайты авторов jdbc?
выложи, для начала, ddl таблицы , чтоб было о чем говорить
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277718
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, говорил-же выше там нет таблицы. Там - табличная функция. Надо курить ее сорцы.

Пример:
https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm

По поводу JDBC. Он состоит из двух частей. Есть генерализованная часть которая входит
в состав JDK и представляет собой в основном набор абстрактных классов и интерфейсов.
Собственно это и есть стандарт JDBC.

В доке есть сведения но весьма сухие.

Например вот фрагмент сорцов по интерфейсу геттера который мы дергаем.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    /**
     * Retrieves the value of the designated column in the current row
     * of this <code>ResultSet</code> object as
     * a <code>String</code> in the Java programming language.
     *
     * @param columnIndex the first column is 1, the second is 2, ...
     * @return the column value; if the value is SQL <code>NULL</code>, the
     * value returned is <code>null</code>
     * @exception SQLException if the columnIndex is not valid;
     * if a database access error occurs or this method is
     *            called on a closed result set
     */
    String getString(int columnIndex) throws SQLException;


И есть вторая часть - проприетарная. От производителя. Наш
господин-ТС использует (скорее всего) oracle.jdbc.Driver.

Со второй частью сложнее. Она может иметь разные версии (ojdbc14,
ojdbc5, ojdbc6 e.t.c) и баги.
Кроме того есть имплементации под OCI (это просто переходник
к обычному нативному драйверу который просто должен быть как dll).

Но лучше всего начать с того что взять сорцы этой таб-функции
и переколбасить их на мок или прототип чтобы мы тут в форуме могли
чето детально проверить.
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277730
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonвадя, говорил-же выше там нет таблицы. Там - табличная функция. Надо курить ее сорцы.
да. Но в контексте топика неважно.
maytonНо лучше всего начать с того что взять сорцы этой таб-функции
и переколбасить их
Совершенно верно.
Прежде чем кивать на JDBC или копать JDBC нужно со входом разобраться.
Что он заведомо верный)).
...
Рейтинг: 0 / 0
jdbc, при получении данных меняется значение поля varchar2
    #39277952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123maytonвадя, говорил-же выше там нет таблицы. Там - табличная функция. Надо курить ее сорцы.
да. Но в контексте топика неважно.
maytonНо лучше всего начать с того что взять сорцы этой таб-функции
и переколбасить их
Совершенно верно.
Прежде чем кивать на JDBC или копать JDBC нужно со входом разобраться.
Что он заведомо верный)).
+100500
если табличная функция - то jdbc здесь однозначно не виноват
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / jdbc, при получении данных меняется значение поля varchar2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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