Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Mailing Lists -> Oracle-L -> Cast+Select from pl/sql table question( BULK Operations in SQL)
Andor asked about selecting on PL/SQL tables. You have to use TABLE as well
as CAST. The 8.1.6 manual (PL/SQL user's guide, chapter 4) is quite good on
this topic. Here's some demonstrated PL/SQL that works for me (on 8.1.6.3 on
Solaris2.6). Note that the array types (varchar20_table_type and
int_table_type, both owned by user asuer) must already exist, and execute
permission granted appropriately.
create or replace type int_table_type as table of number(8)
/
grant execute on int_table_type to public
/
create or replace type varchar20_table_type as table of varchar2(20)
/
grant execute on varchar20_table_type to public
/
declare
array1 auser.int_table_type := auser.int_table_type(); array2 auser.int_table_type := auser.int_table_type(); array3 auser.varchar20_table_type := auser.varchar20_table_type(); array_count number; begin array1.extend(5); array1(1):=1; array1(2):=2; array1(3):=3; array1(4):=6; array1(5):=7; dbms_output.put_line('array1 ========================'); for i in array1.FIRST .. array1.LAST loop dbms_output.put_line('array1('||i||'): ' || to_char(array1(i)) ); end loop; select count(*) into array_count from table(cast(array1 as auser.int_table_type)) as dummy_table; dbms_output.put_line('COUNT1: ' || array_count); array2.extend(4); array2(1):=1; array2(2):=2; array2(3):=4; array2(4):=5; dbms_output.put_line('array2 ========================'); for i in array2.FIRST .. array2.LAST loop dbms_output.put_line('array2('||i||'): ' || to_char(array2(i)) ); end loop; select count(*) into array_count from table(cast(array2 as auser.int_table_type)) as dummy_table; dbms_output.put_line('COUNT2: ' || array_count); /* */ select status bulk collect into array3 from article a where a.subject_id in (select * from table(cast(array1 as auser.int_table_type)) as dummy_table1 ) order by 1; dbms_output.put_line('array3 ========================'); for i in array3.FIRST .. array3.LAST loop dbms_output.put_line('array3('||i||'): ' || array3(i) ); end loop; select count(*) into array_count from table(cast(array3 as auser.varchar20_table_type)) as dummy_table; dbms_output.put_line('COUNT3: ' || array_count); dbms_output.put_line('COUNT3: ' || array3.COUNT);Received on Fri Jan 26 2001 - 07:56:56 CST