Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/06/2011, 22h33   #1
 
Inscription : décembre 2009
Messages : 51
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 51
Points : -10
Points : -10
Par défaut Informations relatives à un pays

Je me retrouve avec une requête PL/SQL que je trouve plus complexe la voici donc , aidez moi.

La table COUNTRIES est constituée de 3 attributs : country_id, country_name et region_id.
Ecrivez un bloc PL/SQL permettant d'afficher des informations relatives à un pays donné.
a. Déclarez un enregistrement PL/SQL en fonction de la structure de la table COUNTRIES.
b . Utilisez la commande DEFINE pour fournir l'ID du pays. Transmettez cette valeur au bloc PL/SQL via une variable de substitution iSQL*Plus.

c. Utilisez DBMS_OUTPUT.PUT_LINE pour afficher les informations relatives au pays.
bestcasaoui est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 10/06/2011, 00h23   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
a/ %TYPE %ROWTYPE
b/ DEFINE
c/ dbms_output.put_line

Propose nous un code et on t'aideras à l'améliorer si nécessaire...
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 31
Vieux 13/06/2011, 01h30   #3
 
Inscription : décembre 2009
Messages : 51
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 51
Points : -10
Points : -10
Voici ma requete:
mais ça marche pas.


Code :
1
2
3
4
5
6
7
 
declare
var_enregistrement COUNTRIES.id_countries%type
begin
SELECT * INTO var_afficher FROM countries WHERE id_countries=var_enregistrement
DBMS_OUTPUT.PUT_LINE(var_afficher);
End;
bestcasaoui est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 13/06/2011, 12h52   #4
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Bonjour,

C'est Quoi ?

Et Il faut déclarer un Enregistrement de type : plutôt que pour récupérer toute la ligne.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 13h16   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
SELECT INTO ne correspond pas à ton besoin :
Citation:
Cet ordre ne doit ramener qu'une ligne sous peine de générer l'exception NO_DATA_FOUND si aucune ligne n'est ramenée ou TOO_MANY_ROWS si plus d'une ligne sont ramenées
Tu as besoin d'un curseur.
Les curseurs for sont plus simples à lire et à écrire mais la question a/ sous-entend plutôt l'utilisation d'un curseur explicite.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 13h59   #6
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
Bonjour,

Il peut utiliser le puisque le besoin est
Code :
Ecrivez un bloc PL/SQL permettant d'afficher des informations relatives à un pays donné.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/06/2011, 14h06   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Effectivement le SELECT INTO correspond en fait au besoin
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 08h36   #8
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par bestcasaoui Voir le message
Je me retrouve avec une requête PL/SQL que je trouve plus complexe la voici donc , aidez moi.

La table COUNTRIES est constituée de 3 attributs : country_id, country_name et region_id.
Ecrivez un bloc PL/SQL permettant d'afficher des informations relatives à un pays donné.
a. Déclarez un enregistrement PL/SQL en fonction de la structure de la table COUNTRIES.
b . Utilisez la commande DEFINE pour fournir l'ID du pays. Transmettez cette valeur au bloc PL/SQL via une variable de substitution iSQL*Plus.

c. Utilisez DBMS_OUTPUT.PUT_LINE pour afficher les informations relatives au pays.
Pourquoi ne pas l'avoir essayé ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
 mhouri >CREATE TABLE countries(country_id number
  2  ,country_name  varchar2(30)
  3  ,region_id  number);
 
TABLE created.
 
 mhouri >INSERT INTO countries VALUES (1, 'Belgique',100);
 
1 row created.
 
 mhouri >INSERT INTO countries VALUES (2, 'France',200);
 
1 row created.
 
 mhouri >INSERT INTO countries VALUES (3, 'Qatar',300);
 
1 row created.
 
 mhouri >commit;
 
Commit complete.
 
 mhouri >CREATE OR REPLACE PROCEDURE p_get_country_info (p_country_id NUMBER)
  2  IS
  3     CURSOR c_get_countries
  4     IS
  5        SELECT country_id, country_name, region_id
  6          FROM countries
  7         WHERE country_id = p_country_id;
  8  
  9     lr_countries   countries%ROWTYPE;
 10  BEGIN
 11     FOR r_get_countries IN c_get_countries
 12     LOOP
 13        dbms_output.put_line ('country_id :' || r_get_countries.country_id);
 14        dbms_output.put_line ('country_name :' || r_get_countries.country_name);
 15        dbms_output.put_line ('country_region_id :' || r_get_countries.region_id);
 16     END LOOP;
 17  END;
 18  /
 
Procedure created.
 
 mhouri >SET serveroutput ON
 mhouri >begin
  2  p_get_country_info(1);
  3  end;
  4  /
country_id :1                                                                   
country_name :Belgique                                                          
country_region_id :100                                                          
 
PL/SQL procedure successfully completed.
 
 mhouri >spool off;
Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/06/2011, 00h24   #9
 
Inscription : décembre 2009
Messages : 51
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 51
Points : -10
Points : -10
Citation:
Envoyé par Mohamed.Houri Voir le message
Pourquoi ne pas l'avoir essayé ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
 mhouri >CREATE TABLE countries(country_id number
  2  ,country_name  varchar2(30)
  3  ,region_id  number);
 
TABLE created.
 
 mhouri >INSERT INTO countries VALUES (1, 'Belgique',100);
 
1 row created.
 
 mhouri >INSERT INTO countries VALUES (2, 'France',200);
 
1 row created.
 
 mhouri >INSERT INTO countries VALUES (3, 'Qatar',300);
 
1 row created.
 
 mhouri >commit;
 
Commit complete.
 
 mhouri >CREATE OR REPLACE PROCEDURE p_get_country_info (p_country_id NUMBER)
  2  IS
  3     CURSOR c_get_countries
  4     IS
  5        SELECT country_id, country_name, region_id
  6          FROM countries
  7         WHERE country_id = p_country_id;
  8  
  9     lr_countries   countries%ROWTYPE;
 10  BEGIN
 11     FOR r_get_countries IN c_get_countries
 12     LOOP
 13        dbms_output.put_line ('country_id :' || r_get_countries.country_id);
 14        dbms_output.put_line ('country_name :' || r_get_countries.country_name);
 15        dbms_output.put_line ('country_region_id :' || r_get_countries.region_id);
 16     END LOOP;
 17  END;
 18  /
 
Procedure created.
 
 mhouri >SET serveroutput ON
 mhouri >begin
  2  p_get_country_info(1);
  3  end;
  4  /
country_id :1                                                                   
country_name :Belgique                                                          
country_region_id :100                                                          
 
PL/SQL procedure successfully completed.
 
 mhouri >spool off;
Mohamed Houri
Bonjour Mohamed,
Je te remercie beaucoup pour ta reponse , vraiment tu n'es pas comme les autres
J'ai une question : est ce que je doit obligatoirement passer par les cursseur ? il y a pas un truc avec le select into ?
Merci beaucoup
bestcasaoui est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 15/06/2011, 09h03   #10
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par bestcasaoui Voir le message
Bonjour Mohamed,
Je te remercie beaucoup pour ta reponse , vraiment tu n'es pas comme les autres
J'ai une question : est ce que je doit obligatoirement passer par les cursseur ? il y a pas un truc avec le select into ?
Merci beaucoup
Bonjour,

Le select into produit l'un des trois effets suivants:

(1) il n'y a aucun enregistrement selectioné et auquel cas c'est l'exception when_no_data_found qui va se déclencher
(2) il existe plus d'un enregistrement selectioné et auquel cas c'est l'exception when_to_many_rows qui doit se déclencher
(3) il existe un seul enregistrement et auquel cas aucune erreur n'est produite

D'une manière générale, lorsque l'on s'attend à un seul enregistrement il faut de préférence alors utiliser le 'select into'. Par contre lorsque l'on s'attend à plusieurs enregistrements il faut alors prévoir un curseur dans ce cas

Bien cordialement

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h06.


 
 
 
 
Partenaires

Hébergement Web