Доступ к типу данных Oracle из Java - PullRequest
1 голос
/ 03 января 2012

Я хочу получить доступ к типу данных, определенному в пакете из Java при выполнении функции. Пожалуйста, помогите мне.

Пакет и функция:

create or replace package types as 
    TYPE name_array IS VARRAY(100000) OF VARCHAR2(200);
end types;



create or replace function test_pack1 return types.name_array as 
names types.name_array := types.name_array(); 

begin

for emp in (Select state from test where test_ID BETWEEN 1 AND 120000) loop
 names.extend;
 names(names.count) := emp.state;
  end loop;
return names;
end test_pack1;

код Java

cstmt = (OracleCallableStatement) con.prepareCall("begin ? :=test_pack1; end;");
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAME_ARRAY");
cstmt.execute();

Выше я получаю сообщение об ошибке во второй строке.Сообщение об ошибке ниже: java.sql.SQLException: недопустимый шаблон имени: xyz.NAME_ARRAY

Функция успешно выполняется в Oracle. Но когда мы пытаемся выполнить из java ее исключение выше исключения.

Ответы [ 3 ]

2 голосов
/ 05 сентября 2013

Более новые версии Oracle (начиная с 12c Release 1) утверждают, что поддерживают типы внутри пакетов (поэтому к ним можно обращаться через JDBC).

Все типы пакетов PL / SQL сопоставлены с системойширокое уникальное имя, которое может использоваться JDBC для получения метаданных типа на стороне сервера.Название в следующей форме:

[SCHEMA.]<PACKAGE>.<TYPE>

отсюда: http://docs.oracle.com/cd/E16655_01/java.121/e17657/apxref.htm#CHEIIJCC

1 голос
/ 03 января 2012

Для этой цели необходимо использовать тип SQL, а не тип PL / SQL, поэтому необходимо определить тип вне PL / SQL (т.е. на уровне схемы, а не на уровне пакета):

CREATE OR REPLACE TYPE  NAME_ARRAY AS VARRAY(100000) OF VARCHAR2(200);

и используйте его в своей функции

create or replace function test_pack1 return name_array as 
   names name_array := name_array(); 
...
0 голосов
/ 03 января 2012

Чтобы это работало, невозможно определить тип массива в пакете, насколько это удобно делать. Драйвер Oracle JDBC не может «видеть» типы пакетов таким образом (это относится не только к массивам, но и ко всем настраиваемым типам, которые вы, возможно, захотите вернуть через вызов JDBC).

Вместо этого вам нужно определить массив как тип уровня схемы, после чего этот код должен нормально работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...