我们如何在Oracle中创建动态类型?

时间:2018-03-20 10:38:23

标签: oracle plsql

我有一个主表,其中包含查找表,基表,主表,主列,基列的信息。使用该信息,我将创建动态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_idfst_nameacc_number列名称将来自主表。

有什么方法吗?

0 个答案:

没有答案