понедельник, 3 февраля 2014 г.

Выборка из таблицы с типом, опеределеным в пакете, ошибка local collection types not allowed in SQL statements

Для примера определим пакет:

create or replace package sample_pkg is
  type myRec is record(
    id   number,
    name varchar2(50));
  type myRecTbl is table of myRec;
  type crs is ref cursor;
  procedure test;
end sample_pkg;

Если в коде захочется сделать например так

 function test_crs return crs is
    myTab  myRecTbl := myRecTbl();
    p_id   number;
    p_name varchar2(50);
    i      number := 1;
    res    crs;
 
  begin
 
    for cr in (select * from sample_table) loop
      myTab.extend();
      myTab(i).id := cr.id;
      myTab(i).name := cr.name;
      i := i + 1;
    end loop;
 
    for x in (select * from table(myTab)) loop
      dbms_output.put_line(x.name);
    end loop;
 
    return crs;
 
  end test_crs;

будет ошибка Error: PLS-00642: local collection types not allowed in SQL statements, так как для использования в SQL тип доложен быть определен на уровне БД (схемы) а не в пакете.

1 комментарий: