Est-il possible de la sortie d'une instruction SELECT à partir d'un PL/SQL bloc?
Comment puis-je obtenir un PL/SQL bloc en sortie les résultats d'une SELECT
déclaration de la même manière que si j'avais fait une plaine SELECT
?
Par exemple comment faire un SELECT
comme:
SELECT foo, bar FROM foobar;
Astuce :
BEGIN
SELECT foo, bar FROM foobar;
END;
ne fonctionne pas.
- Je n'ai pas envie l'un de l'répondu répondu à cette question. Je suis un PL/SQL noob et je vais avoir de la difficulté à trouver comment obtenir le jeu de résultats d'une instruction select simple de le montrer dans DBVisualizer lorsqu'il est exécuté à partir de l'intérieur d'un PL/SQL bloc. Il peut être une réponse assez facile, mais comme un MSSQL utilisateur, je suis perdu ici. J'ai essayé de Googler un peu, mais je n'ai pas tombé sur la réponse sinon je serait bien de l'ajouter moi-même.
- Sergey réponse est assez complète, mais vous souhaitez le voir visualisées dans un analogue de l'outil (SQL Developer vs DBVisualizer), check this out thatjeffsmith.com/archive/2012/03/dbms_output-in-sql-developer
- Si vous travaillez au sein d'un seul PL/SQL bloc et peut-être que vous utilisez Oracle SQL Developer pour accéder à votre base de données à l'aide de
dbms_output.put_line()
est de savoir comment vous feriez cela. D'autre part, si vous êtes à la compilation de ce code dans votre Oracle Databse comme un Paquet ou une Fonction, vousPIPE
les données à l'aide dePIPE ROW(r);
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que vous avez besoin de la raison pour.
Si vous êtes sûr qu'il va y avoir seulement 1 ligne, utilisez curseur implicite:
Si vous souhaitez sélectionner plus de 1 ligne, vous pouvez utiliser un curseur explicite:
ou utiliser un autre type de curseur:
Vous pouvez le faire dans Oracle 12.1 ou ci-dessus:
Je n'ai pas DBVisualizer pour faire des tests, mais que devrait être votre point de départ.
Pour plus de détails, voir Implicite des Ensembles de résultats dans le Oracle 12.1 Guide Des Nouvelles Fonctionnalités, Oracle De Base etc.
Pour les versions antérieures, selon l'outil que vous pourriez être en mesure d'utiliser curseur ref lier des variables comme cet exemple de SQL*Plus:
rc
variable comme un curseur dans le panneau inférieur, puis après l'exécution du bloc, vous pouvez cliquer sur la variable.À partir d'un bloc anonyme? J'aimerais en savoir plus sur la situation où vous pensez que nécessaire, parce qu'avec sous-requête d'affacturage clauses et en ligne points de vue c'est assez rare que vous avez besoin de recourir à PL/SQL pour autre chose que les situations les plus complexes.
Si vous pouvez utiliser une procédure nommée ensuite utiliser pipeline fonctions. Voici un exemple tiré de la documentation:
Créer une fonction dans un colis en retour un SYS_REFCURSOR:
Le classique “Hello World!” bloc contient un exécutable section qui appelle la
DBMS_OUTPUT.PUT_LINE
procédure pour afficher du texte à l'écran:Vous pouvez télécharger ici:
http://www.oracle.com/technetwork/issue-archive/2011/11-mar/o21plsql-242570.html
si vous voulez voir de sélectionner la sortie de la requête en pl/sql, vous devez utiliser un curseur explicite. Qui tiendra active de l'ensemble de données et par l'extraction de chaque ligne à un moment il va montrer à tout le dossier de l'ensemble de données aussi longtemps qu'elle récupère l'enregistrement des données fixées par l'itération dans la boucle. Ces données ne seront pas générés sous forme de tableaux, ce résultat sera au format texte brut. Espérons que ce sera utile. Pour toute autre question, vous pouvez demander....
Pour les versions ci-dessous 12c, la réponse est simple PAS, au moins pas de la façon qu'il est fait est SQL Server.
Vous pouvez imprimer les résultats, vous pouvez insérer les résultats dans des tableaux, vous pouvez retourner les résultats que les curseurs de l'intérieur de la fonction/procédure ou de restitution d'un ensemble de lignes à partir de la fonction -
mais vous ne peut pas exécuter l'instruction SELECT, sans faire quelque chose avec les résultats.
SQL Server
/* 3 ensembles de résultats retournés */
Oracle
Vous devez utiliser Natif SQL dynamique. Aussi, vous n'avez pas besoin de COMMENCER à la FIN de l'exécuter la commande SQL:
utiliser exécuter déclaration immédiate
comme:
Même si la question est vieux, mais je vais partager la solution qui répond parfaitement à la question :
Les curseurs sont utilisés lorsque vous sélectionnez requête retourne plusieurs lignes. Donc, plutôt à l'aide du curseur dans le cas où vous souhaitez agrégats ou simples rowdata vous pouvez utiliser une fonction/procédure sans curseur en tant que bien comme
Et puis il suffit d'appeler la procédure
C'est l'utilisation réelle de la fonction/procédure pour la plupart d'emballage et de stockage des requêtes complexes ou qui nécessite des manipulations répétées avec la même logique, mais différentes données