如何将多行游标作为表格报告

时间:2017-08-21 18:55:48

标签: stored-procedures plsql cursor dynamic-sql

亲爱的朋友们,我做到了这一点:

    FUNCTION ALL_CLIENTS_DATA
    ( client_in IN varchar2)
    RETURN sys_refcursor
    IS c1 sys_refcursor;
    BEGIN
    OPEN c1 FOR
    Select TO_CHAR('SELECT '''||ATR_NOMBRE_ATRIBUTO||''','||ATR_VALOR_ATRIBUTO||' FROM '||ATR_VALOR_TABLA||' WHERE NRO_CLIENTE='''||client_in||''';')FROM GNT_ATRIBUTO WHERE ATR_TAB_IDENTIFICADOR = 7;
    RETURN c1;
    END;

并将其作为光标/功能值接收:

    SELECT 'Estado',TO_CHAR(DECODE(estado,0,'ACTIVO',1,'ELIMINADO',2,'RETIRADO',3,'NUEVO',4,'PROCESO DE RETIRO','No Disponible')) FROM cliente WHERE NRO_CLIENTE='253417';
    SELECT 'SED-Cuadro-Llave',cadena FROM cliente WHERE NRO_CLIENTE='253417';
    SELECT 'Sector',to_char(sector) FROM cliente WHERE NRO_CLIENTE='253417';
    SELECT 'Zona',to_char(zona) FROM cliente WHERE NRO_CLIENTE='253417';
    .
    .
    .

如果我执行line for line(单独测试):

Estado  ACTIVO
SED-Cuadro-Llave    00100S / 21 / 3SP
Sector  89
Zona    291
.
.
.

我只是不知道如何在一次执行中显示我的最终结果。请帮忙。

1 个答案:

答案 0 :(得分:0)

如果你想要一行中的所有属性,你需要从GNT_ATRIBUTO的结果集中组装一个查询,然后打开它的光标。

FUNCTION ALL_CLIENTS_DATA
    ( client_in IN varchar2)
    RETURN sys_refcursor
IS 
    stmt varchar2(32767);
    c1 sys_refcursor;
  l_tgt_table varchar2 (32767);
BEGIN
    stmt := 'select ';
    for lrec in ( 
        Select ATR_NOMBRE_ATRIBUTO
                , ATR_VALOR_ATRIBUTO
                , ATR_VALOR_TABLA
                , rownum as rn
        from GNT_ATRIBUTO 
        where ATR_TAB_IDENTIFICADOR = 7     
    )
    loop    
        if lrec.rn > 1 then
            stmt := stmt || ',';
        end if;
        stmt := stmt || lrec.ATR_VALOR_ATRIBUTO 
                     || ' as "' || lrec.ATR_NOMBRE_ATRIBUTO || '"';
    l_tgt_table := lrec.ATR_VALOR_TABLA;
    end loop;
    stmt := stmt || ' from ' || l_tgt_table
                 || ' WHERE NRO_CLIENTE= :p1 ';
    OPEN c1 FOR stmt using client_in;
    RETURN c1;
END;