web-dev-qa-db-fra.com

DBMS_OUTPUT.PUT_LINE n'imprime pas

Lors de l'exécution du code suivant, il indique simplement que la procédure est terminée et n'imprime pas l'information que je souhaite (nom, prénom, nom), 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;
/ 

Lorsque je mets la sortie du serveur, je reçois 

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

plusieurs fois!

67
dexter

Qu'est-ce que "il" dans la déclaration "il est juste dit que la procédure est terminée"?

Par défaut, la plupart des outils ne configurent pas de mémoire tampon sur laquelle écrire dbms_output et ne tentent pas de lire à partir de cette mémoire tampon après l'exécution du code. La plupart des outils, en revanche, ont la capacité de le faire. En 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, accédez à View | DBMS Output pour activer la fenêtre de sortie du SGBD, puis appuyez 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 souhaiterez probablement

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;
143
Justin Cave

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.Ainsi, la syntaxe correcte est 

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
14
Jeevi
  1. Assurez-vous d’avoir ouvert la fenêtre Dbms Output à l’aide de l’option Afficher de la barre de menus.
  2. Cliquez sur le signe vert '+' et ajoutez votre nom de base de données.
  3. Écrire 'DBMS_OUTPUT.ENABLE;' dans votre procédure en première ligne ……. espérons que cela résoudra votre problème.
13
Atul Patel

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

SET SERVEROUTPUT ON 
3
Sreenath S

J'utilise Oracle SQL Developer, 

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

Vous pouvez trouver cette option dans le volet de résultats où d'autres résultats de requête sont affichés. Donc, dans le volet des résultats, j'ai 7 onglets. 1er onglet nommé Résultats, le suivant est Sortie de script, etc. En dehors de cela, vous pouvez trouver un onglet nommé "Sortie du SGBD", sélectionnez cet onglet, puis la 1ère icône (qui ressemble à une icône de dialogue) est Activer la sortie du 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.

1
John Prawyn

Tous se concentrent sur la boucle for, mais si nous utilisons une boucle normale, nous devons 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;
    / 
0
Smart003