Me gustaría escribir una función con dos IN
parámetros donde el primero es ay varchar
el segundo una lista de varchars
. En base a estos, quiero devolver una tabla con cantidades variables de columna y nombres de tipo varchar
.
Por lo que he visto, siempre tengo que crear un objeto / registro y un tipo de tabla. ¿Esto significa que mi idea no funcionará? El objetivo subyacente es pasar una salida del comando del sistema a un destinatario como una tabla.
Editar: más sobre la tarea. Quiero emitir un comando del sistema operativo, consumir el resultado y devolverlo como una tabla. El resultado del comando del sistema operativo será datos con formato CSV. En el momento de la ejecución, no sé la cantidad de filas que se devolverán, sino solo la cantidad de columnas que se pasa como el segundo argumento. Estaba pensando en usar Java con una dinámica STRUCT
y ARRAY
contenerlos. Aunque preferiría el enfoque anterior.
Debe tener un aspecto como este:
create function(clob query, list of varchars cols) returns table
begin
execute system command(query, cols);
examine sysout from command;
return tabular data from syscmd as table;
end
fuente
Respuestas:
Es posible, aunque bastante complicado, escribir una función de tabla canalizada que devuelva una estructura variable . La función de la tabla de canalización podría tomar los dos argumentos y utilizar la interfaz de Oracle Data Cartridge y la magia del tipo AnyDataSet para devolver una estructura dinámica en tiempo de ejecución. Luego puede usar eso en las siguientes declaraciones SQL como si fuera una tabla, es decir
Un par de referencias más que analizan la misma implementación de muestra
fuente
Creo que su mejor enfoque es abandonar el intento de devolver una tabla dinámica (aunque supongo que podría crear una tabla temporal y devolverle un refcursor, pero no estoy seguro aquí).
Mi enfoque preferido aquí sería generar resultados en un formato más flexible, algo así como un documento XML o similar y devolverlo. Esto le brinda la flexibilidad que necesita sin tener que determinar las columnas después del escaneo de funciones.
fuente
puede crear una vista tmp y reemplazar la vista dinámicamente.
resultados de ejecución:
fuente
Una solución sería crear una tabla externa basada en la salida de Lucene. Puede modificar fácilmente la definición de tabla externa (y señalarla a varios archivos).
Entonces tendrás:
fuente