Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to cast RECORD of nested tables into OBJECT of nested tables

528423Aug 14 2008 — edited Aug 14 2008

Right, we have an existing massive pl/sql package where some of the processing is taking too long so they want to try multithreading it.

The data in this package is stored in an array of records which contains nested tables, which themselves contain nested tables.

So, we want to split this table into 10, and submit them to 10 dbms_jobs to run concurrently, write the modified arrays to the database so they can be picked up again by the original process.

I'm stuck on converting the associative array of data (containing tables of records) into objects which can be stored in the DB.

My database objects:

CREATE OR REPLACE 
TYPE ktest_claims_rt IS OBJECT
    (
     col1 varchar2(10)
    ,col2 varchar2(10));
/

CREATE OR REPLACE 
  TYPE ktest_claims_tt IS TABLE OF ktest_claims_rt;
/


CREATE OR REPLACE 
TYPE ktest_driver_rt IS OBJECT
    (
     col1      varchar2(10)
    ,col2      varchar2(10)
    ,claims_nt ktest_claims_tt);
/

CREATE OR REPLACE 
  TYPE ktest_driver_tt IS TABLE OF ktest_driver_rt;
/

CREATE OR REPLACE 
TYPE ktest_policy_rt IS OBJECT
    (
     col1       varchar2(10)
    ,col2       varchar2(10)
    ,driver_nt  ktest_driver_tt);
/

CREATE OR REPLACE 
  TYPE ktest_policy_tt IS TABLE OF ktest_policy_rt;
/

CREATE TABLE ktest_job_table
  (job_no        NUMBER
  ,tab_type      VARCHAR2(3)
  ,policy_nt     ktest_policy_tt
  )
  NESTED TABLE policy_nt STORE AS policy_nested_tab
    (NESTED TABLE driver_nt STORE AS driver_nested_tab
       (NESTED TABLE claims_nt STORE AS claims_nested_tab))
/ 

And my local package versions:

   TYPE claims_rt IS RECORD
    (
     col1 varchar2(10)
    ,col2 varchar2(10));

   TYPE claims_tt IS TABLE OF claims_rt INDEX BY PLS_INTEGER; 

   TYPE driver_rt IS RECORD
    (
     col1       varchar2(10)
    ,col2       varchar2(10)
    ,claims_nt  claims_tt);
    
   TYPE driver_tt IS TABLE OF driver_rt INDEX BY VARCHAR2(20);
    
   TYPE policy_rt IS RECORD
       (
        policy_no   policy.policy_no%TYPE
       ,driver_tab  driver_tt
       ,other_col   VARCHAR2(20));
       
   TYPE policy_tt IS TABLE OF policy_rt
        INDEX BY pls_integer;
        
   main_table  policy_tt;

What I can't get through my pea sized brain is how to turn "main_table" into an array based on ktest_policy_tt.

I got as far as:

   FUNCTION convert (p_table IN policy_tt) RETURN ktest_policy_tt
   IS
      db_vers  ktest_policy_tt := ktest_policy_tt();
      db_rec   ktest_policy_rt;

   BEGIN
      FOR i IN p_table.FIRST..p_table.LAST
      LOOP
         db_rec := ktest_policy_rt(p_table(i).policy_no
                                  ,p_table(i).other_col
                                  ,ktest_driver_tt(p_table(i).driver_tab(i).col1
                                                  ,p_table(i).driver_tab(i).col2
                                                  ,ktest_claims_tt(p_table(i).driver_tab(i).claims_nt(i).col1
                                                                  ,p_table(i).driver_tab(i).claims_nt(i).col1
                                                                  )
                                                                  
                                                  )
                                  );
         db_vers(i) := db_rec;
      END LOOP;
   
   END;

but, apart from the fact that it only coverts the first row of each table, it doesn't compile:

LINE/COL ERROR
-------- -----------------------------------------------------------------
139/10   PL/SQL: Statement ignored
143/52   PLS-00306: wrong number or types of arguments in call to
         'KTEST_CLAIMS_TT'

143/52   PLS-00306: wrong number or types of arguments in call to
         'KTEST_CLAIMS_TT'

I'd appreciate any help as this is getting urgent.

Thanks!

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 11 2008
Added on Aug 14 2008
5 comments
2,010 views