Использование таблицы типа Oracle в предложении IN - ошибка компиляции - PullRequest
9 голосов
/ 12 января 2010

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

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)

PL / SQL: ORA-00382: выражение имеет неправильный тип
PL / SQL: ORA-22905: невозможно получить доступ к строкам из не вложенного элемента таблицы

Куда я иду не так?

Ответы [ 2 ]

11 голосов
/ 12 января 2010

В версиях Oracle до 12.2 вы можете ВЫБРАТЬ только из типа коллекции, определенного в базе данных с помощью оператора CREATE TYPE, не ассоциативный массив:

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;
3 голосов
/ 12 января 2010

Это таблица индекса по типу PL / SQL.

Вы можете использовать только типы SQL в механизме SQL Oracle.Или типы PL / SQL, которые Oracle может взломать, чтобы выглядеть как типы SQL.

Вы можете иметь простую массивоподобную коллекцию и использовать ее в результате.(без индекса)

type TGuidList is table of NVarchar(38);

Но лучшую совместимость и стабильность вы получите, объявив его как глобальный тип SQL и используя его в своем пакете:

create typeNVarchar (38);

Редактировать: Вам не понадобится NVarChar для GUID, не так ли?Хороший старый VarChar должен хорошо справиться с задачей.

...