Comment obtenez-vous bien mis en forme les résultats d'un Oracle procédure qui retourne une référence curseur?
Dans MS SQL Server si je veux vérifier les résultats à partir d'une procédure Stockée je peut exécuter les opérations suivantes dans Management Studio.
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
La sortie dans le volet de résultats pourrait ressembler à ceci.
ID Title ViewCount Votes
----- ------------------------------------------------- ---------- --------
2165 Indexed View vs Indexes on Table 491 2
5068 SQL Server equivalent to Oracle’s NULLS FIRST 524 3
1261 Benefits Of Using SQL Ordinal Position Notation? 377 2
(3 row(s) affected)
Pas besoin d'écrire des boucles ou des instructions d'IMPRESSION.
De faire la même chose dans Oracle je pourrais exécuter bloc anonyme dans SQL Developer
--ORACLE WAY
DECLARE
OUTPUT MYPACKAGE.refcur_question;
R_OUTPUT MYPACKAGE.r_question;
USER VARCHAR2(20);
BEGIN
dbms_output.enable(10000000);
USER:= 'OMG Ponies';
recordCount := 0;
MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,
p_USER=> USER,
) ;
DBMS_OUTPUT.PUT_LINE('ID | Title | ViewCount | Votes' );
LOOP
FETCH OUTPUT
INTO R_OUTPUT;
DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE
'|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES);
recordCount := recordCount+1;
EXIT WHEN OUTPUT % NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount);
CLOSE OUTPUT;
END;
Ce sorties comme
ID|Title|ViewCount|Votes
2165|Indexed View vs Indexes on Table|491|2
5068|SQL Server equivalent to Oracle’s NULLS FIRST|524|3
1261|Benefits Of Using SQL Ordinal Position Notation?|377|2
Record Count: 3
Donc la version SQL a 1 et de la ligne de l'oracle a 18 ans et la sortie est laid. Son exacerbé s'il y a un grand nombre de colonnes et/ou les données numériques.
Ce qui est bizarre pour moi, c'est que si j'écris cette instruction SQL Developer ou de Gestion de studio...
SELECT
ID,
Title,
ViewCount,
Votes
FROM votes where user = 'OMG Ponies'
Les résultats sont assez semblables. Ce qui me fait sentir comme je suis absent d'une technique ou d'utiliser le mauvais outil.
OriginalL'auteur Conrad Frix | 2010-08-19
Vous devez vous connecter pour publier un commentaire.
Si
GetQuestions
est une fonction retournant un refcursor, qui semble être ce que vous avez dans la version de SQL Server, puis assez vous pouvez être en mesure de faire quelque chose comme ceci:Ou si vous en avez besoin dans une PL/SQL bloc, alors vous pouvez utiliser le même sélectionner dans un curseur.
Vous pouvez aussi avoir la fonction de produire de l'
dbms_output
plutôt les instructions de sorte qu'ils sont toujours disponibles pour le débogage, bien que cela ajoute un peu de surcharge.Modifier
Hmmm, pas sûr que c'est possible de
cast()
le retour de l'refcursor à un produit de type, sauf si vous êtes prêts à déclarer votre propre type (et un tableau de ce type) à l'extérieur du colis. Vous pouvez faire cela, juste pour vider les résultats:Et vous pouvez utiliser le résultat de l'appel à une autre procédure ou de fonction; c'est juste à l'extérieur PL/SQL qui semble être un peu délicat.
Edité pour ajouter: Avec cette méthode, si c'est une procédure que vous pouvez faire essentiellement la même chose:
select
déclarations qui ne sont pas liés à un curseur. Obtenir les résultats de l'exécution de cette procédure stockée est le même que les résultats d'uneselect
requête sur le côté client.Je devrais en savoir plus sur SQL Server un jour. Semble être l'équivalent serait une fonction qui renvoie un refcursor si, plutôt que d'une procédure avec un
OUT
paramètre, donc il peut être utilisé dans une requête à partir d'un plan de SQL?MyPackage.GetQuestions est une procédure. par exemple, la PROCÉDURE GETQUETSIONS(sortie EN DEHORS MYPACKAGE.refcur_question, l'utilisateur, EN VARCHAR2). Quand j'ai attaché votre technique je obtenir identifiant invalide erreurs
Je pensais que vous pourriez en faire une fonction à la place;
FUNCTION GETQUESTIONS(user IN VARCHAR2) RETURNS refcur_question
. Mais vous ne pouvez pas être en mesure de la modifier; et à partir de la mémoire vous pouvez définir le type de retour (refcur_question
) dans le schéma de niveau, pas à l'intérieur du paquet, mais ça fait un moment...Si vous souhaitez conserver la procédure existante, essayez
exec mypackage.getquestions(:r, 'OMG Ponies');
au lieu d'avoir la fonction supplémentaire de faire la conversion. Je l'avais fixé sur une fonction car je pensais qu'il aurait coulé, mais comme il n'est pas une procédure est bien (et peut-être plus "standard"). Vous avez donc encore 3 lignes de remplacer votre original 18 *8-)OriginalL'auteur
SQL Developer automatiquement des captures de la sortie de l'exécution de procédures stockées. L'exécution de la procédure stockée directement à partir de notre procédure de l'éditeur, vous pouvez voir ce comportement détaillé dans mon post ici
SQL Developer Astuce: l'Affichage REFCURSOR de Sortie
Maintenant, si vous souhaitez exécuter le refcursor dans le cadre d'un anon bloc dans notre SQL Feuille de calcul, vous pourriez faire quelque chose de semblable à ce
--où GET_EMPS() serait votre sp_GetQuestions('OMG Poneys'). La commande d'IMPRESSION envoie la sortie de la "query" qui est couru par la procédure stockée, et ressemble à ceci:
Maintenant, vous avez dit 10g. Si vous êtes dans 12c, nous avons amélioré le PL/SQL moteur à l'appui de curseur implicite résultats. Cela devient un peu plus facile, plus besoin de régler le curseur, vous venez de faire un appel pour obtenir les données, comme indiqué ici:
http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230
Donc, vous voulez un 'run PL/SQL' fenêtre qui s'auto-saisir de la sortie, à l'instar de notre Procédure de l'Éditeur offre lors de l'exécution d'une seule unité? Pas une mauvaise idée...je vais le coup de pied autour du groupe et de voir où il va.
OriginalL'auteur
OriginalL'auteur