Несовпадение очевидно: ваш курсор находится на наборе строк с двумя столбцами типа VARCHAR2
и T_MONEY
соответственно, но во вложенной таблице ожидаются объекты типа T_WALLET
.Где-то, так или иначе, вы должны создать объекты типа T_WALLET
из данных в курсоре.
Предполагая, что оператор SELECT
в вашем определении курсора имитирует фактическую таблицу с двумя столбцами, вы можете заключить ее ввнешний запрос, где вы используете конструктор.(Или же таблица или оператор SELECT
должны уже сохранять или создавать T_WALLET
с.)
declare
walletCollection t_wallets;
cursor walletCursor is
select t_wallet(name, amount) -- THIS outer select, using the constructor
from (
select 'some name' as name
, t_money(99, 'EUR') as amount
from dual
);
begin
open walletCursor;
fetch walletCursor bulk collect into walletCollection;
close walletCursor;
end;
/
Вот краткое демонстрационное руководство, показывающее, что вложенная таблица заполнена правильно.Обратите внимание на вызов dbms_output.put_line
в теле процедуры;обычно вы делаете это только для целей разработки и отладки (и для иллюстрации, как в данном случае).Убедитесь, что вы запустили set serveroutput on
, чтобы увидеть вывод.
declare
walletCollection t_wallets;
cursor walletCursor is
select t_wallet(name, amount)
from (
select 'some name' as name
, t_money(99, 'EUR') as amount
from dual
);
begin
open walletCursor;
fetch walletCursor bulk collect into walletCollection;
close walletCursor;
for i in 1 .. walletCollection.Count loop
dbms_output.put_line( 'Name: ' || walletCollection(i).name ||
', amount: ' || walletCollection(i).amount.val ||
', currency: ' || walletCollection(i).amount.cur );
end loop;
end;
/
Name: some name, amount: 99, currency: EUR
PL/SQL procedure successfully completed.