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

Имею Java класс
Код: javascript
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
create or replace and resolve java source named Address as 
import java.sql.*;
import java.oi.*;
import java.util.Date;
import oracle.sql.*;
public class Address implements SQLData {

  String sql_type = "address";
  public String street;
  public String city;
  public String total;
  
  public Address()
  {
  }

  public Address(String sql_type,String street,String city)
  {
    this.sql_type = sql_type;
    this.street   = street  ;
    this.city     = city    ;
  }
  
  public String getSQLTypeName() 
  throws SQLException 
  {
    return sql_type;
  }
  
  public void readSQL(SQLInput stream, String typeName) 
  throws SQLException 
  {
    sql_type = typeName;
    SQLInput istream = (SQLInput) stream;
    street = istream.readString();
    city   = istream.readString();
  }

  public void writeSQL(SQLOutput stream) 
  throws SQLException 
  {
    SQLOutput ostream = (SQLOutput) stream;
    ostream.writeString(street);
    ostream.writeString(city);
  }

  public void exeCalc()
  {
    this.total=this.city+' '+this.street;
  }

  public String getExecute(String execute)
  {
    exeCalc();
    return execute;
  }

  public String getTotal(String pref)
  {
    exeCalc();
    return pref+'_'+this.total;
  }
  
  public String getCity(String pref)
  {
    return pref+'_'+this.total;
  }

}



Имею подключение к типу Oracle и заполнение данными
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create or replace type Address as object
       external name 'Address' language java
       using sqldata (
                      street varchar2(100) external name 'street',
                      city   varchar2(100) external name 'city',
                      static function create_address(street varchar,city varchar) return Address
                      external name 'create (java.lang.String, java.lang.String) return Address',
                      static function construct (street varchar,city varchar) return Address
                      external name 'create (java.lang.String, java.lang.String) return Address',
                      member function GetExecute(s varchar) return varchar2
                      external name 'getExecute(java.lang.String) return java.lang.String',
                      member function GetCity(s varchar) return varchar2
                      external name 'getCity(java.lang.String) return java.lang.String',
                      member function GetTotal(s varchar) return varchar2
                      external name 'getTotal(java.lang.String) return java.lang.String'
                     );
drop table ADDRESSLIST;
create table ADDRESSLIST (id number,ad address);
insert into ADDRESSLIST values (10,ADDRESS('1vvv','1fhhff')) ;
insert into ADDRESSLIST values (20,ADDRESS('2vvv','2fhhff')) ;
insert into ADDRESSLIST values (30,ADDRESS('3vvv','3fhhff')) ;
insert into ADDRESSLIST values (40,ADDRESS('4vvv','4fhhff')) ;
commit;



Выполнение
Код: plsql
1.
2.
3.
4.
5.
select t.*,
       t.ad.GetExecute('execute') f0,
       t.ad.GetTotal(t.ad.city)   f1,
       t.ad.GetCity('ggg')        f2 
  from ADDRESSLIST t



Результат в виде
Код: plsql
1.
2.
3.
4.
5.
6.
 
ID	AD.STREET	AD.CITY	F0	F1	F2
10	1vvv	3fhhff	execute	3fhhff_3fhhff 1vvv	ggg_null
20	2vvv	3fhhff	execute	3fhhff_3fhhff 2vvv	ggg_null
30	3vvv	3fhhff	execute	3fhhff_3fhhff 3vvv	ggg_null
40	4vvv	3fhhff	execute	3fhhff_3fhhff 4vvv	ggg_null


Вопрос следующий - при выполнении процедуры t.ad.GetExecute('execute')
результат должен зафиксироваться
Результат это this.total=this.city+' '+this.street; (в продуктиве расчет большой и сложный)

И просто визуализироваться при следующих вызовах - это t.ad.GetCity('ggg')
В случае с t.ad.GetTotal(t.ad.city) - делаю принуд. вызов exeCalc()

Подскажите как правильно организовать Java класс и осуществить подключение к типу
Oracle

Заранее благодарен !
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261311
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X....
при выполнении процедуры t.ad.GetExecute('execute')
результат должен зафиксироваться
Результат это this.total=this.city+' '+this.street; (в продуктиве расчет большой и сложный)

И просто визуализироваться при следующих вызовах
....

Одно из двух
1) или я совершенно не понял, что Вы написали
2. или Вы совершенно не понимаете разницу между SQL командами SELECT и UPDATE

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

Попытаться сделать метод execute который будет возвращать _ОБЪЕКТ_ во вложенном запросе, а уже во внешнем запросе, брать из него поля. Не знаю, можно ли так сделать. Но я бы в этом направлении думал. Т.е. как-то так:

SELECT t.obj.getField1(), t.obj.getField2() .... FROM (SELECT execute( tt...) as obj FROM tt ) t

IMHO
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261344
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

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

Вы правы все это можно сделать SQL, но архитектурно мне нужна именно java реализация
(java - библиотека используется в других сервисах)
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261356
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601HOME_X,
Смотрите как использовать MEMBER FUNCTION в объектах.


Может такая декларация не очень нужна....

Суть задачи
Взять фиксир. ОБЯЗАТ. набор полей обработать JAVA классом вернуть эти поля
+ набор НЕ ОБЯЗАТ. результат. полей, которые должны в запросе вызываться
по требованию

Т.е. выполненный скаляр (совет - Leonid Kudryavtsev),
не совсем понимаю как осуществить возврат такого набора, и как заставить
просчитать итог в классе.
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261368
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВзять фиксир. ОБЯЗАТ. набор полей обработать JAVA классом вернуть эти поля


В джаве класс не обрабатывает, это делают методы класса.


Все обычно, по tutorial :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Hello
{
  public static String you(String name)
  {
    return "Hello "+name;
  }
}


 CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2 AS
   LANGUAGE JAVA NAME 'Hello.you (java.lang.String) return java.lang.String';
    

SELECT hello('world') , hello('HOME_X')  from dual;
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261385
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XВзять фиксир. ОБЯЗАТ. набор полей

Один (первый) тип/объект/класс Oracle

HOME_Xобработать JAVA

Просто функция или метод

HOME_Xвернуть эти поля + набор НЕ ОБЯЗАТ. результат. полей, которые должны в запросе вызываться по требованию


Другой (второй) тип/объект/класс Oracle

HOME_Xне совсем понимаю как осуществить возврат такого набора, и как заставить
просчитать итог в классе.
Для PL/SQL
1. Возвращать тип/объект/класс Oracle
2, Pipelined function

Для Java:
1. Дока https://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm в разделе Mapping Data Types уверяет, что Вы вполне можете передавать в Java-функцию Oracle Object. Т.е. проблем нет
2. Вроде только на PL/SQL
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261403
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Hello
{
  public static String you(String name)
  {
    return "Hello "+name;
  }
}


 CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2 AS
   LANGUAGE JAVA NAME 'Hello.you (java.lang.String) return java.lang.String';
    

SELECT hello('world') , hello('HOME_X')  from dual;

[/quot]

Такая реализация мне известна, а как вернуть несколько значений ?
И как их представить в виде поля запроса (!!! не PL/SQL процедура !!!)
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261406
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevДля Java:
1. Дока https://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm в разделе Mapping Data Types уверяет, что Вы вполне

Если посмотрите на первоначальный код, он аналогичен доке.
Только где-то что-то упустил.... не могу понять
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261407
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Hello
{
  public static String you(String name)
  {
    return "Hello "+name;
  }
}


 CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2 AS
   LANGUAGE JAVA NAME 'Hello.you (java.lang.String) return java.lang.String';
    

SELECT hello('world') , hello('HOME_X')  from dual;



Такая реализация мне известна, а как вернуть несколько значений ?
И как их представить в виде поля запроса (!!! не PL/SQL процедура !!!)[/quot]

Ну смотря что джава метод возвращает, если basic datatype то как показано выше, если тип - то принимаешь тип.
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261410
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601Ну смотря что джава метод возвращает, если basic datatype то как показано выше, если тип - то принимаешь тип.



Мне бы хотелось получить следующей результат

select A.*,
MyType(A.F1,A.F2).F3 -- здесь мой Java код, но код должен выполниться один
MyType(A.F1,A.F2).F4 -- раз (расчет замороченный), а возврат полей класса,
MyType(A.F1,A.F2).F5 -- по желанию пользователя - одно поле или 25 полей
..............................
MyType(A.F1,A.F2).F25
from (select 'A' F1
10 F2
from DUAL -- здесь сделал набивку параметров
) A

Можите подправить первоначальный пример, (где я пролажал)
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261411
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Мне бы хотелось получить следующей результат

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select A.*,
         MyType(A.F1,A.F2).F3               -- здесь мой Java код, но код должен выполниться один 
         MyType(A.F1,A.F2).F4               -- раз (расчет замороченный), а возврат полей класса, 
         MyType(A.F1,A.F2).F5               -- по желанию пользователя - одно поле или 25 полей
         ..............................
         MyType(A.F1,A.F2).F25 
 from (select 'A' F1
                   10 F2
            from DUAL -- здесь сделал набивку параметров
         ) A



Можите подправить первоначальный пример, (где я пролажал)
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39261434
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XHOME_X,

Мне бы хотелось получить следующей результат

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select A.*,
         MyType(A.F1,A.F2).F3               -- здесь мой Java код, но код должен выполниться один 
         MyType(A.F1,A.F2).F4               -- раз (расчет замороченный), а возврат полей класса, 
         MyType(A.F1,A.F2).F5               -- по желанию пользователя - одно поле или 25 полей
         ..............................
         MyType(A.F1,A.F2).F25 
 from (select 'A' F1
                   10 F2
            from DUAL -- здесь сделал набивку параметров
         ) A



Можите подправить первоначальный пример, (где я пролажал)

Не думаю, что можно сначало вызвать конструктор на эти параметры, а потом еще и получить какие то результаты через getXX.

Как вариант можно передать параметры в метод getXX и

Код: java
1.
2.
3.
4.
 
    this.sql_type = sql_type;
    this.street   = street  ;
    this.city     = city    ;



Т.е. сделать тоже самое что и в конструкторе, а потом уже основные калькуляции. Но вообще велосипедно. Для начало поймите какое место Java занимает в Oracle (methods calls). А то может следующая тема будет как сделать DI в java class из бд Oracle :)
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39262077
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ora601]
Код: java
1.
2.
3.
4.
 
    this.sql_type = sql_type;
    this.street   = street  ;
    this.city     = city    ;



Как вариант - приемлемо

Хотелось бы выдержать условие единоразовое выполнение типа (скаляр) и потом вызов отдельных полей

Типа так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select F1,
         F2.City F3
         F2.Street F4 
    from (select 'AA' F1,
                       (select Address().Calculate('London','BS-125 B')
                          from DUAL
                       ) F2
               from DUAL
            )



1. Пустой конструктор (для упрощения вызова)
2. Описание полей без их участия в конструкторе

Как правильно описать тип в Oracle при этих пунктах ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace type Address as object
       external name 'Address' language java
       using sqldata (
                      blank varchar2(100) external name 'blank',  -- не должен участвовать в конструкторе
--                    static function  AAA varchar2(100) external variable name 'city', ??????!!!!!! не подключается  на Public static String S="gg"
                      constructor function Address(blank varchar2,city varchar2) return self as result
                             external name 'Address(java.lang.String,java.lang.String,java.lang.String) return Address',
--                      static function create_address return Address
--                             external name 'create() return Address',
--                      static function construct return Address
--                             external name 'create() return Address',
--                      static function create_address (blank varchar2) return Address
--                             external name 'create(java.lang.String) return Address',
--                      static function construct (blank varchar2) return Address
--                             external name 'create(java.lang.String) return Address',
                      member function Calculate (city varchar2,street varchar2) return Address
                             external name 'Calculate(java.lang.String,java.lang.String) return Address'
                     )



Можите подсказать ?
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39262096
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XМожитеЕсли нужен вызов одного метода, незачем его реализовывать как метод объекта, создаваемого конструктором. Статический метод класса опубликованный как функция.
И, чем сношать туда-сюда параметры по каждой строчке, эффективнее может быть передать массив и отпипелинить результат обратно.
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39262119
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-и отпипелинить результат


Вот этот момент мне не очень нравится, с остальным согласен
Чем можно заменить pipelined ?
...
Рейтинг: 0 / 0
Подключение Java класса в типу Oracle
    #39262211
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Решение следующее

Java - class
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
create or replace and compile java source named address as
import java.sql.*;
import java.oi.*;
import java.util.Date;
import oracle.sql.*;

public class Address implements SQLData {

  String sql_type = "address";
  public String city;
  public String street;
  public String total;

  public Address()
  {

  }

  public Address(String sql_type)
  {
    this.sql_type = sql_type;
  }
  
  public Address Calculate(String city,String street)
  {
    this.city   = "Java class "+city;
    this.street = "Java class "+street;
    this.total  = "Java class "+city+"_"+street;
    return this;
  }

  public String getSQLTypeName() 
  throws SQLException 
  {
    return sql_type;
  }
  
  public void readSQL(SQLInput stream, String typeName) 
  throws SQLException 
  {
    sql_type = typeName;
    SQLInput istream = (SQLInput) stream;
    city   = istream.readString();
    street = istream.readString();
    total  = istream.readString();
  }

  public void writeSQL(SQLOutput stream) 
  throws SQLException 
  {
    SQLOutput ostream = (SQLOutput) stream;
    ostream.writeString(city);
    ostream.writeString(street);
    ostream.writeString(total);
  }
}



Описание типа Oracle
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace type Address as object
       external name 'Address' language java
       using sqldata (
                      city   varchar2(100)  external name 'city',
                      street varchar2(100) external name 'street',
                      total  varchar2(100)  external name 'total',
                      constructor function Address return self as result,
                      member function Calculate (city varchar2,street varchar2) return Address
                             external name 'Calculate(java.lang.String,java.lang.String) return Address'
                     );
/
create or replace type body Address as
  constructor function Address return self as result
  as begin
    return;
  end;
end;
/



Вызов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select A.F1,
       A.F2,
       A.CALC.CITY,
       A.CALC.STREET,
       A.CALC.TOTAL 
  from (select A.*,
               (select Address().Calculate(A.F1,A.F2) 
                  from DUAL
               ) CALC   
          from (select 'London'   F1,
                       'BS-125 B' F2
                  from DUAL
               ) A
       ) A        



Вызов типа и соответственно расчет единоразовый - проверяно !!!
Все спасибо !!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Подключение Java класса в типу Oracle
    #39575167
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,
Я правильно понимаю: при создании типа "Adress" у тебя создаеться экземпляр класса "Adress"?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подключение Java класса в типу Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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