当我不知道我会得到多少列时,如何声明批量收集 - ORACLE

时间:2015-07-16 22:27:09

标签: sql oracle plsql oracle-apex

我正在创建一个包含“x,y,z,z1 ... zn”列的动态查询,如下所示:

`TYPE VAR IS TABLE OF VARCHAR2(4000);
tNIVEL                     VAR;
t_local_code       VAR;
tPERM                VAR;
tVAL_PERM          VAR;
temp1 VAR;
temp2 VAR;
temp3 VAR;
temp4 VAR;
temp5 VAR;
temp6 VAR;
temp7 VAR;
BEGIN
 vQuery:='select z.nivel, y.cod_local_perm, z.permiso,y.valor_permiso     valor_perm,';
 FOR i IN 2 .. p_checkboxes.COUNT LOOP
            IF i <> p_checkboxes.LAST THEN
             vQuery:=vQuery||' fun_perm_perm('||p_checkboxes(i)||',c.cod_local_perm ),';
            ELSE
             vQuery:=vQuery||' fun_perm_perm('||p_checkboxes(i)||',c.cod_local_perm )  ';
            END IF; 
            END LOOP;
               from (select distinct level NIVEL,a.COD_MASTER , b.cod_local_perm, lpad(chr(9),level,chr(9)) || replace(replace(replace(A.nom_permiso, '' " '' ,null) ,chr(10),null),chr(13),null) PERM  ';

 vQuery:=vQuery||'  from TABLE1 A, TABLE2 B
                WHERE B.COD_MASTER_SAP = A.COD_MASTER_SAP 
                and B.TIPO_SAP =''SAP_VIEJO'' 
                start with a.cod_master_sap_padre IS NULL 
                connect by prior a.COD_MASTER_SAP = a.cod_master_sap_padre ) z,  sap_perm_revisar y
                where    y.id_det = '||p_checkboxes(1)||'
                AND   y.cod_local_perm = z.cod_local_perm         
                order by y.cod_local_perm';
END;
` 

选择只是一个示例,为了向您显示我将根据复选框获得一个新列我的问题是当我执行查询时执行此操作:

     EXECUTE IMMEDIATE vQuery
   BULK COLLECT INTO   tNIVEL,
                                   tNIVEL ,
                                   tPERM,
                                   tVAL_perm,
                                   temp1
                                   ...
                                   tempn;

- 我需要声明我已选择的相同数量的复选框。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

如果列表没有(合理的)上限,我同意Justin。

如果它是一个定义良好的列表,如果列而不是太多,你也可以尝试生成一个SQL语句,它总是用虚拟值填充列表,如NULL。

想象一下以下3个总是返回3列的案例:

SELECT NULL, a2, a3 FROM myTable;
SELECT a1, a2, a3 FROM myTable;
SELECT a1, a2, NULL FROM myTable;