powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача Array в качестве параметра
7 сообщений из 32, страница 2 из 2
Передача Array в качестве параметра
    #39737218
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevРазделить код который хочется "код НЕ (!!!) только в базе" и код интерфейся/обертки для вызова из БД
Отделить код бизнес-логики от интерфейсов/обертки для его вызова из "специфических" мест


Если я верно Вас понял, необходимо создать спец. метода для общения с базой

Архитектура следующая

Запуск из Java приложения
- приложение -> конструктор класса -> Основной метод (Static)

Запуск из базы
- обертка PL/SQL -> метод Export (Static) -> Основной метод (Static)

Такая реализация существует.
Это не существенно, но в продукт. версии необходимо передать/принять порядка 60 параметров
для каждой функции, исходный код становиться "ТОЛСТЫМ" и неприятным.

Когда задавал вопрос, предполагал что писать/читать тип Array не проблематично, и это можно
решить простым циклом.

Спасибо за совет - обдумаю .....
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39737551
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто обычно, лично я, всегда начинаю с другого конца.

Бизнес логика + проверка/отладка в pure java проекте ==> подключение к работающей системе (сопряжение с СУБД)

Ранее на протяжении 10+ лет работал как low level программер для "помощи" коллегам которые приложения на FoxPro,Access,Oracle Forms etc...etc... делали. Соответственно залезать в бизнес-приложение предпочитал на самом последнем шаге. Или вообще не залезать. Сделал свой кусок на C / Java, отладил отдельно от бизнес-приложения, написал "обертку", а к кнопкам/меню и прочее - уже коллеги знающие бизнес-приложения подключают.

Это не существенно, но в продукт. версии необходимо передать/принять порядка 60 параметров
для каждой функции

IMHO 60 параметров, это жесть какая-то

Если это какие-то параметры одного-двух бизнес объектов, то оберните их в какой нибудь класс. Благо Oracle (другие СУБД такой возможности могут не иметь) вполне поддерживает сложные типы и, вроде (сам с этим плотно не работал) маппинг object типа в class java (JPublisher)

В приложении заполнили объект с 60 полями, в_функцию/из_функции его передаете единым целым

IMHO лично я бы как-то так делал

предполагал что писать/читать тип Array не проблематично

да, в принципе, может и можно... но лично мне такое решение бы не нравилось

ты не хочешь менять вызываемые ф-ции, но все равно нужно будет менять вызывающую ф-цию (вкорячивать туда поддержку самописных Array'ев) - т.е. чисто визуально, кол-во работы остается ровно таким-же. А код продолжает "толстеть и неприятнеть"

У тебя сейчас неприятный "основной метод" (60 параметров - это жесть), что бы его не переписывать, ты собираешся сделать неприятным "приложение Java". Т.е. толстость и неприятность в рамках всего проекта будет только возрастать.
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39738002
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovК примеру: http://tech.valgog.com/2009/02/passing-arrays-to-postgresql-database.html


Доброго дня Denis

Попытался реализовать Ваш пример.
Рекомендованный по ссылке класс взят в оригинале - спасибо работает нормально.
(в коде ниже взят набор переменных для комплексности и проверки работоспособности)

Код: 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.
package Analitic;

import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Array;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.jdbc.OracleConnection;
import oracle.sql.NUMBER;

public class Execute
{
  public static void Oracle(
                            Object              _this, 
                            String              _id_contract_sap[], 
                            NUMBER              _nbi[], 
                            Array               _span_row[],
                          //Array               _span_sms[]
                            PostgreSQLInt4Array _span_sms[]
                           ) 
  throws IOException, SQLException, ClassNotFoundException 
  {
    _nbi[0]                    = new NUMBER(new BigDecimal(120.56).doubleValue());
    BigDecimal span_row[]      = {new BigDecimal(120.00),new BigDecimal(130.00)};
    int        span_sms[]      = {220,230};
    PostgreSQLInt4Array list   = new PostgreSQLInt4Array(span_sms);
    _id_contract_sap[0]        = list.toString();
    if (_this == null) _span_row[0] = ((OracleConnection) DriverManager.getConnection("jdbc:default:connection")).createARRAY("FDNBI",span_row);
  //if (_this == null) _span_sms[0] = ((OracleConnection) DriverManager.getConnection("jdbc:default:connection")).createARRAY("FDNBI",span_sms);
    if (_this == null) _span_sms[0] = list;
  };
}



Здесь не совсем понял - как правильно привести классы PL/SQL (FDNBI = table of number) и Analitic.PostgreSQLInt4Array
Или момент приведения вложить в Java - коде ? Подскажите пожалуйста.
Код: 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.
34.
35.
36.
37.
38.
39.
40.
create or replace type fdNbi as table of number;
create or replace function fnMove(
                              my_this          in ref RCNBI,
                              id_contract_sap  in out Varchar2,
                              nbi              in out Number,
                              span_row         in out FDNBI,
                              span_sms         in out FDNBI
                                 ) return Varchar2 as
language java name 'Analitic.Execute.Oracle
                             (oracle.sql.REF,
                              java.lang.String[],
                              oracle.sql.NUMBER[],
                              java.sql.Array[],
                              Analitic.PostgreSQLInt4Array[]
                             ) return java.lang.String[]';
                             
begin
  declare
    s Varchar2(10);
    i integer:=10;
    id_contract_sap  Varchar2(14):='0123456789';
    nbi              Number;
    tbspan_row       fdNbi;
    tbspan_sms       fdNbi;
  begin
             s:= fnMove(null,
                        id_contract_sap,
                        nbi,
                        tbspan_row,
                        tbspan_sms
                       );
    dbms_output.put_line(id_contract_sap);
    dbms_output.put_line(nbi);
    dbms_output.put_line(tbspan_row(1));
    dbms_output.put_line(tbspan_row(2));
    dbms_output.put_line(tbspan_sms(1));
    dbms_output.put_line(tbspan_sms(2));
  end;  

end; 
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39738979
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X, т.е. ты хочешь написать метод java-класса, который будет принимать параметр типа java.sql.Array, причем класс должен работать как вне базы, так и загруженным в нее?
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39739001
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovHOME_X, т.е. ты хочешь написать метод java-класса, который будет принимать параметр типа java.sql.Array, причем класс должен работать как вне базы, так и загруженным в нее?

Вы правильно поняли.
Разбор класса Array должен осуществляться на уровне инициирующих запуск приложений.
Ну так хотелось бы. java.sql.Array - насколько понял совместим с "table of number" и проблем не было
Вероятно надо описать в PL/SQL пользовательский тип связанный с java - классом
Сейчас буду пробывать.
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39739193
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XНу так хотелось бы. java.sql.Array - насколько понял совместим с "table of number" и проблем не было
Боюсь, не пройдет. Все примеры возврата Array из хранимой java-процедуры требуют привязки в оракловому объектному типу.
...
Рейтинг: 0 / 0
Передача Array в качестве параметра
    #39744168
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popovпривязки в оракловому объектному типу.


Да, уместно предположить что в момент createOracleArray идет считывание длины типа
Array array = con.createOracleArray("SYS.ODCINUMBERLIST", intValues);
так как это польз. тип и может иметь разную длину.
В моем случае тип фиксирован = oracle.sql.NUMBER (table of number)

Возможно ли создать тип искусственно (или "замерять" длину "table of number")
и привести его к (ARRAY)
Или как-то "подсмотреть"/декомпилировать содержание процедуры createOracleArray

Или это фантазия ..?
Спасибо
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача Array в качестве параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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