Je voudrais écrire une fonction avec deux IN
paramètres où le premier est un varchar
et le second une liste de varchars
. Sur la base de ceux-ci, je veux retourner un tableau avec différents montants de colonnes et noms de type varchar
.
Pour autant que je l'ai vu, je dois toujours créer un objet / enregistrement et un type de table. Cela signifie que mon idée ne fonctionnera pas? L'objectif sous-jacent est de transmettre une sortie de commande système à un appelé en tant que table.
Edit: plus sur la tâche. Je veux émettre une commande OS, consommer la sortie et la renvoyer sous forme de tableau. La sortie de la commande OS va être des données au format CSV. Au moment de l'exécution, je ne connais pas la quantité de lignes à renvoyer mais seulement la quantité de colonnes qui est passée comme deuxième argument. Je pensais à utiliser Java avec une dynamique STRUCT
et à les ARRAY
contenir. Bien que je préfère l'ancienne approche.
Ça devrait ressembler à ça:
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
la source
Réponses:
Il est possible, bien que très compliqué, d'écrire une fonction de table en pipeline qui renvoie une structure variable . Votre fonction de table de pipeline pourrait prendre les deux arguments et utiliser l'interface Oracle Data Cartridge et la magie du type AnyDataSet pour renvoyer une structure dynamique au moment de l'exécution. Vous pouvez ensuite l'utiliser dans les instructions SQL suivantes comme s'il s'agissait d'une table, c'est-à-dire
Quelques références supplémentaires qui discutent du même exemple d'implémentation
la source
Je pense que votre meilleure approche est d'abandonner la tentative de renvoyer une table dynamique (bien que je suppose que vous pourriez créer une table temporaire et lui renvoyer un refcurseur, mais je ne suis pas sûr ici).
Mon approche préférée ici serait de générer des résultats dans un format plus flexible, quelque chose comme un document XML ou similaire et de le renvoyer. Cela vous donne la flexibilité dont vous avez besoin sans avoir à déterminer les colonnes après l'analyse des fonctions.
la source
vous pouvez créer une vue tmp et remplacer la vue dynamiquement.
résultats d'exécution:
la source
Une solution serait de créer une table externe basée sur la sortie Lucene. Vous pouvez facilement modifier la définition de table externe (et la pointer vers plusieurs fichiers).
Vous aurez donc:
la source