2013-10-04 3 views
0

У меня есть хранимая процедура, в которой я заполняю таблицу из массива записей (сборы), а затем помещаю эти строки в курсор.Записать запись в Ref Cursor

TYPE rctl IS REF CURSOR ; 
Fees t_Fees; 
type t_Fees is table of t_FeeRecord index by binary_integer; 

type t_FeeRecord is record(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
); 

--populate the Fees array 

INSERT into TEMPORARY_FEE(description,amount,tax) values(Fees(i).description,Fees(i).Amount,Fees(i).Tax); 

OPEN rc1 FOR SELECT description,amount TEMPORARY_FEES; 

Это все работает отлично (заселение запись, вставляя в временную таблицу и заселение реф курсор), но это можно устранить таблицу и просто передать мой массив записей непосредственно в ref_cursor? Я должен вернуть результаты как ref_cursor для стороннего приложения.

Я думал, что смогу попробовать что-то вроде этого.

OPEN rc1 FOR 
SELECT * FROM TABLE(cast(Fees as t_FeeRecord)); 

но я получаю недопустимый тип данных.

+0

Не с типом, определенным в пакете, поскольку типы PL/SQL не могут использоваться в SQL (даже если этот сам SQL внутри PL/SQL). Ваш приведение также неверно, 'table()' не работает с типами записей. Если 't_fees' был объявлен с' create type' на уровне SQL, тогда вы могли бы просто «выбрать * из таблицы (сборов)». Это возможно? –

ответ

1

Объявить t_FeeRecord и t_Fees как объекты базы данных, а не PL/SQL объектов,
в Oracle типов PL/SQL не могут быть использованы в запросах SQL, это дает вам тип данных ошибку (однако, это ограничение снимается в Oracle 12c).

t_FeeRecord должно быть создано как тип объекта, а не тип записи, поскольку записи являются типами PL/SQL и не могут использоваться в SQL-запросах.

create type t_FeeRecord is object(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
);/ 

create type t_Fees as table of t_FeeRecord;/

Вот простая демонстрация, которая создает таблицу записей, откройте реф курсор для этой таблицы и читает курсор и вставляет строки, извлеченные из курсора в таблице (протестировано на 11.2g):

create type t_FeeRecord is object(
    description   varchar2(80), 
    amount    number(12,2), 
    taxAmount   number(12,2) 
); 
/

create type t_Fees as table of t_FeeRecord; 
/

create table temporary_fee(
    description varchar2(80), 
    amount  number(12,2), 
    taxAmount number(12,2) 
); 

declare 
    fees t_Fees; 
    TYPE rctl IS REF CURSOR; 
    cur rctl; 

    rec TEMPORARY_FEE%ROWTYPE; 
begin 
    fees := t_Fees (
     t_FeeRecord('aaa', 20, 30), 
     t_FeeRecord('bbb', 10, 76), 
     t_FeeRecord('xxx', 4, 23), 
     t_FeeRecord('zzz', 7, 43), 
     t_FeeRecord('ccc', 13, 44)); 

    open cur for 
     select * from table(fees); 

    LOOP 
    FETCH cur INTO rec; 
    EXIT WHEN cur%NOTFOUND; 
    INSERT INTO TEMPORARY_FEE VALUES rec; 
    END LOOP; 
    close cur; 
end; 
/

select * from temporary_fee; 

DESCRIPTION  AMOUNT TAXAMOUNT 
------------ ---------- ---------- 
aaa     20   30 
bbb     10   76 
xxx     4   23 
zzz     7   43 
ccc     13   44 
+0

Отлично ... Спасибо – EvilEddie

Смежные вопросы