Просто пытаясь вернуть курсор для идентификаторов, которые я определяю.
CREATE OR REPLACE PACKAGE some_package AS TYPE t_cursor IS REF CURSOR; TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER; PROCEDURE someentity_select( p_ids IN t_id_table, p_results OUT t_cursor); END; CREATE OR REPLACE PACKAGE BODY some_package AS PROCEDURE someentity_select( p_ids IN t_guid_table, p_results OUT t_cursor) IS BEGIN OPEN p_results FOR SELECT * FROM someschema.someentity WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here END; END;
Примечание: someschema.someentity.id является NVARCHAR2 (38)
МН / SQL: РТЫ 00382: выражение имеет неправильный тип
МН / SQL: РТЫ 22905: не может получить доступ к строкам от объекта невложенной таблицы
Где я иду не так, как надо?
В Oracle версии до 12.2 Вы можете выбрать только из типа коллекции, который определен в базе данных через оператор создания типа, не ассоциативный массив:
CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38);
CREATE OR REPLACE PACKAGE some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR);
END;
CREATE OR REPLACE PACKAGE BODY some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_results FOR
SELECT *
FROM someschema.someentity
WHERE id IN (SELECT column_value FROM TABLE(p_ids));
END;
END;
Это индексная таблица, которая является типом PL / SQL.
Вы можете использовать только типы SQL в двигателе SQL Oracle. Или типы PL / SQL, что Oracle может взломать, чтобы выглядеть как типы SQL.
Вы можете иметь простую массивную коллекцию и использовать ее в результате. (Нет индекса)
type TGuidList is table of NVarchar(38);
type TGuidList is table of NVarchar(38);
, но лучшая совместимость и стабильность, вы получаете, объявляете его как глобальный тип SQL и используете это внутри вашего пакета:
TGUIDList Type Type - таблица nvarchar (38);
редактировать : Вам не понадобится nvarchar для GUID, вы будете? Хороший OL 'Varchar должен делать трюк просто в порядке.