powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов Java-класса
5 сообщений из 5, страница 1 из 1
Вызов Java-класса
    #39692502
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Написал простейший класс со статическим методом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED TEST.SwapClassSRC as 
import java.io.*;

public class Swapper{

    public static void swapValues(int a, int b) {
      int tmp = a;
      a = b;
      b = tmp;   
    }
};


, добавил обертку
Код: sql
1.
2.
3.
CREATE OR REPLACE PROCEDURE TEST.swap (x IN OUT NUMBER, y IN OUT NUMBER)
AS LANGUAGE JAVA
NAME 'Swapper.swapValues(int[], int[])';


вызвал тест
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
  a number := 33;
  b number := 55;
BEGIN
  dbms_output.put_line('a='||a);
  dbms_output.put_line('b='||b);
  TEST.swap(a,b);
  dbms_output.put_line('a='||a);
  dbms_output.put_line('b='||b);
END;


Но при попытке запустить этот тест вываливается ошибка:
Код: plsql
1.
2.
3.
ORA-29531: отсутствует метод swapValues в классе Swapper
ORA-06512: на  "TEST.SWAP", line 1
ORA-06512: на  line 7


Что я сделал не так?
...
Рейтинг: 0 / 0
Вызов Java-класса
    #39692517
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понятно:
1) с каких это пор, атомарные типы в Java в качестве параметров стали IN OUT.
2) что обозначает запись
NAME 'Swapper.swapValues(int[], int[])';


Смотрю в доку, и вижу точно такой же пример как у Вас.... а дальше, в игру "найди N отличий", играйте сами )))

https://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm
Example 6-4 Publishing a Method That Switches the Values of Its Arguments
...
Рейтинг: 0 / 0
Вызов Java-класса
    #39692520
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NAME 'Swapper.swapValues(int[], int[])';

Вместо int[] - int.

А дальше "PLS-00235: тип внешнего объекта не подходит для данного параметра"

Вопрос, можно ли OUT использовать для работы в java.
...
Рейтинг: 0 / 0
Вызов Java-класса
    #39692531
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, так вот почему int [].

A method in object-oriented languages cannot assign values to objects passed as arguments; the point of the method is to apply to the object to which it is attached. When you want to call a method from SQL or PL/SQL and change the value of an argument, you must declare it as an OUT or IN OUT parameter in the call spec. The corresponding Java parameter must then be a one-element array.

https://docstore.mik.ua/orelly/oracle/guide8i/ch09_08.htm

Ну что же, приводим типы в соответствие.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace and compile java source named Swapper as
public class Swapper
{
    public static void swapValues(int[] a, int[] b) {
      int tmp = a[0];
      a[0] = b[0];
      b[0] = tmp;   
    }
}

CREATE OR REPLACE PROCEDURE swap (x IN OUT NUMBER, y IN OUT NUMBER)
AS LANGUAGE JAVA
NAME 'Swapper.swapValues(int [], int [])';
...
Рейтинг: 0 / 0
Вызов Java-класса
    #39692761
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,
Да, именно в этом всё и дело:
авторThe corresponding Java parameter must then be a one-element array.
Так всё работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace and compile java source named Swapper as
public class Swapper
{
    public static void swapValues(int[] a, int[] b) {
      int tmp = a[0];
      a[0] = b[0];
      b[0] = tmp;   
    }
}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вызов Java-класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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