какой TYPE можно включить в PACKAGE

баз лайтер
Дата: 02.12.2009 21:32:31
Казалось бы, элементарная проблема перерасла в нерешаемую после пары дней гугления, поэтому решил спросить мнение многоуважаемого all:

Требуется создать package, использующий специфические типы данных, и вызывать его из Java, например

SearchPackage.Search(SearchPackage.SearchQuery query)

Объявить TYPE SearchQuery IS OBJECT(...) мне не позволяет Oracle - PLS-00540:object not supported in this context
Объявить TYPE SearchQuery IS RECORD(...) возможно, но в момент исполнения происходит ошибка java.sql.SQLException: invalid name pattern: SearchPackage.SearchQuery.

Пока суть да дело, были созданы глобальные типы (IS OBJECT) для всех используемых типов, но как сами понмаете, хочется включить описания в пакет. Куда копать?

Driver Information
	Driver Name: Oracle JDBC driver
	Driver Version: 11.1.0.6.0-Production

Database Information 
	Database Name: Oracle
	Database Version: Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
suPPLer
Дата: 02.12.2009 22:37:14
баз лайтер
Объявить TYPE SearchQuery IS OBJECT(...) мне не позволяет Oracle - PLS-00540:object not supported in this context


Пожалуйста, приведите пример этого объявления типа в пакете, который у Вас не работает.
Sergei.Agalakov
Дата: 03.12.2009 00:10:19
Создайте скрипт, создающий объектные типы, и поддерживайте его. Вы же не создаете, скажем, описания триггеров в пакете?
Если уж очень хочется, то создайте административный пакет, который будет уметь пересоздавать объектные типы через execute immediate.
баз лайтер
Дата: 03.12.2009 13:40:15
Пожалуйста, приведите пример

пожалуйста - этот код вызывает ошибку компиляции:
create or replace
PACKAGE p IS

TYPE PageSortParams IS OBJECT(
 StartRow int
,NumRows int
,OrderBy varchar2(255)  
);
END;

сравнение типов с триггерами на мой взгляд не совсем корректно, поскольку триггера не являются частью интерфейса, в то время как специфические типы данных - являются, и, более того, зеркалируются на соответствующие типы java библиотеки. Ещё более того, возвращаемые рекордсеты как-раз прекрасно типизируются внутри Package:

автор
TYPE CurPropertyValue IS REF CURSOR RETURN vwPropertyValue%ROWTYPE;


Скажите, а какие приимущества даёт Package в моём случае - по сравнению с набором процедур и функций? Который тоже можно поддерживать административным скриптом.
vava
Дата: 03.12.2009 13:46:36
Ну например можно хранить в переменных пакета различные данные во время сессии. И использовать механизм инициализации этих переменных.
Sergei.Agalakov
Дата: 03.12.2009 19:23:19
Инкапсуляция, оверлодинг, PL/SQL переменные сессии, разделение интерфейса и реализации и т.д. Если вам нужны PL/SQL типы - определяйте их в пакете. Но SQL типы (as object) в общем являются частью схемы (вы, например, можете захотеть создать таблицу с использованием созданного вами SQL типа) и потому их место - среди скриптов создания схемы.
dbms_photoshop
Дата: 03.12.2009 19:33:20
баз лайтер,
Это не спасет отца русской демократии?
SQL> CREATE OR REPLACE PACKAGE p IS
  2  
  3      TYPE to_rec IS RECORD(
  4          id1 VARCHAR2(240),
  5          id2 VARCHAR2(240),
  6          id3 VARCHAR2(240));
  7  
  8      TYPE tt_rec IS TABLE OF to_rec;
  9  
 10      FUNCTION f(n IN NUMBER) RETURN tt_rec;
 11  
 12  END p;
 13  /
 
Package created
SQL> CREATE OR REPLACE PACKAGE BODY p IS
  2  
  3  	FUNCTION f(n IN NUMBER) RETURN tt_rec IS
  4  		RESULT tt_rec;
  5  	BEGIN
  6  		SELECT LEVEL, LEVEL * 10, LEVEL * 100 BULK COLLECT
  7  		  INTO RESULT
  8  		  FROM dual
  9  		CONNECT BY LEVEL <= n;
 10  
 11  		RETURN RESULT;
 12  	END;
 13  
 14  END p;
 15  /
 
Package body created
баз лайтер
Дата: 03.12.2009 19:51:21
тип RECORD не поддерживается JDBC - вот тут товарищ по тем же граблям ходит, а тут прямое указание в документации (более новой версии правда).

В клиентском коде это выливается в невозможность создать дескриптор

StructDescriptor d = StructDescriptor.createDescriptor("SearchPackage.SearchQuery", connection);

причём, естественно, ошибка возникает во время выполнения.

но попытка засчитана.
dbms_photoshop
Дата: 03.12.2009 20:38:36
баз лайтер
но попытка засчитана.

спасибо, мне очень приятно

Ну так ты ж сам дал ссылку на документацию, где написан workaround. В чем проблема?
баз лайтер
Дата: 03.12.2009 21:05:41
workaround типа "разбейте record на элементы и каждый пропишите как параметр" напоминает выплёскиване ребёнка вместе с водой. Особенно, когда большенство элементов композитные.

На мой взгляд, глобальные типы - меньшее зло.

Интересуюсь мнением знающих людей, проблем никаких.