我有一个主表,其中包含查找表,基表,主表,主列,基列的信息。使用该信息,我将创建动态SQL语句并通过execute immediate
执行这些语句。
由于交易中有很多记录,我正在使用批量收集。要批量收集记录,我想在运行时根据master中可用的列在Oracle中创建动态类型。
以下是代码结构:
create or replace procedure pro_name(code varchar2,retmsg out varchar2)as
rec_master scr_master_data%rowtype;
type fstcurtype is ref cursor;
cur_fname fstcurtype;
v_sql varchar2(5000);
v_ran_sql varchar2(5000);
begin
SELECT *
INTO rec_master
FROM SCR_MASTER_DATA
WHERE SCREMBLING_CODE = P_SCREMBLING_CODE
AND ACTIVE ='Y';
v_sql := 'select distinct '||rec_master.primary _columns||','||rec_master.base_columns||' from '||rec_master.base_tables;
v_ran_sql:= 'select '||rec_master.LOOKUP_COLUMNS||' from (select /*+ parallel('||rec_master.LOOKUP_TABLES||',16) */ '||rec_master.LOOKUP_COLUMNS
||' from '||rec_master.LOOKUP_TABLES ||' order by dbms_random.value ) where rownum = 1';
OPEN CUR_FNAME for v_sql;
LOOP
FETCH CUR_FNAME BULK COLLECT INTO rec_fname LIMIT NVL(rec_master.ROWS_TO_COMMIT,10000) ;
.
.
.
.
exception
when others then
.
.
end;
我想基于变量v_sql
创建一个类型。该声明中提到的列应该用于该类型。
我尝试在v_ran_sql
之后添加以下代码,但这是浪费精力。
execute immediate 'type ty_name is record(row_id varchar2(500),fst_name varchar2(500),acc_number varchar2(500))';
execute immediate 'rec_fname ty_name';
其中row_id
,fst_name
,acc_number
列名称将来自主表。
有什么方法吗?