IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Probleme d'acces à une vue dans un package


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut Probleme d'acces à une vue dans un package
    Bonjour,

    Je me confronte à un problème assez bizarre, j'ai beau chercher sur les forums je ne trouve pas ma réponse... Je suis sur Oracle 8.1.7.
    Voici mon probleme, j'ai un select qui fait appel à des données qui sont dans une vue. Lorsque j'exécute le select tout seul sous SQL*PLUS c'est OK.

    Ensuite je souhaite inclure mon select dans une procédure, se trouvant elle même dans un package. Je compile le package et là il me met une erreur sur sur la vue, en me disant que l'identificateur doit être déclaré.

    J'ai essayé de mettre un select tout simple dans le package pour voir si le problème ne venait pas de la syntaxe du package et ça a marché.

    Je ne comprends pas pourquoi ça marche dans le select seul et pas dans le package.

    Quelqu'un a-t-il une idée ?

    Merci par avance.

    CM

  2. #2
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    avec les sources de ton package ce serai plus simple de t'aider -)

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par PpPool
    avec les sources de ton package ce serai plus simple de t'aider -)
    et avec l'erreur précise.

    Néanmoins d'après ce que tu décris, cela vient sans doute que les droits que ton utilisateur a sur la vue sont hérités d'un rôle. Or en Pl/Sql, Oracle ne tient pas compte des droits donnés par un rôle. Il faut les donner directement à ton utilisateur via un grant.

  4. #4
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    lors de l'exécution du select dans SQLplus l'utilisateur de connection est il me propriétaire de ton package ?

    si tu te connectes avec le propriétaire du package sous sqlplus et que tu exécutes ton select ast tu une erreure ?

    Quels sont les droits sur la vue ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut source du package
    voici mon package :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    CREATE OR REPLACE PACKAGE package_edition IS
      TYPE ResultSet IS REF CURSOR;
       PROCEDURE p_edit_facture( acd_session VARCHAR2, a_Result IN OUT package_edition.ResultSet );
    END package_edition;
    /
     
    CREATE OR REPLACE PACKAGE BODY package_edition AS
    PROCEDURE p_edit_facture( acd_session VARCHAR2, a_Result IN OUT package_edition.ResultSet ) IS
    BEGIN
         OPEN a_Result FOR
    		select v_gr_adhesion.adh_code,
    			     v_gr_adhesion.adp_nom1,
    			     v_gr_adhesion.adp_nom2,
    			     v_gr_adhesion.adp_voie,
    			     v_gr_adhesion.adp_comp_loc,
    			     v_gr_adhesion.adp_dist_spec,
    			     v_gr_adhesion.adp_commune,
    			     v_gr_adhesion.adh_nofacture,
    			     v_gr_adhesion.adh_campagne, 
    			     v_gr_adhesion.adh_reg_code,
    			     reg.reg_libelle,
    			     v_gr_adhesion.adh_ged_code,
    			     ged.ged_libelle,
    			     v_gr_adhesion.adh_qua_code,
    			     qua.qua_libelle,
    			     v_gr_adhesion.adh_totalht,
    			     v_gr_adhesion.adh_totaltva,
    			     v_gr_adhesion.adh_totalttc,
    			     civ_tres.civ||' '||per_tres.nom||' '||per_tres.pre tresorier,
    			     org_ged.sig||' - '||org_ged.adp_voie||' - '||org_ged.adp_comp_loc||' - '||org_ged.adp_dist_spec||' - '||org_ged.adp_commune adresse_tresorier
    		from temp_ident,v_gr_adhesion, gr_region reg, gr_geda ged, gr_quartier qua,
    			   srv srv_ged, org org_ged, ior ior_tres, per per_tres, civ civ_tres
    		where v_gr_adhesion.adh_reg_code = reg.reg_code
    		and v_gr_adhesion.adh_ged_code = ged.ged_code
    		and v_gr_adhesion.adh_qua_code = qua.qua_code
    		and v_gr_adhesion.adh_ged_code = srv_ged.num_srv
    		and srv_ged.attribut02 = org_ged.num_org
    		and ior_tres.org_num_org = org_ged.num_org
    		and ior_tres.fct_cod_fct = 180
    		and ior_tres.per_num_per = per_tres.num_per
    		and civ_tres.cod_civ = per_tres.civ_cod_civ
    		and temp_ident.id_identifiant = v_gr_adhesion.adh_code
    		and temp_ident.cd_session = acd_session; 
     
      END p_edit_facture;
     
    END package_edition;
    /
     
    show errors;
    Je sais qu'il y a des choses spécifiques à faire sur les droits. Je pense avoir fait le nécessaire.
    Le schema sur lequel est compilé ce package est TITI.
    La vue nommée v_gr_adhesion appartient au schema TOTO. Comme on ne peut pas faire de grant sur une vue, j'ai fait des GRANT sur les tables utilisées dans cette vue. De plus j'ai également fait un synonyme de la vue TOTO pour une utilisation dans le schema TITI.
    Que ce soit pour la compilation du package ou du select tout simple je suis sur le meme schema a savoir TITI.

    Merci pour vos réponses...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    J'ai oublié le message d'erreur que me génère la compilation du package, le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    5/3      PL/SQL: SQL Statement ignored
    25/19    PLS-00201: l'identificateur 'TOTO.V_GR_ADHESION' doit être
             déclaré

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    il me semble que le owner du package doit avoir les droits

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par cli16
    Comme on ne peut pas faire de grant sur une vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> create view v1 as select 1 x from dual;
    View created.
     
    SQL> grant select on v1 to toto;
    Grant succeeded.
    C'est justement ce droit qui te manque.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    en fait, c'est plus compliqué :
    j'ai 3 users => U1, U2 et U3
    ma vue est sur U2 qui utilise des tables de U3
    Le but est de compiler un package sur U1

    en essayant de mettre des droits sur la vue j'ai ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GRANT SELECT ON U2.ma_vue TO U1
                         *
    ERREUR à la ligne 1 :
    ORA-01720: Classe de privilèges (grant option) inexistante pour U3.une_table'
    sachant que U2 à bien tous les droits pour voir U3...

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Cela signifie que lorsque tu as fait des grants avec U3 tu n'as pas du le faire avec grant option (grant ... with grant option)
    => donc U2 ne peut pas donner de droits à U1 pour des objets qui dépendent d'objets d'U3.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    OK pour les droits, effectivement les GRANT sur U3 n'avaient pas été fait avec l'option WITH GRANT OPTION.

    Merci beaucoup pour votre aide et surtout pour votre réactivité !

    Encore une autre question.... désolée d'être un boulet...

    Dans le package ci-dessous (le même que précédemment) je déclare une procédure, qui a 2 paramètres, un en entrée pour faire le select, l'autre pour le résultat (resultset).
    Je n'arrive pas à trouver la syntaxe qui me permet d'exécuter cette proc sous SQL*PLUS. Est-ce le mot réservé est call, execute, exec, est-ce qu'il en faut un ? De plus, comment je dois spécifié dans l'appel le paramètre de sortie?

    Encore merci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    CREATE OR REPLACE PACKAGE package_edition IS
      TYPE ResultSet IS REF CURSOR;
       PROCEDURE p_edit_facture( acd_session VARCHAR2, a_Result IN OUT package_edition.ResultSet );
    END package_edition;
    /
     
    CREATE OR REPLACE PACKAGE BODY package_edition AS
    PROCEDURE p_edit_facture( acd_session VARCHAR2, a_Result IN OUT package_edition.ResultSet ) IS
    BEGIN
         OPEN a_Result FOR
    		SELECT v_gr_adhesion.adh_code,
    			     v_gr_adhesion.adp_nom1,
    			     v_gr_adhesion.adp_nom2,
    			     v_gr_adhesion.adp_voie,
    			     v_gr_adhesion.adp_comp_loc,
    			     v_gr_adhesion.adp_dist_spec,
    			     v_gr_adhesion.adp_commune,
    			     v_gr_adhesion.adh_nofacture,
    			     v_gr_adhesion.adh_campagne, 
    			     v_gr_adhesion.adh_reg_code,
    			     reg.reg_libelle,
    			     v_gr_adhesion.adh_ged_code,
    			     ged.ged_libelle,
    			     v_gr_adhesion.adh_qua_code,
    			     qua.qua_libelle,
    			     v_gr_adhesion.adh_totalht,
    			     v_gr_adhesion.adh_totaltva,
    			     v_gr_adhesion.adh_totalttc,
    			     civ_tres.civ||' '||per_tres.nom||' '||per_tres.pre tresorier,
    			     org_ged.sig||' - '||org_ged.adp_voie||' - '||org_ged.adp_comp_loc||' - '||org_ged.adp_dist_spec||' - '||org_ged.adp_commune adresse_tresorier
    		FROM temp_ident,v_gr_adhesion, gr_region reg, gr_geda ged, gr_quartier qua,
    			   srv srv_ged, org org_ged, ior ior_tres, per per_tres, civ civ_tres
    		WHERE v_gr_adhesion.adh_reg_code = reg.reg_code
    		AND v_gr_adhesion.adh_ged_code = ged.ged_code
    		AND v_gr_adhesion.adh_qua_code = qua.qua_code
    		AND v_gr_adhesion.adh_ged_code = srv_ged.num_srv
    		AND srv_ged.attribut02 = org_ged.num_org
    		AND ior_tres.org_num_org = org_ged.num_org
    		AND ior_tres.fct_cod_fct = 180
    		AND ior_tres.per_num_per = per_tres.num_per
    		AND civ_tres.cod_civ = per_tres.civ_cod_civ
    		AND temp_ident.id_identifiant = v_gr_adhesion.adh_code
    		AND temp_ident.cd_session = acd_session; 
     
      END p_edit_facture;
     
    END package_edition;
    /
     
    SHOW errors;

  12. #12
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VARIABLE rc REFCURSOR
    EXEC package_edition.p_edit_facture('toto', :rc);
    PRINT rc

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 80
    Points : 53
    Points
    53
    Par défaut Merci !
    Ok tout fonctionne.

    Un grand merci à tous pour votre aide.

    CM

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/07/2010, 20h08
  2. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  3. [ADRESSAGE][DEBUTANT]Accés à une machine dans un sous-réseau
    Par Milark dans le forum Développement
    Réponses: 4
    Dernier message: 26/03/2004, 09h45
  4. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08
  5. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo