oracle - ORA-00947 : Not Enough Values while putting values into a type inside a procedure -
i have created oracle types:
create or replace type "results_admin" object ( rownumber number, asset_id varchar2(1000 char), book_id varchar2(10 char), asset_name varchar2(50 char) , book_author varchar2(30 char) , asset_location varchar2(30 char), asset_cat varchar2(50 char), asset_type varchar2(10 char), publisher_name varchar2(50 char), books_available number ); create or replace type "result_admin_temp" table of lms.results_admin;
here procedure uses them:
create or replace procedure "retrieve_asset_admin" ( aid in asset_details.asset_id%type, aname in asset_details.asset_name%type, acat in asset_details.asset_cat%type, atypeid in asset_details.asset_type_id%type, bauthor in asset_details.book_author%type, aloc in asset_details.asset_location%type, pub in asset_publisher.publisher_name%type, pagenumber in number, asset_cur out sys_refcursor ) v_fpgnbr number; v_pgsize number; v_frec number; v_lrec number; v_totrows number; result_admin_temp_table result_admin_temp; begin v_fpgnbr := pagenumber; v_pgsize :=10; v_frec := (v_fpgnbr - 1 ) * v_pgsize; v_lrec := ( v_fpgnbr * v_pgsize + 1 ); select row_number() on (order a.asset_id) rownum, a.asset_id, a.book_id, asset_name , book_author , asset_location, asset_cat , l.asset_type, p.publisher_name, c.books_available bulk collect result_admin_temp_table asset_details join asset_count c on a.book_id=c.book_id join asset_lookup_details l on a.asset_type_id=l.asset_type_id join asset_publisher p on a.book_id = p.book_id (aid null or a.asset_id = aid ) , (aname null or asset_name '%'||aname||'%') , (bauthor null or book_author '%'||bauthor||'%') , (aloc '%select%' or asset_location '%'|| aloc ||'%') , (acat '%select%' or asset_cat '%'||acat||'%') , (atypeid = 0 or a.asset_type_id = atypeid) , (pub null or p.publisher_name '%'||pub||'%'); open asset_cur select asset_id, book_id, asset_name , book_author , asset_location, asset_cat , asset_type, publisher_name, books_available table(result_admin_temp_table) rownum > v_frec , rownum < v_lrec order rownum asc; end retrieve_asset_admin;
while compiling code, getting ora-00947: not enough values error @ "bulkcollect result_admin_temp_table" point
. have tried lot search on internet find out resolution this. can please tell me going wrong?
here why message: selecting nested table. oracle won't cast result set type you: need yourself.
select results_admin( row_number() on (order a.asset_id), a.asset_id, a.book_id, asset_name , book_author , asset_location, asset_cat , l.asset_type, p.publisher_name, c.books_available ) bulk collect result_admin_temp_table asset_details join asset_count c on a.book_id=c.book_id join asset_lookup_details l on a.asset_type_id=l.asset_type_id join asset_publisher p on a.book_id = p.book_id)
some additional observations:
- don't use
rownum
alias. rownum an oracle keyword, , query won't work way think will. - you populating nested table entire result set. collections sit in session memory. if query returns many results - , given how vague parameters guess - collection might grow large , blow pga limit.
- running paginating queries in database such bad idea. nobody wants put business logic in database yet wants put presentation logic there. shakes head
finally, avoid overhead of collection simple in-line query:
open asset_cur select asset_id, book_id, asset_name , book_author , asset_location, asset_cat , asset_type, publisher_name, books_available ( select row_number() on (order a.asset_id) rn, a.asset_id, a.book_id, asset_name , book_author , asset_location, asset_cat , l.asset_type, p.publisher_name, c.books_available bulk collect result_admin_temp_table asset_details join asset_count c on a.book_id=c.book_id join asset_lookup_details l on a.asset_type_id=l.asset_type_id join asset_publisher p on a.book_id = p.book_id (aid null or a.asset_id = aid ) , (aname null or asset_name '%'||aname||'%') , (bauthor null or book_author '%'||bauthor||'%') , (aloc '%select%' or asset_location '%'|| aloc ||'%') , (acat '%select%' or asset_cat '%'||acat||'%') , (atypeid = 0 or a.asset_type_id = atypeid) , (pub null or p.publisher_name '%'||pub||'%') ) t t.rn > v_frec , t.rn < v_lrec order t.rn asc;
Comments
Post a Comment