DBMS_OUTPUT.PUT_LINE ne s'imprime pas

93

Lors de l'exécution du code suivant, il indique simplement que la procédure est terminée et n'imprime pas les informations que je veux (firstName, lastName), puis les autres valeurs de la requête de sélection dans un tableau ci-dessous.

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
 AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
 a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');

end loop;
END PRINT_ACTOR_QUOTES;
/ 

Lors de la configuration de la sortie serveur, j'obtiens

a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName

plusieurs fois!

Dexter
la source

Réponses:

191

Qu'est-ce que «ça» dans la déclaration «il dit simplement que la procédure est terminée»?

Par défaut, la plupart des outils ne configurent pas de tampon pour dbms_outputécrire et n'essaient pas de lire à partir de ce tampon après l'exécution du code. La plupart des outils, en revanche, ont la capacité de le faire. Dans SQL * Plus, vous devez utiliser la commande set serveroutput on [size N|unlimited]. Alors tu ferais quelque chose comme

SQL> set serveroutput on size 30000;
SQL> exec print_actor_quotes( <<some value>> );

Dans SQL Developer, vous devez View | DBMS Outputactiver la fenêtre de sortie du SGBD, puis appuyer sur l'icône plus verte pour activer la sortie du SGBD pour une session particulière.

De plus, en supposant que vous ne souhaitiez pas imprimer le littéral "a.firstNamea.lastName" pour chaque ligne, vous voudrez probablement

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
Justin Cave
la source
Désolé, lors de l'exécution de la procédure ci-dessus, le message est la procédure PL / SQL terminée avec succès. J'utilise SQL plus
dexter
8
@dexter - OK. Ensuite, il vous suffit d'ajouter la set serveroutput oncommande avant d'exécuter la procédure dans SQL * Plus.
Justin Cave
@dexter - C'est vrai. Voir mon commentaire à la fin - si vous ne voulez pas ce littéral pour chaque ligne, vous voudrez probablement la syntaxe que j'ai publiée à la fin de ma réponse.
Justin Cave
Ok alors maintenant il affiche les noms corrects mais comme 100 fois. comment pourrais-je afficher le titre, l'année, le nom de rôle, la citation dans un tableau ci-dessous au lieu des centaines de noms qui apparaissent
dexter
@dexter - Si vous déclarez que chaque nom est répété des centaines de fois, et que ce n'est pas ce à quoi vous vous attendez, cela implique que votre SELECTinstruction est incorrecte et qu'il manque probablement une condition de jointure. Vous voudrez affiner votre requête (que vous pouvez exécuter séparément sans la procédure) jusqu'à ce que la requête renvoie les données attendues.
Justin Cave
21
  1. Assurez-vous que votre fenêtre de sortie Dbms est ouverte via l'option d'affichage dans la barre de menus.
  2. Cliquez sur le signe vert '+' et ajoutez le nom de votre base de données.
  3. Écrivez "DBMS_OUTPUT.ENABLE;" dans votre procédure comme première ligne. J'espère que ceci résoudra votre problème.
Atul Patel
la source
14

Cette déclaration

DBMS_OUTPUT.PUT_LINE ('a.firstName' || 'a.lastName');

signifie imprimer la chaîne telle quelle .. supprimer les guillemets pour obtenir les valeurs à imprimer. La syntaxe correcte est donc

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
asura
la source
13

Définir la requête comme ci-dessous à la première ligne

SET SERVEROUTPUT ON 
Sreenath S
la source
même son ne fonctionne pas .. Veuillez fournir une autre alternative
Lova Chittumuri
Juste pour être très clair. La ligne que Sreenath S a suggérée passe en premier et se trouve en dehors de tous les blocs de code comme DECLARE et BEGIN / END. J'ai essayé de le faire d'abord dans mon bloc DECLARE qui ne fonctionne pas. J'utilise SQL * Plus.
Grant Johnson
1

J'utilise Oracle SQL Developer,

Dans cet outil, je devais activer la sortie du SGBD pour afficher les résultats imprimés par dbms_output.put_line

Vous pouvez trouver cette option dans le volet des résultats où d'autres résultats de requête sont affichés. donc, dans le volet des résultats, j'ai 7 onglets. Le premier onglet nommé Résultats, le suivant est Sortie de script et ainsi de suite. Hors de cela, vous pouvez trouver un onglet nommé "Sortie SGBD" sélectionnez cet onglet, puis la 1ère icône (ressemble à une icône de dialogue) est Activer la sortie SGBD . Cliquez sur cette icône. Ensuite, vous exécutez le PL / SQL, puis sélectionnez "onglet Sortie SGBD, vous devriez pouvoir voir les résultats là-bas.

John Prawyn
la source
0

Tous se concentrent sur la boucle for, mais si nous utilisons une boucle normale, nous devions utiliser la variable d'enregistrement du curseur. Ce qui suit est le code modifié

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
    AS
    CURSOR quote_recs IS
    SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
    rolequote rq, actor a, movie m
    where
    rq.quoteID = q.quoteID
    AND
    rq.roleID = r.roleID
     AND
    r.actorID = a.actorID
    AND
    r.movieID = m.movieID
    AND
     a.actorID = id_actor;
    recd quote_recs%rowtype;
    BEGIN
    open quote_recs;
    LOOP
    fetch quote_recs into recs;
    exit when quote_recs%notfound;
    DBMS_OUTPUT.PUT_LINE(recd.firstName||recd.lastName);
    end loop;
    close quote_recs;
    END PRINT_ACTOR_QUOTES;
    / 
Smart003
la source