Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Nested Table Functions
I'm trying to get a table function to work but when I tried and tested it,
it seemed as if the queries were taking longer than the non-table function
versions. I've never programmed TABLE FUNCTIONS before much less nested
ones so I'm at a loss as to what I'm goofing up.
In the code below, please be aware of the fact I was just trying to actually get the code to work so I know there could be tweaks made to it.
I'm working with Oracle 10g Release 2 (version 1.02 I believe). Any corrections/advice on how to code nested table functions would be appreciated as I'm interested in using them for the datawarehouse loading.
Thanks
FUNCTION get_person_id( p_curs IN SYS_REFCURSOR )
RETURN stg_elig_rec_t PIPELINED
v_elig_row stg_elig%ROWTYPE;
BEGIN LOOP
FETCH p_curs INTO v_elig_row; EXIT WHEN p_curs%NOTFOUND; BEGIN SELECT person_id INTO v_elig_row.person_id FROM rpt.bo_mbr_addr WHERE mbr_contrived_key = v_elig_row.mbr_contrived_key; EXCEPTION WHEN NO_DATA_FOUND THEN v_elig_row.person_id := 0; END; PIPE ROW(stg_elig_rec_o( v_elig_row.person_id, v_elig_row.sys_contract_mbr, v_elig_row.mbr_contrived_key, v_elig_row.subscriber, v_elig_row.suffix, v_elig_row.group_id, v_elig_row.subgroup_id, v_elig_row.class_id, v_elig_row.class_desc, v_elig_row.product, v_elig_row.product_id, v_elig_row.product_desc, v_elig_row.elig_class_prod_cat, v_elig_row.elig_ind, v_elig_row.elig_plan_id, v_elig_row.product_category, v_elig_row.member_type, v_elig_row.product_type, v_elig_row.plan_certificate, v_elig_row.plan_suffix, v_elig_row.gender, v_elig_row.birth_date, v_elig_row.mbr_eff_date, v_elig_row.mbr_term_date, v_elig_row.sys_date ) );
END LOOP;
RETURN;
EXCEPTION
WHEN OTHERS THEN
global.sql_error('bo_load.get_person_id',SQLCODE); RAISE global.e_unhandled_exception;
END get_person_id;
FUNCTION read_ext_elig( p_curs IN SYS_REFCURSOR )
RETURN stg_elig_rec_t PIPELINED
v_elig_row ext_elig%ROWTYPE;
v_member_type stg_elig.member_type%TYPE; v_plan_certificate stg_elig.plan_certificate%TYPE; v_plan_suffix stg_elig.plan_suffix%TYPE; v_product stg_elig.product%TYPE; v_product_category stg_elig.product_category%TYPE; v_product_type stg_elig.product_type%TYPE; v_suffix stg_elig.suffix%TYPE; v_sys_contract_mbr stg_elig.sys_contract_mbr%TYPE;
BEGIN LOOP
FETCH p_curs INTO v_elig_row; EXIT WHEN p_curs%NOTFOUND; v_member_type := rules.member_type( v_elig_row.inp_elig_plan_id ); v_plan_certificate := rules.plan_certificate( v_elig_row.inp_elig_plan_id ); v_plan_suffix := rules.plan_suffix( v_elig_row.inp_elig_plan_id ); v_product := rules.product( v_elig_row.inp_elig_plan_id ); v_product_category := rules.product_category( v_elig_row.inp_elig_plan_id ); v_product_type := rules.product_type( v_elig_row.inp_elig_plan_id ); v_suffix := rules.suffix( v_elig_row.inp_suffix ); v_sys_contract_mbr := rules.sys_contract_mbr( v_elig_row.inp_subscriber, v_elig_row.inp_suffix ); PIPE ROW(stg_elig_rec_o( NULL, v_sys_contract_mbr, v_elig_row.inp_contrived_key, v_elig_row.inp_subscriber, v_suffix, v_elig_row.inp_group_id, v_elig_row.inp_subgroup_id, v_elig_row.inp_class_id, v_elig_row.inp_class_desc, v_product, v_elig_row.inp_product_id, v_elig_row.inp_product_desc, v_elig_row.inp_elig_class_prod_cat, v_elig_row.inp_elig_ind, v_elig_row.inp_elig_plan_id, v_product_category, v_member_type, v_product_type, v_plan_certificate, v_plan_suffix, v_elig_row.inp_gender, v_elig_row.inp_birth_date, v_elig_row.inp_effective_date, v_elig_row.inp_terminated_date, v_elig_row.sys_date ) );
END LOOP;
RETURN;
EXCEPTION
WHEN OTHERS THEN
global.sql_error('bo_load.read_ext_elig',SQLCODE); RAISE global.e_unhandled_exception;
END read_ext_elig;
PROCEDURE function_test
IS
BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE stg_elig';
INSERT INTO stg_elig
SELECT person_id, sys_contract_mbr, mbr_contrived_key, subscriber, suffix, group_id, subgroup_id, class_id, class_desc, product, product_id, product_desc, elig_class_prod_cat, elig_ind, elig_plan_id, product_category, member_type, product_type, plan_certificate, plan_suffix, gender, birth_date, mbr_eff_date, mbr_term_date, sys_date FROM TABLE ( get_person_id ( CURSOR( SELECT * FROM TABLE ( read_ext_elig ( CURSOR( SELECT * FROMext_elig ) )))));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
global.sql_error('bo_load.function_test',SQLCODE); RAISE global.e_unhandled_exception;
END function_test; Received on Mon Oct 16 2006 - 18:05:16 CDT
![]() |
![]() |