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 23/01/2012, 14h07   #1
r83
Membre du Club
 
Inscription : mars 2003
Messages : 206
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 206
Points : 41
Points : 41
Par défaut Exception sur select

Bonjour,

Je viens de découvrir un souci sur mon code.
Soit le code suivant exécuté par l'utilisateur lambda:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
declare 
nb integer;
message varchar(100);
begin
  SELECT count(*) INTO nb FROM  user1.matable;
  dbms_output.put_line(nb);
exception
when others then
  message:=sqlcode ||  '  -  ' || sqlerrm;
  dbms_output.put_line(message);
end;
il se trouve que si lambda n'a pas l'autorisation de consulter la table matable du schéma user1, une exception est levée, mais elle n'est pas attrapée par mon bloc exception when others.....
voici le résultat :
Citation:
ORA-06550: line 5, column 42:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 5, column 3:
PL/SQL: SQL Statement ignored
Pourquoi je ne passe pas par mon bloc d'exception avec une exception -942?.
Si je remplace la requête par un select ne ramenant aucune ligne sur une table sur laquelle j'ai accès, ça marche sans problème.

Merci pour les réponses
r83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h34   #2
Rédacteur
 
Inscription : décembre 2002
Messages : 2 396
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 396
Points : 3 294
Points : 3 294
Un code PL/SQL quelconque passe forcément par deux phases : la compilation, et l'exécution.
Le mécanisme des exceptions n'intervient qu'à l'exécution ; or les problèmes de privilèges relèvent de la phase de compilation.

Bien entendu, dans un bloc anonyme comme le vôtre, ces deux phases ne sont pas apparentes, mais existent néanmoins.

Si vous faisiez une procédure stockée, la création de la procédure sans erreur validerait la phase de compilation, et à l'exécution vous auriez les éventuelles exceptions.

Dans une procédure, par défaut, c'est le propriétaire de la procédure qui doit avoir les droits nécessaires sur les objets visés. Les utilisateurs qui exécutent cette procédure n'ont besoin d'aucun droit sur ces objets ; ils ont juste besoin du droit d'exécution sur la procédure.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/01/2012, 14h36   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 316
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 316
Points : 5 822
Points : 5 822
Parce que votre code n'est pas exécuté vu qu'il ne passe pas l'étape de compilation.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/01/2012, 14h43   #4
r83
Membre du Club
 
Inscription : mars 2003
Messages : 206
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 206
Points : 41
Points : 41
Merci pour les réponses ..... j'aurais du y penser car je connais bien ces deux phases là ...
Effectivement quand on modifie la structure d'une table, on doit recompiler les procédures y accédant !
Je comptais résoudre le pb par un pragma exception_init mais ce n'est pas la peine d'essayer.
Bonne fin de journée
r83 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 20h08.


 
 
 
 
Partenaires

Hébergement Web