2016-02-26 1 views
0

En Tsql je peux exécuter une procédure stockée dans l'Analyseur de requêtes et visualiser le contenu d'une requête ResultSet là fenêtre de l'analyseur sans savoir quoi que ce soit au sujet de la structure de la requête (tables, colonnes, ...)Comment afficher le contenu d'un resultset dans Toad à partir d'une procédure stockée avec un nombre inconnu de colonnes?

échantillons --Tsql exec myproc parm1, parm2, parm3

Maintenant je travaille avec PLsql et Toad (que je suis relativement nouveau chez Toad). J'ai besoin de voir le contenu d'un jeu de résultats d'une procédure stockée alambiquée, et je ne sais pas quel est le nombre de colonnes - et encore moins leurs types de données (ce proc est composé de plusieurs sous-requêtes bizarres - que je peux voir individuellement , mais ils sont pivotés, et le nombre de colonnes varie dans le résultat final). Comment puis-je voir le contenu de ce résultat dans Toad quand j'exécute la procédure quand je ne sais pas combien de colonnes il y a ou leurs types de données? Ci-dessous est le code que j'ai rassemblé pour voir le contenu d'un ensemble de résultats de procédures stockées où je sais combien de colonnes il y a et leurs types de données à l'avance. Dans mon exemple de code ci-dessous, j'utilise un sys_refcursor que j'ai appelé x_out et je crée également une table temporaire pour stocker le contenu du resultset pour une visualisation supplémentaire. Est-ce que je peux faire ceci quand je ne sais pas combien de colonnes il y a dans le resultset? Comment faire cela avec PLsql - Toad?

create global temporary table tmpResult (fld1 number, fld2 varchar(50), fld3 date); 

declare 
    x_out sys_refcursor; 
    tmpfld1 number; 
    tmpfld2 varchar2(50); 
    tmpfld3 date; 

BEGIN 
    myschema.mypkg.myproc(parm1, parm2, x_out); 

LOOP 
    FETCH x_out INTO tmpfld1, tmpfld2, tmpfld3; 
    DBMS_OUTPUT.Put_Line ('fld1:-- '||tmpfld1||': fld2:-- '||tmpfld2||': fld3:-- '||tmpfld3); 

-- I also insert the result set to a temp table for additional viewing of the data from the stored procedure 

    Insert Into tmpResult values(tmpfld1, tmpfld2, tmpfld3);   
    EXIT WHEN x_out%NOTFOUND;  

END LOOP; 

END; 
+0

Quelle version de crapaud? –

+0

supposé être 11g –

Répondre

0

Crapaud peut automatiquement récupérer le curseur pour vous. Vous avez quelques options, # 3 est peut-être le plus facile si vous voulez juste voir les données.

  1. Si vous avez le myschema.mypkg chargé dans l'éditeur, vous pouvez frapper F11 pour l'exécuter. Dans la boîte de dialogue qui s'affiche, sélectionnez votre membre de package à gauche et sélectionnez l'onglet Options de sortie. Cochez l'option pour extraire les résultats du curseur ou utiliser les options de sortie du SGBD. Cliquez sur OK et le package s'exécute. En fonction de votre version de Toad, vous verrez une grille en bas de l'éditeur pour vos résultats ou vous verrez un onglet de résultats PL/SQL. Si vous voyez ce dernier, cliquez deux fois sur la valeur (CURSOR) dans la colonne de sortie pour votre argument de sortie. Je suggère d'utiliser l'option d'extraction tant que votre ensemble de données n'est pas si grand que cela entraînera des erreurs de mémoire insuffisante.

  2. Recherchez votre package dans le navigateur de schéma et cliquez sur Exécuter, puis sur Exécuter le package. Vous verrez le même dialogue que mentionné dans # 1. Suivez les étapes restantes là-bas.

  3. Utilisez une variable de liaison provenant d'un bloc anonyme. En utilisant votre exemple, vous voudriez quelque chose comme ça ...

    declare x_out sys_refcursor; begin myschema.mypkg.myproc(parm1, parm2, x_out); :retval := x_out; end;

Exécuter avec cette F9 dans l'éditeur. Dans la fenêtre contextuelle Bind Variable, définissez le type de données de retval sur Cursor. Cliquez sur OK. Vos résultats sont ensuite affichés dans la grille de données. Encore une fois si votre jeu de données est très grand, vous pouvez manquer de mémoire ici.

+0

Excellent! J'ai trouvé un autre moyen de le faire - pas aussi cool que votre chemin, mais une option (celui-ci ne fait pas le pivot) –

+0

Excellent. J'ai trouvé un autre moyen - en essayant de le poster. –

0

StackOverflow ne pas me laisser poster cette autre solution:

J'essayer de poster une partie de cette autre solution (si SOF me permet) - ce 2ème semestre de l'autre façon:

BEGIN 
myschema.mypkg.myproc(parm1, parm2, parm3 x_out); 

FOR rec_ IN get_columns LOOP 
    DBMS_OUTPUT.put_line(rec_.name || ': ' || rec_.VALUE); 
END LOOP; 
END; 
+0

S'agit-il d'un lien vers un autre site? Je ne sais pas pourquoi cela ne vous laisserait pas publier, mais je sais que publier des liens vers d'autres sites est fortement déconseillé. Par exemple, il existe des blogs suggérant d'utiliser la commande SQL * Plus "print", mais pour une seule instruction, l'utilisation du moteur de script de Toad est déconseillée. –

0

et ici est la 1ère moitié de l'autre façon:

DECLARE 
x_out SYS_REFCURSOR; 

CURSOR get_columns IS 

...

+0

voici une autre partie de la première moitié --- SELECT t2.column_value.getrootelement() nom, EXTRACTVALUE (t2.column_value, 'node()') VALEUR –

+0

et voici près de la dernière partie de la 1ère moitié de l'autre chemin --- –

+0

Je semble avoir un problème pour poster l'expression xmlsequence (x_out) mais c'est ce que l'autre utilise pour faire une lecture de contenu similaire d'un curseur –