ok, ledsen att detta inte är komplett, men för att följa upp @Lukas, här är vad jag har hittills:
Först, istället för att försöka skapa valfri data/valfri typ, försökte jag använda XML extraherad från en markör... konstigt, men det är generiskt:
CREATE OR REPLACE procedure printCur(in_cursor IN sys_refcursor) IS
begin
FOR c IN (SELECT ROWNUM rn,
t2.COLUMN_VALUE.getrootelement () NAME,
EXTRACTVALUE (t2.COLUMN_VALUE, 'node()') VALUE
FROM TABLE (XMLSEQUENCE (in_cursor)) t,
TABLE (XMLSEQUENCE (EXTRACT (COLUMN_VALUE, '/ROW/node()'))) t2
order by 1)
LOOP
DBMS_OUTPUT.put_line (c.NAME || ': ' || c.VALUE);
END LOOP;
exception
when others then raise;
end;
/
Nu, för att kalla det, behöver du en markör, så jag försökte casta till markören i pl/sql, något i stil med:
open v_cur for select * from table(cast(v_tab as tab_type));
Men beroende på hur v_tab definieras, kan detta eller inte orsaka problem i pl/sql cast (att använda %rowtype i kapslad tabell def verkar ge problem).
Hur som helst, du kan bygga vidare på detta eller förfina det som du vill. (och eventuellt använd xmltable...)
Hoppas det hjälper