Тип пакета PL / SQL против типа схемы - PullRequest
3 голосов
/ 10 июля 2011

Я пытаюсь сделать следующее:

create or replace
package MyPackage
as
    type string_list_t is table of varchar2(32767);

    function GetPrimaryKeys    ( p_table_name varchar2, p_owner varchar2 )
        return string_list_t;
end MyPackage;
/

create or replace
package body MyPackage as

function GetPrimaryKeys ( p_table_name varchar2, p_owner varchar2 )
return string_list_t
is
    pk_descr string_list_t;
begin
    select cast( multiset (
        select cols.column_name
          from all_constraints cons, all_cons_columns cols
          where cols.table_name = p_table_name
          and cons.constraint_type = 'P'
          and cons.constraint_name = cols.constraint_name
          and cols.owner = p_owner
          and cons.owner = p_owner
    ) as string_list_t) into pk_descr from dual; -- error refers to string_list_t

     return pk_descr;
end;

end MyPackage;

Но он не компилируется:

Ошибка (16,14): PL / SQL: ORA-00902: неверный тип данных

Когда я определяю string_list_t вне пакета как

create or replace
type string_list_t is table of varchar2(32767);

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

1 Ответ

6 голосов
/ 10 июля 2011

Если вы собираетесь использовать оператор выбора SQL, который использует тип, то это должен быть тип SQL. Вы не можете вернуть тип PL / SQL в SQL.

Другой вариант, который может сработать, - создать цикл for и заполнить массив.

CREATE OR REPLACE PACKAGE BODY MyPackage as

  function GetPrimaryKeys ( p_table_name varchar2, p_owner varchar2 ) return string_list_t
  is
    pk_descr string_list_t;
    --iCounter  number:=1;
  begin

    /*------------------------------
     -       new version                 
     ------------------------------*/
    SELECT cols.column_name
      BULK COLLECT INTO pk_descr
    FROM   all_constraints cons, 
           all_cons_columns cols
    WHERE  cols.table_name = p_table_name
      AND  cons.constraint_type = 'P'
      AND  cons.constraint_name = cols.constraint_name
      AND  cols.owner = p_owner
      AND  cons.owner = p_owner;

    /* old version */
    FOR rec in (select cols.column_name
                from   all_constraints cons, 
                       all_cons_columns cols
                where  cols.table_name = p_table_name
                  and  cons.constraint_type = 'P'
                  and cons.constraint_name = cols.constraint_name
                  and cols.owner = p_owner
                  and cons.owner = p_owner) 
    LOOP

      pk_descr(iCounter):= rec.column_name;
      iCounter:= iCounter+1;
    END LOOP;


    RETURN pk_descr;
 END;

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