亲爱的朋友们,我做到了这一点:
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
.
.
.
我只是不知道如何在一次执行中显示我的最终结果。请帮忙。
答案 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;