I have a source data table like below:
create table source_qtr (
id int
,qtr1 NUMBER(20,9)
,qtr2 NUMBER(20,9)
,qtr3 NUMBER(20,9)
,qtr4 NUMBER(20,9) );
insert scripts for sample data
insert into source_qtr values (1,1.982,2.3453,5.3453,4.64564);
insert into source_qtr values (2,2.93482,2.3453,5.3453,4.64564);
insert into source_qtr values (3,3.982,2.3453,5.3453,4.64564);
insert into source_qtr values (4,7.982,2.3453,5.3453,4.64564);
insert into source_qtr values (5,5.982,2.3453,5.3453,4.64564);
insert into source_qtr values (6,9.982,2.3453,5.3453,4.64564);
insert into source_qtr values (7,11.982,2.3453,5.3453,4.64564);
insert into source_qtr values (8,12.982,2.3453,5.3453,4.64564);
insert into source_qtr values (9,21.982,2.3453,5.3453,4.64564);
insert into source_qtr values (10,41.982,2.3453,5.3453,4.64564);
And my target table structure depends on few more objects those are:
create type obj_qtr as Object ( qtr_id int
, qtr_value NUMBER(20,9) );
CREATE TYPE VARR_QTR IS VARRAY(4) OF obj_qtr;
CREATE TABLE TAR_QTR ( SRC_id int
, QTR VARR_QTR);
I can insert the data in to this target table by using manually generated insert scripts:
insert into TAR_QTR values (1, VARR_QTR(obj_qtr('1','1.982'),obj_qtr('2','2.3453'),obj_qtr('3','5.3453'),obj_qtr('4','4.64564')));
This process is taking more time. To avoid that, we are trying to create a procedure to insert this data from the source table:
create or replace procedure Data_Load_proc
is
begin
for x in ( select sq.id
, 'VARR_QTR ( obj_qtr(''1'',''' || sq.qtr1 || ''')
, obj_qtr(''2'',''' || sq.qtr2 || ''')
, obj_qtr(''3'',''' || sq.qtr3 || ''')
, obj_qtr(''4'',''' || sq.qtr4 || ''')
)' as a
from source_qtrsq
) loop
insert into TAR_QTR (SRC_id,QTR) values (x.id,cast(x.a as VARR_QTR));
end loop;
commit;
End;
When I execute this procedure I got error:
Error starting at line : 60 in command -
BEGIN procedure Data_Load_proc; END;
Error report -
ORA-06550: line 1, column 7:
PLS-00103: Encountered the symbol "PROCEDURE" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit for all merge pipe purge
ORA-06550: line 1, column 36:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
;
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
How to resolve this issue? Or is there any other way to insert this data?
Note: not able to use 'External table' or 'sql Loader' due to some security reason.
Thanks.
Your problem is you need to cast the source table rows into OBJ_QTR types, and that table is not structured to do that nicely. So you need a query which changes the projection to fit the target structure:
Now you can use that to populate type instances and multiset() to populate your VARRAY. Something like this: