Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / java ARRAY -> oracle / 25 сообщений из 26, страница 1 из 2
30.06.2015, 13:40
    #38995941
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Требуется помощь зала...
Прочитал все здесь по этой теме.
Но ответа на свою проблему не нашел.

Есть два экземпляра oracle 10.2.0.5
На одном все работает как часы.
На другом кроме Date все остальные значения на стороне базы получаю как null....

java 7 .79 тонкий драйвер оракла ojdbc6.jar от oracle 11.2

Использовал варианты передачи
- набор одноразмерных массивов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
         create TYPE T_Date as table of date;
         create TYPE T_Number as table of number;
         create TYPE T_VCH2_100 as table of VARCHAR2(100);

CREATE OR REPLACE procedure load_file_full (
        --
        a_MSISDN              in  T_VCH2_100,
        a_MNC                   in T_VCH2_100,
        a_OperatorID          in  T_VCH2_100,
        a_RegionID             in T_VCH2_100,
        a_RN                    in  T_VCH2_100,
        a_PortDate            in  T_Date
    ) 
...



пытался через объекты (структуры)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  CREATE OR REPLACE TYPE T_MNPTRANSFER_FULL as object (
     MSISDN      VARCHAR2(22),
     MNC         VARCHAR2(10),
     OPERATORID  VARCHAR2(200),
     RN          VARCHAR2(10),
     REGIONID    VARCHAR2(10),
     PORTDATE    DATE
);
CREATE OR REPLACE TYPE TT_MNPTRANSFER_FULL as table of T_MNPTRANSFER_FULL;

CREATE OR REPLACE procedure load_file_full_o (
        --
        tbl_full                  in TT_MNPTRANSFER_FULL
    )
    ....



пытался и через VARRAY

результат один - на одном сервере все OK на втором кроме дат все остальное = null.

основные части java-кода

для варианта через одноразмерные массивы
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
            String[]            a_MSISDN        = new String[size];
            String[]            a_MNC           = new String[size];
            String[]            a_OperatorID    = new String[size];
            String[]            a_RegionID      = new String[size];
            String[]            a_RN            = new String[size];
            Timestamp[]         a_PortDate     = new Timestamp[size];

            int i = -1;
            for (Item object : items) {
                i++;
                a_MSISDN[i]     = object.MSISDN;
                a_MNC[i]        = object.MNC;
                a_OperatorID[i] = object.OperatorID;
                a_RegionID[i]   = object.RegionID;
                a_RN[i]         = object.RN;
                a_PortDate[i]   = new Timestamp(object.PortDate.getTime());
            }

            ARRAY aa_MSISDN         = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_VCH2_100",a_MSISDN);
            ARRAY aa_MNC            = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_VCH2_100",a_MNC);
            ARRAY aa_OperatorID     = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_VCH2_100",a_OperatorID);
            ARRAY aa_RegionID       = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_VCH2_100",a_RegionID);
            ARRAY aa_RN             = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_VCH2_100",a_RN);
            ARRAY aa_PortDate      = ((oracle.jdbc.OracleConnection)cn).createARRAY("T_DATE",a_PortDate);

            String sql_write_tmp = "begin load_file_full(?,?,?,?,?,?); end;";
            cs = cn.prepareCall(sql_write_tmp);

            ((OracleCallableStatement)cs).setARRAY(1,aa_MSISDN);
            ((OracleCallableStatement)cs).setARRAY(2,aa_MNC);
            ((OracleCallableStatement)cs).setARRAY(3,aa_OperatorID);
            ((OracleCallableStatement)cs).setARRAY(4,aa_RegionID);
            ((OracleCallableStatement)cs).setARRAY(5,aa_RN);
            ((OracleCallableStatement)cs).setARRAY(6,aa_PortDate);

            cs.execute();



для варианта через массивы объектов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
        StructDescriptor structDesc = null;
        ArrayDescriptor arrayDesc = null;
        structDesc = StructDescriptor.createDescriptor("T_MNPTRANSFER_FULL", cn);
        arrayDesc = ArrayDescriptor.createDescriptor("TT_MNPTRANSFER_FULL", cn);

        ArrayList pArrayList = new ArrayList();

        Object[] pRecord = new Object[6];
        for (Item object : items) {
            pRecord[0]      = object.MSISDN;
            pRecord[1]      = object.MNC;
            pRecord[2]      = object.OperatorID;
            pRecord[3]      = object.RN;
            pRecord[4]      = object.RegionID;
            pRecord[5]      = new Timestamp(object.PortDate.getTime());
            pArrayList.add(new STRUCT(structDesc, cn, pRecord));
        }
        ARRAY pARRAY = new ARRAY(arrayDesc, cn, pArrayList.toArray());
        String sql_write_tmp = "begin load_file_full_o(?); end;";
        CallableStatement cs = null;

        try{
            cs = cn.prepareCall(sql_write_tmp);
            ((OracleCallableStatement)cs).setARRAY(1,pARRAY);
            cs.execute();
        }finally {
            DBHelper.release(cs);
        }



вариант для varray аналогичен варианту с одноразмерными массивами, только в оракловую процедуру передаю еще один праметр - кол-во заполненных элементов. т.ч. я этот вариант здесь не привожу...

допускаю, что дело не в самих массивах, а в чем то еще.
Куда копать ?
...
Рейтинг: 0 / 0
30.06.2015, 14:01
    #38995969
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
добавлю, чтобы не было сомнений - через обычный insert все работает. т.ч. данные посылаются не null.
...
Рейтинг: 0 / 0
30.06.2015, 14:42
    #38996014
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65Есть два экземпляра oracle 10.2.0.5
На одном все работает как часы.


Дело в конфе второго экземпляра Оракла?
...
Рейтинг: 0 / 0
30.06.2015, 15:15
    #38996047
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Позволю себе предположить, что, может быть, дело в VARCHAR2 и в размерности, которая указывается либо в byte, либо в char, и в параметре NLS_LENGTH_SEMANTICS, который меняет the default behavior from BYTE to CHAR. Может, поэтому текст не помещается и остается null.
...
Рейтинг: 0 / 0
30.06.2015, 15:18
    #38996053
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
там, где помещается, char
а где не помешается byte
...
Рейтинг: 0 / 0
30.06.2015, 16:14
    #38996120
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Видимо, не в этом дело. MSISDN и MNC - это точно цифры.
...
Рейтинг: 0 / 0
30.06.2015, 16:37
    #38996139
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Похоже я это уже где-то видел:

http://www.sql.ru/forum/1074235/oracle-plsql-vozvrat-table-of?hl=java array
...
Рейтинг: 0 / 0
30.06.2015, 17:17
    #38996187
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Наверное, надо взять какого-нибудь другого клиента (например, PL/SQL Developer) и потестировать хранимку, если есть подозрения, что дело не в сервере, а в клиенте.
Хотя автор темы пишет, что с его клиентом один сервер работает, а другой - нет. И что insert, как я поняла, в обоих случаях срабатывает нормально.
...
Рейтинг: 0 / 0
30.06.2015, 19:21
    #38996314
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
там все либо цифры либо латиница ...
и опять таки.. да простой insert работает ...
...
Рейтинг: 0 / 0
30.06.2015, 19:25
    #38996316
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65, сама хранимка рабочая? Без Java кода. С любым сервером работает?
...
Рейтинг: 0 / 0
30.06.2015, 19:26
    #38996318
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Leonid KudryavtsevПохоже я это уже где-то видел:

http://www.sql.ru/forum/1074235/oracle-plsql-vozvrat-table-of?hl=java array
...
Рейтинг: 0 / 0
30.06.2015, 19:31
    #38996322
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65Leonid KudryavtsevПохоже я это уже где-то видел:

http://www.sql.ru/forum/1074235/oracle-plsql-vozvrat-table-of?hl=java array

промахнулся ...
Леонид,
в ветке, на которую ты отправляешь проблема с кодировкой..
Данные там передавались.
У меня же передаются не null, а приходят null...
Все, кроме даты.

В другом наборе есть и number. Но тоже приходит null.
...
Рейтинг: 0 / 0
30.06.2015, 19:46
    #38996332
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
yelenaIgor-65, сама хранимка рабочая? Без Java кода. С любым сервером работает?

Лена, я не понял вопроса.

Если речь о процедуре, то проверка на null сразу дает exception на "плохом" сервере.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE OR REPLACE procedure load_file_full (
        --
        a_MSISDN              in  T_VCH2_100,
        a_MNC                 in  T_VCH2_100,
        a_OperatorID          in  T_VCH2_100,
        a_RegionID            in  T_VCH2_100,
        a_RN                  in  T_VCH2_100,
        a_PortDate            in  T_Date
    )
    is
    begin
       if (a_MSISDN.count > 0) then  
          
           if a_MSISDN(1) is null then
              raise_application_error(-20001,'NULL !!!');
           end if;

               forall    i   in    a_MSISDN.first .. a_MSISDN.last
                  insert /* APPEND */ 
                  into TMP_MNPTRANSFER_FULL
                  (MSISDN, MNC, OPERATORID, REGIONID, RN, PortDate)
                  values
                  (
                        a_MSISDN(i),
                        a_MNC(i),
                        a_OperatorID(i),
                        a_RegionID(i),
                        a_RN(i),
                        a_PortDate(i)
                  )
                  ;
       end if;
    end;



все остальное на этом сервере работает замечательно.
все, что писано на c с использованием proc c (загрузка данных) c использованием массивов работает нормально.
передача коллекций между процедурами внурти данного "плохого" инстанса также работает номально.
...
Рейтинг: 0 / 0
30.06.2015, 19:53
    #38996336
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65, а я не понимаю, почему вы меня не понимаете. Обычно, прежде чем обращаться к хранимке из своего Java кода, хранимку тестируют в среде, в которой она разрабатывалась. Вот хоть PL/SQL Developer не на Java написан. Я хочу понять, где проблема. Если с этого клиента запрос дойдет до хранимки на любом сервере и нормально выполнится, то проблема клиента, написанного на Java.
Тогда можно взять другого клиента - SQL Developer - он написан на Java. И если из него запрос дойдет до хранимки и нормально выполнится, то проблема уже у вашего клиента и что-то с драйвером.

Так понятнее?
...
Рейтинг: 0 / 0
30.06.2015, 22:31
    #38996390
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65,

Leonid дал возможно решение,так orai18n.jar есть в classpath?
...
Рейтинг: 0 / 0
01.07.2015, 01:15
    #38996428
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
0FDIgor-65,

Leonid дал возможно решение,так orai18n.jar есть в classpath?

я использую дрова от 11. смотри первое письмо.
...
Рейтинг: 0 / 0
01.07.2015, 01:31
    #38996433
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
yelenaIgor-65, а я не понимаю, почему вы меня не понимаете. Обычно, прежде чем обращаться к хранимке из своего Java кода, хранимку тестируют в среде, в которой она разрабатывалась. Вот хоть PL/SQL Developer не на Java написан. Я хочу понять, где проблема. Если с этого клиента запрос дойдет до хранимки на любом сервере и нормально выполнится, то проблема клиента, написанного на Java.
Тогда можно взять другого клиента - SQL Developer - он написан на Java. И если из него запрос дойдет до хранимки и нормально выполнится, то проблема уже у вашего клиента и что-то с драйвером.

Так понятнее?

сейчас буду что-то придумывать.. в качестве клиента выступает солярка... и на другом сервере только один инстанс базы.

доп инфа: я дезинформировал. number передается нормально.
осталась проблема с varchar2.

причем, при использовании в качестве клиента другой сервер и java 6 (7-ка там не уживается) результат аналогичен.
...
Рейтинг: 0 / 0
01.07.2015, 08:51
    #38996489
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-650FDIgor-65,

Leonid дал возможно решение,так orai18n.jar есть в classpath?

я использую дрова от 11. смотри первое письмо.

А что значит: я использую дрова от 11? Это только ojdbc6.jar или ojdbc6.jar и orai18n.jar всегда? Где у вас написано?
Так orai18n.jar есть в classpath?
...
Рейтинг: 0 / 0
01.07.2015, 09:26
    #38996514
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65Есть два экземпляра oracle 10.2.0.5

А Oracle прям Oracle Database или Oracle XE?
А на втором сервере точно нет другой процедуры с таким же именем?
...
Рейтинг: 0 / 0
01.07.2015, 15:48
    #38997002
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
0FDIgor-65пропущено...


я использую дрова от 11. смотри первое письмо.

А что значит: я использую дрова от 11? Это только ojdbc6.jar или ojdbc6.jar и orai18n.jar всегда? Где у вас написано?
Так orai18n.jar есть в classpath?

а есть ли orai18n.jar в составе библиотек 11 клиента ?
...
Рейтинг: 0 / 0
01.07.2015, 15:55
    #38997007
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
...
Рейтинг: 0 / 0
01.07.2015, 16:18
    #38997035
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
Igor-65,

или в jlib клиента oracle
...
Рейтинг: 0 / 0
01.07.2015, 16:20
    #38997039
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
GarrickIgor-65Есть два экземпляра oracle 10.2.0.5

А Oracle прям Oracle Database или Oracle XE?
А на втором сервере точно нет другой процедуры с таким же именем?

"прям Oracle Database"
нет другой процедуры
...
Рейтинг: 0 / 0
02.07.2015, 12:01
    #38997662
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
yelenaIgor-65, http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html

:) вот где собака порылась... странно, что эту jar-ку в установленном у меня клиенте я нашел в /jlib а не в /jdbc
считал, что это "спрятано" в ojdbc6.jar.

когда использовал клиента от 10-ки и ниже - то это все лежало, вроде в /jdbc. Но могу и ошибаться..

Лена, спасибо !
0FD : мои извинения !

Вечером попробую подцепить...
...
Рейтинг: 0 / 0
02.07.2015, 12:45
    #38997749
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
java ARRAY -> oracle
почитал внимательней по поводу orai18n.jar
" It contains classes for NLS support in Oracle Object and Collection types."
тогда не удивительно, что не проходило...
Вечером проверю. Но уже уверен, что все будет в порядке :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / java ARRAY -> oracle / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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