web-dev-qa-db-fra.com

définir la sortie du serveur dans la procédure Oracle

J'ai créé une procédure simple. Dans cette procédure, je veux sortir des données. Cependant où jamais je mets définir la sortie du serveur

ça dit 

Erreur (26,5): PLS-00103: Rencontre du symbole "SERVEROUTPUT" lorsqu’un des éléments suivants est attendu:. (), * @% & = - + </> at in est un mod reste non rem => <> ou! = ou ~ => = <= <> et ou like like2 like4 comme | membre multiset sous-groupe 

Peu importe où je le mets, il continue de le dire.

create or replace PROCEDURE discount  

is --- signature 

BEGIN --- executable part

update dvd set me_our_price = me_our_price*0.90 WHERE me_release_year = 2011;
update dvd set me_our_price = me_our_price*0.80 WHERE me_release_year = 2010;

update bluray set me_our_price = me_our_price*0.95 WHERE me_release_year = 2011;
update bluray set me_our_price = me_our_price*0.90 WHERE me_release_year = 2010;


DBMS_OUTPUT.PUT_LINE(' Blurays '); 
for i in ( 
SELECT e.mo_title, e.mo_bluray.me_list_price as me_list_price, e.mo_bluray.me_our_price    as  me_our_price FROM movie e  where e.mo_bluray is not null
 ) 
loop 

DBMS_OUTPUT.PUT_LINE(i.mo_title|| '  ' || i.me_list_price|| '  ' || i.me_list_price); 

end loop; 

DBMS_OUTPUT.PUT_LINE(' DVDs '); 
for i in ( 
set serveroutput on
SELECT e.mo_title, e.mo_dvd.me_list_price as me_list_price, e.mo_dvd.me_our_price as      me_our_price FROM movie e  where e.mo_dvd is not null
 ) 
loop 
DBMS_OUTPUT.PUT_LINE(i.mo_title|| '  ' || i.me_list_price|| '  ' || i.me_list_price); 
end loop; 


END discount; 
5
bicycle

Pour comprendre l'utilisation de "SET SERVEROUTPUT ON", prenons un exemple.

DECLARE
a number(10)  :=10;
BEGIN
dbms_output.put_line(a) ;
dbms_output.put_line('Hello World ! ')  ;
END ;

Avec une sortie: la procédure PL/SQl s’est terminée avec succès sans la sortie attendue

Et la raison principale est que, quoi que nous passions à l'intérieur de dbms_output.put_line ('ARGUMENT'/VALUES), c'est-à-dire ARGUMENT/VALUES, est stocké en interne dans un tampon dans une zone de mémoire SGA (zone globale partagée) jusqu'à 2000 octets.

* NOTE: *** Toutefois, il convient de noter que ce tampon n'est créé que lorsque nous utilisons le package ** dbms_output. Et nous devons définir la variable d'environnement une seule fois pour une session!

Et pour pouvoir le récupérer dans ce tampon, nous devons définir la variable d'environnement pour la session. Il est très confus pour les débutants que nous configurions la sortie du serveur (en raison de sa nomenclature), mais malheureusement, rien de tel. Utiliser SET SERVER OUTPUT ON indique simplement au moteur PL/SQL que

* Hé, s'il vous plaît, écrivez l’ARGUMENT/LES VALEURS que je vais transmettre à dbms_output.put_line
.__ et à son tour, le moteur d’exécution PL/SQl imprime l’argument sur la console principale.

Je pense que je suis clair pour vous tous. Je vous souhaite tout le meilleur ... Pour en savoir plus avec la structure architecturale de Oracle Server Engine, vous pouvez consulter ma réponse sur Quora http://qr.ae/RojAn8

Et pour répondre à votre question "Il faut utiliser SET SERVER OUTPUT au début de la session."

21
Ashish Burnwal

"SET serveroutput ON" est une commande SQL * Plus et n'est pas valide PL/SQL.

16
DCookie

Ajoutez d'abord le code suivant dans votre sp:

BEGIN
    dbms_output.enable();
    dbms_output.put_line ('TEST LINE'); 
END;

Compilez votre code dans votre développeur Oracle SQL. Alors allez dans la vue Menu -> sortie dbms. Cliquez sur Icon Green Plus et sélectionnez votre schéma. Lance ton sp maintenant.

5
Luis Armando
If you want to execute any procedure then firstly you have to set serveroutput on in the sqldeveloper work environment like.

->  SET SERVEROUTPUT ON;
-> BEGIN
dbms_output.put_line ('Hello World..');
dbms_output.put_line('Its displaying the values only for the Testing purpose');
END;
/
0
Bablu Gope

En fait, vous devez appeler SET SERVEROUTPUT ON; avant l'appel BEGIN.

Tout le monde a suggéré cela, mais ne donne aucun conseil sur l'endroit où placer réellement la ligne:

SET SERVEROUTPUT ON;

BEGIN
    FOR rec in (SELECT * FROM EMPLOYEES) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.EmployeeName);
    ENDLOOP;
END;

Sinon, vous ne verrez aucune sortie.

0
Steve Bauman