powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вернуть массив в базу Oracle
25 сообщений из 29, страница 1 из 2
Вернуть массив в базу Oracle
    #39319313
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Необходимо из функции Java внедренной в базу Oracle вернуть массив Double

Знаю такие приемы
Вариант один
Код: plsql
1.
create or replace type NVARRAY as VARRAY(10) of number



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public static Array nvafunc(NUMBER id[], Array va[], Array va2) throws SQLException
{
    Connection conn = DriverManager.getConnection("jdbc:oracle:kprb:");
    Statement stmt = conn.createStatement();
    OraclePreparedStatement ps = (OraclePreparedStatement)
    conn.prepareStatement ("SELECT NVA FROM VarrayTab WHERE ID = ?");
    ps.setNUMBER (1, id[0]);
    OracleResultSet rs = (OracleResultSet) ps.executeQuery();
    Array a = null;
    while (rs.next())
    {
        a = (Array) rs.getObject(1);
    }
    ps.close();
    id[0] = new NUMBER(id[0].intValue() + 1000);
    va[0] = va2;
    return a;
}



Код: plsql
1.
2.
сreate or replace function nvafunc (x IN OUT number, y IN OUT NVARRAY, z IN NVARRAY) return NVARRAY
as language java name 'NVarrayClass.nvafunc(oracle.sql.NUMBER[], java.sql.Array[], java.sql.Array) return java.sql.Array';



В моем случае не совсем подходит - мне необходимо создать функцию в базе Oracle без внутренней связи с Oracle-ом
(архитектурные требования)
т.е строка Connection conn = DriverManager.getConnection("jdbc:oracle:kprb:"); - противоречит требованиям

Array arr = ((OracleConnection) conn).createArray("NVARRAY", new double[]{12d,15d});
или Array a = (Array) rs.getObject(1);
ссылаются на коннект к базе для считывания типа.

Вариант два - запись в строку через разделитель и создание массива в теле типа Oracle
вариант примитивен

Подскажите Ваши решения (буду признателен за пример)

Заранее благодарен !
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319372
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Вар3 - выкинуть массив, т.к массив в терминах субд это таблица из 1 колонки.
Так что вар2 или 3 решайте сами.
Вы бы еще json азяли или xml. Субд их тоже умеет.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319398
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_HВ моем случае не совсем подходит - мне необходимо создать функцию в базе Oracle без внутренней связи с Oracle-ом
(архитектурные требования)
т.е строка Connection conn = DriverManager.getConnection("jdbc:oracle:kprb:"); - противоречит требованиям

Строка правильная, а архитектурные требования неправильные. Значит, вас интересует как лучше сделать то, что лучше вообще не делать. Вам не нужны советы - сами сообразите.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319751
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MHOME_HВ моем случае не совсем подходит - мне необходимо создать функцию в базе Oracle без внутренней связи с Oracle-ом
(архитектурные требования)
т.е строка Connection conn = DriverManager.getConnection("jdbc:oracle:kprb:"); - противоречит требованиям

Строка правильная, а архитектурные требования неправильные. Значит, вас интересует как лучше сделать то, что лучше вообще не делать. Вам не нужны советы - сами сообразите.
Не уверен, что строка правильная. Т.к. это Stored процедура и хардкодинг имени базы/соединения выглядит странно. Я бы попытался использовать:

Код: plsql
1.
  Connection con = DriverManager.getConnection("jdbc:default:connection");



Взято из https://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures.html
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319846
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Не - не спасибо здесь все хорошо
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319854
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan Mа архитектурные требования неправильные


Это функция используется в базе,
эта функция используется с интерфейсом операционки Win

Операционка
Интерфейс приложения (окно для ввода) -> расчетная функция -> интерфейс визуализации результата
База
Пользовательский тип (конструктор типа) -> расчетная функция -> пользовательский тип распаковки массива

Обмен данных осуществляется через параметры функции
Ссылаться непосредственно из функции на базу возможно (через ключ)
на текущий момент так и реализовано, но это НЕ красиво.

Код: java
1.
2.
3.
	      if (_move!=null && mode==1) ((ArrayList<Move>) _move).add(new Move(span[i].intValue(),active_irr[i].doubleValue(),active_apr[i].doubleValue(),active_amo[i].doubleValue(),rest_dis[i].doubleValue(),rest_beg[i].doubleValue(),rest[i].doubleValue(),profil_remain[i].doubleValue(),profil_unpaid[i].doubleValue(),profil_amount[i].doubleValue(),rest_int[i].doubleValue()));
       }
       if (_mowe!=null && mode==1) _mowe[0] = ((OracleConnection) DriverManager.getConnection("jdbc:oracle:kprb:")).createStruct("RCMOVE", new Object[]{span,active_irr,active_apr,active_amo,rest_dis,rest_beg,rest,profil_remain,profil_unpaid,profil_amount,rest_int});



В комнату надо попадать через ДВЕРИ , можно если забыли ключи (или не знаете как сделать) влезать через окно
- но это не удобно ...

Если есть конкретные советы буду рад услышать
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319855
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HOME_X,
Вар3 - выкинуть массив, т.к массив в терминах субд это таблица из 1 колонки.
Так что вар2 или 3 решайте сами.
Вы бы еще json азяли или xml. Субд их тоже умеет.

Я работаю с базой соответственно вынужден использовать терминологию и механизмы базы
Если предложите что-то более конкретное буду рад
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319861
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X, я вообще не понимаю, что Вам и/или архитектору не нравится.

Фраза "без внутренней связи с Oracle-ом" подкупает своей загадочность IMHO

HOME_XLeonid Kudryavtsev,
Не - не спасибо здесь все хорошо

Что хорошо? Хардкодинг "kprb" в тексте функции? Я так подозреваю, это имя база.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319900
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Конкретнее некуда.
Таблицы для переменных, массивов, объектов и сетей.
Объекты и типы базы использовать только внутри базы.
Вместо массива зогонять циклом insert.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319906
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X на текущий момент так и реализовано, но это НЕ красиво.
чем не красиво?

IMHO Вполне нормально, что ф-ция вызывающаяся с клиентской JVM и из базы имеют разные параметры вызова.

Я бы сделал две функции. Одну - стандартная Java, втору - для вызова из БД. И просто, банально, вызывал бы первую из второй.

Тогда и бизнес логика (первая ф-ция) будет без Oracle-специфики, а Oracle-специфика будет закодирована во второй ф-ции (уже без бизнес-логики).

IMHO & AFAIK
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319963
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
imho
тебе надо подробнее показать БЛ и связку Java - Oracle.
Вопрос соединения 3 в одном флаконе - Java-БЛ-СУБД, не тривиальное занятие).
По классике нужно делать Модель, а не функции.
Тем более что твоё
авторфункцию в базе Oracle без внутренней связи с Oracle-ом
очень сложно понять.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39319973
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В соответствии с лучшими традициями разработки под Oracle, возвращать
нужно либо ORACLE cursor, либо Oracle pipelined function, либо Java (JDBC) ResultSet,
либо Java Collection, либо Java Iterator, но никак не массив.

Возвращать массив - позорно.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320340
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЧто хорошо? Хардкодинг "kprb" в тексте функции? Я так подозреваю, это имя база.


Нет, это одно из альт-х обращений - попробуйте у Вас тоже получиться
((OracleConnection) DriverManager.getConnection("jdbc:oracle:kprb:"))
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320355
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЯ бы сделал две функции. Одну - стандартная Java, втору - для вызова из БД.


Правильно говорите, но только это лишний этап, (типа перекодировщик для базы) который я
хотел избежать этого, подобная реализация есть в виде двух строк , они приведены в примере,

если moVe != Null - работает кодировщик для интерфейса, заполняется ((ArrayList<Move>) _move).
если moWe !=Null - работает кодировщик для базы , заполняется createStruct("RCMOVE")

Ваше предложение почти аналогичное - только через функцию

Хотел реализовать возврат массива общего для всех запусков
- обработка массива на стороне интерфейса - средствами JAVA
- обработка массива на стороне базы - средствами базы

Так более правильно
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320367
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HOME_X,
авторфункцию в базе Oracle без внутренней связи с Oracle-ом
очень сложно понять.


Может не внятно описал - извините.

Общение с базой происходит ТОЛЬКО через параметры функции
Входящие параметры IN, OUT, return параметр.

Вы сослались на модель - прошу уточнить на примере

Содержание функции достаточно сложное, но мне не хотелось усложнять
задачу лишними терминами, функции было вполне достаточно.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320380
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ соответствии с лучшими традициями разработки под Oracle, возвращать
нужно либо ORACLE cursor, либо Oracle pipelined function, либо Java (JDBC) ResultSet,
либо Java Collection, либо Java Iterator, но никак не массив.

Возвращать массив - позорно.

Нет вопросов уточните пожалуйста на примере
Мне необходимо вернуть данные которые в Oracle =Collection-y, отсюда массив java.sql.Array[]

Мне в Oracle надо видеть варианты

- Вариант (простой)
SC DAY IRR
123 10-10-2016 <Collection> = 10,20,30,40,50

- Вариант (с детализацией)
SC DAY IRR
123 10-10-2016 10
123 10-10-2016 20
123 10-10-2016 30
123 10-10-2016 40
123 10-10-2016 50

- Вариант (простой)
SC DAY IRR
123 10-10-2016 <Collection> = 10,20,30,40,50

- Вариант (с консолидацией)
SC DAY IRR
123 10-10-2016 150


Номер варианта выставляется ключом на уровне конструктора типа в Oracle
и обрабатывается на уровне типа Oracle
(пока вижу смутно, но детализация и консолидация просматривается четко)

Заранее благодарен !

Заранее благодарен !
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320414
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XОбщение с базой происходит ТОЛЬКО через параметры функции
т.е. все таблички не видны?
Но вы понимаете, что в Java это исключение из правил (CRUD)
HOME_XВы сослались на модель - прошу уточнить на примере
Модель - это доступ к данным, т.е. табличкам
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320419
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X- Вариант (с консолидацией)
её бывает делают в отдельной базе (OLAP-OLTP) либо запросом с агрегацией консолидацией.
Поэтому не понял вопроса.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320425
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123т.е. все таблички не видны?
Но вы понимаете, что в Java это исключение из правил (CRUD)
Модель - это доступ к данным, т.е. табличкам


Совершенно верно - таблицы не видны
Модель - термин понял.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320434
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XСовершенно верно - таблицы не видны
Тогда по факту ты написал API слой и БЛ на PL языке.
Это язык не ООП, поэтому сейчас трудности пристыковать его в Java.
Проект нетривиальный и индивидуальный. Какая уж тут архитектура.
Удачи!
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320445
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XНет, это одно из альт-х обращений - попробуйте у Вас тоже получиться
((OracleConnection) DriverManager.getConnection("jdbc:oracle:kprb:"))
Сейчас с Oracle не работаю, текущие проекты на PostgreSQL. Т.ч. смотрю только по доке.
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320485
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Хотел сказать что манипулируем параметром в конструкторе поль. типе Oracle
хотел бы получить выборки с одной записью и множеством записей

Ключ=1
SC DAY IRR
123 10-10-2016 <Collection>

Ключ=2 (детализирую поле IRR = <Collection> - вывожу весь массив созданный в JAVE)
SC DAY IRR
123 10-10-2016 10
123 10-10-2016 20
123 10-10-2016 30
123 10-10-2016 40
123 10-10-2016 50

Ключ = 3 (Суммирую весь массив созданный в JAVE)
SC DAY IRR
123 10-10-2016 150

Где i*power(10,i_n-1) = массив 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.
create or replace type MyType as object( i_n number
, member function okk return sys.odcinumberlist pipelined
);
/
 
Type created

create or replace type body MyType as
member function okk return sys.odcinumberlist pipelined is
  begin
    for i in 1..i_n loop
      pipe row (i*power(10,i_n-1));
    end loop;
    return;
  end;
end;
/
 
Type body created

with A as (select 1 F1,2 F2 from DUAL
            union all
           select 2 F1,3 F2 from DUAL)
select *
from A, table((MyType(A.F2)).okk()) t;
 
        F1         F2 COLUMN_VALUE
---------- ---------- ------------
         1          2           10
         1          2           20
         2          3          100
         2          3          200
         2          3          300
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320488
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HOME_XСовершенно верно - таблицы не видны
Тогда по факту ты написал API слой и БЛ на PL языке.
Это язык не ООП, поэтому сейчас трудности пристыковать его в Java.
Проект нетривиальный и индивидуальный. Какая уж тут архитектура.
Удачи!



Т.е. вариантов более нет ..........

Принято - спасибо
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320501
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XТ.е. вариантов более нет ..........
HOME_XКлюч = 3 (Суммирую весь массив созданный в JAVE)
а почему в Java не суммировать? Почему в СУБД?
...
Рейтинг: 0 / 0
Вернуть массив в базу Oracle
    #39320566
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123а почему в Java не суммировать? Почему в СУБД?


Это на растерзание пользователю ...
хочет так ключ=1
хочет эдак ключ=2

Насчет
Petro123Тогда по факту ты написал API слой и БЛ на PL языке

Согласен - я рассматриваю Java как "кроcсплатформу" и
хочу просто внедрить функцию на два приложения без излишеств


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


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