Используя Oracle Таблица Вводят В ПУНКТЕ - сбои компиляции

Просто пытаясь вернуть курсор для идентификаторов, которые я определяю.

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: не может получить доступ к строкам от объекта невложенной таблицы

Где я иду не так, как надо?

9
задан Travis Heseman 11 January 2010 в 22:57
поделиться

2 ответа

В 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;
11
ответ дан 4 December 2019 в 14:28
поделиться

Это индексная таблица, которая является типом 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 должен делать трюк просто в порядке.

3
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: