Oracle - sélectionnez une colonne spécifique à partir d'un curseur ref
J'ai une table nommée Table1. Il a beaucoup de colonnes, l'un d'eux est Colonne1. Je ne connais pas les autres colonnes, ils peuvent même changer parfois. Il est fortement typé ref type de curseur qui renvoie Table1%rowtype, nommé cur_Table1. J'ai une procédure stockée nommée SP1 qui a un paramètre de sortie de type cur_Table1. Je vais appeler ce SP1 procédure stockée à partir d'une autre base de données qui ne voit que cette procédure stockée, mais pas sur la table ou le type lui-même. Comment puis-je sélectionner uniquement Colonne1 de l'retourné curseur? Je sais que je peux aller chercher dans un dossier ou des variables autant que le curseur a des colonnes, mais je sais seulement d'une colonne de l'existence, donc je ne peux pas déclarer le dossier complet ou correct certain nombre de variables.
J'ai fait un "grant execute sur la SP à l'autre", mais n'a pas accordé à rien d'autre, pas sur la table ou les types de package. Et il fonctionne.
Oh, et dans la partie appelante, j'ai mis le paramètre de sortie de la SP en une sys_refcursor, bien sûr.
OriginalL'auteur fejesjoco | 2012-04-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire cela avec
DBMS_SQL
, mais ce n'est pas joli.Tableau et les données de l'échantillon (COLONNE1 a les numéros 1 à 10):
Paquet avec une procédure qui ouvre un curseur de référence et sélectionne tout:
PL/SQL bloc qui lit COLONNE1 de données à partir du curseur ref:
OriginalL'auteur Jon Heller
Donnée à la question d'origine, jonearles la réponse est toujours correct, donc je vais le laisser marqués comme tels, mais j'ai fini par faire quelque chose de complètement différent et beaucoup mieux.
Le problème a été/est que je n'ai pas de contrôle sur le SP1 de base de données, je n'ai qu'à l'appeler à partir d'ailleurs, comme un 3ème partie client. Maintenant, j'ai réussi à obtenir la permission de le voir, non seulement la SP, mais aussi le type du curseur. Je ne vois pas le tableau, mais il est maintenant beaucoup plus propre solution:
Dans l'autre base de données, j'ai eu accès à ce type maintenant:
Donc dans ma base de données je peux le faire maintenant:
Voir, je n'ai toujours pas besoin d'un accès à la table, je vois le curseur. La clé est que la magie %rowtype fonctionne pour les curseurs ainsi, non seulement les tables. Il ne fonctionne pas sur un sys_refcursor, mais il le fait sur un fortement typé. Compte tenu de ce code, je n'ai pas de soins si rien ne change sur l'autre côté, je n'ai pas à définir toutes les colonnes ou les enregistrements à tous, je viens de spécifier une colonne je suis intéressé.
J'adore vraiment cette attitude au sujet de la programmation orientée objet Oracle.
OriginalL'auteur fejesjoco
Ne sais pas si c'est possible ou pas, mais ne serait pas une meilleure solution serait de créer une fonction qui renvoie la valeur spécifique que vous cherchez? Qui évite la surcharge de l'envoi de données supplémentaires. Alternativement, vous pouvez définir un curseur avec un ensemble de domaines connus à ce que les deux parties connaissent.
OriginalL'auteur DCookie