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

выполняю 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
20.07.2016, 12:06
    #39276972
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
Какой конкретно запрос? Если прямо в таблице тип колонки VARCHAR, то это предельно странно. Ноль может отрезаться при приведении числа к строке. А разное поведение может быть обусловлено локалью, например.

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

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

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

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

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

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



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

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

Скорее, у поля структуры, которая передается в pipe row, вместо number, тип varchar.
...
Рейтинг: 0 / 0
20.07.2016, 15:58
    #39277184
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
Автор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]
...
Рейтинг: 0 / 0
20.07.2016, 16:13
    #39277192
it_andrei
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
Надо посмотреть, что внутри функции 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
20.07.2016, 16:13
    #39277193
Tivak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
maytonАвтор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]



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

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

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

Это пробовал. тип String
...
Рейтинг: 0 / 0
20.07.2016, 17:36
    #39277263
Tivak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
В целом я выше написал. проблема не в том, что тип не тот приходит. А проблема в том, что в SQL число по разному форматируется при разных коннектах.
если подключаюсь через sqlPlus, что все ок, если через jdbc и glassfish, то все не так ок. при этом приходит строка. просто число отформатирована по другому.
На мой взгляд надо лезть в кишки sql кода и смотреть как там формируется строчка из числа. Может там станет более понятно почему форматирование меняется.
...
Рейтинг: 0 / 0
20.07.2016, 18:00
    #39277284
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
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
21.07.2016, 09:15
    #39277508
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
TivakВ целом я выше написал. проблема не в том, что тип не тот приходит. А проблема в том, что в SQL число по разному форматируется при разных коннектах.
Это не проблема. Это фича. Настройкой коннекта можно по разному просить по умолчанию делать многие вещи.
Например, одним отделять дробную часть числа одним людям запятой, а другим точкой.
Не нужно этого - делайте явное преобразование к той маске, которая нужна в рамках запроса.
...
Рейтинг: 0 / 0
21.07.2016, 09:38
    #39277527
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
первое , что надо знать - это ddl таблицы, а потом уже всё остальное,
jdbc не делает преобразование типов.
если на входе число - на выходе будет число.
...
Рейтинг: 0 / 0
21.07.2016, 09:41
    #39277532
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jdbc, при получении данных меняется значение поля varchar2
TivakmaytonАвтор а попробуй
Код: java
1.
NUMBER val = resultSet.getNUMBER(1); //,04[/quot]



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

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

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


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

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

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


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