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

PL/SQL Oracle Discussion :

Variable globale - PL/SQL - %TYPE


Sujet :

PL/SQL Oracle

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Variable globale - PL/SQL - %TYPE
    Je suis actuellement entrain de réaliser un package PL/SQL.
    Etant donné que j'utilise différent Schéma/User Oracle j'ai décidé de mettre les schémasUser en variable globale jusqu'ici pas de problèmes :

    Dans le .pks :
    w_SchemaUser VARCHAR2(20) := 'SCHEMAUSER';


    Or pour être sûr du type de mes champs j'ai déclaré plein de variable du style :
    w_var1 SCHEMAUSER.TABLE.CHAMP%TYPE;
    Je veux donc remplacé SCHEMAUSER par ma variable et la c'est le gros probleme ...

    je ne sais pas faire ...
    w_var1 w_SchemaUser.TABLE.CHAMP%TYPE;
    Ne fonctionne pas et retourne l'erreur :
    PLS-00487: Référence de variable 'W_SCHEMAUSER' non valide

    Comment faut il s'y prendre car je pense que je m'y prend mal ....


    Info :
    Je compile mes packages sous TOAD 7.2 !
    C'est une base Oracle 8.1.7 !

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Si j'ai bien compris la problématique :
    - il y a plusieurs schéma (ex: TOTO et TATA) ?
    - sur ces schémas, il y a les mêmes tables avec la même structure (ex : TAB1 et TAB2) ?
    - vous souhaitez, sur le schéma "TITI" avoir un ensemble de procédures vous permettant de manipuler, au choix, les données de TOTO ou de TATA ?

    Alors, de deux choses l'une :
    (a) Soit les structures des tables sont strictement identiques, et dans ce cas, il suffit de faire TOTO.TAB1.COL1%TYPE
    (b) soit les structures des tables ne sont pas strictement identiques (ex: VARCHAR2(10) contre VARCHAR2(11) ) et dans ce cas, la mutualisation n'a pas de sens

    Je ne vois donc pas où est le problème ?

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut c'est pas tout à fait ca ^^
    J'ai effectivement 2 schémas.
    Sur un premier schéma, je dispose des tables de mon application.
    Sur le deuxième schéma ce sont des tables temporaires me servant pour une reprise de données( ce sont donc des données d'une ancienne applis, des donnéesd e mapping ).
    Ne pouvant pas créer forcement un deuxieme schéma chez le client ou ne pouvant pas l'appeler comme je les fais dans mon apllication, je souhaite pouvoir mettre dans une variable ce nom de schéma pour n'avoir à le changer qu'à un seul endroit si besoin est. Et ne pas me taper tout le code pour changer le nomdu schéma....

  4. #4
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    alors dans ce cas, pourquoi ne pas déclarer les variables à partir du schéma réel de l'appli et utiliser les variables pour les manipulations ?

  5. #5
    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 Re: c'est pas tout à fait ca ^^
    Citation Envoyé par ogre
    Et ne pas me taper tout le code pour changer le nom du schéma....
    Avec TOAD c'est vite fait avec un p'tit coup de remplacer tout...

    Ce que tu veux faire n'est à mon avis pas possible sans faire d'usine à gaz.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    PlaineR : C'est ce que je cherchai à éviter ..propreté !!!

    coucoucestmoi : si j'ai compris ce que tu dis... et bien c'est ce que je cherche à faire mais le nom du schéma en variable je ne sais pas l'utiliser .... voir message 1 !!

  7. #7
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Voilà de quoi t'aider à utiliser le nom du schéma en variable :
    http://sheikyerbouti.developpez.com/execute_immediate/

    Le plus dur restant alors d'écrire dynamiquement la requête !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Non mais là vous vous égarez les gars

    Donc pour répondre : il est impossible de déclarer une variable avec un type lui-même consititué d'une variable... il n'y a AUCUN moyen.

    Il faut donc bien déclarer les variables pour tous les shémas... désolé

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    si il a x schémas (SCH1, SCH2, ...) tous identiques et quil souhaite factoriser les traitements, je ne vois pas ce qui l'empêche de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PROCEDURE TOTO (pi_Schema IN VARCHAR2)
    IS
       v_COL1 SCH1.TABLE1.COL1%TYPE;
       v_Requete VARCHAR2(2000);
    BEGIN
       v_Requete := 'SELECT COL1 FROM '||pi_schema||'.TABLE1 WHERE ...' ;
       EXECUTE IMMEDIATE v_Requete INTO v_COL1;
    END;
    :

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    C'est pas ça qu'il veut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_COL1 SCH1.TABLE1.COL1%TYPE;
    mais pour reprendre ton exemple, ce serait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_COL1 pi_Schema.TABLE1.COL1%TYPE;
    Puisque tu te rends bien compte qu'il ne peut pas déclarer la variable un %TYPE sur un schéma qui n'est pas forcément le même que le schéma attaqué dans la reqûête

    et là c'est pas possible

  11. #11
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je prends un peu le thread en route et je sais pas si j'ai tout compris, mais si tu as deux schémas avec les mêmes tables et des procédures communes, je penserais aux procédures en invoker's right. Si tu appelles ta procédure a partir du schema TITI, elle tape sur les tables de TITI et si tu l'appelles à partir de TATA elle interroge les tables de TATA ? C'est pas ce que tu veux faire ?

    Si c'est le cas, il faut que tu remplaces tes create procedure en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create or replace procedure p_test authid current_user
    Qu'en pensez-vous ?


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  12. #12
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    On n'est bien d'accord que le %TYPE ne peut pas s'appliquer sur un pi_schema !!!
    Mais sa procédure n'a de sens que si tous les schémas sont identiques, donc un SCH1...%TYPE est jouable, et il me semblait avoir compris que c'était après, dans l'utilisation des variables qu'il était bloqué...

  13. #13
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    La solution peux résider dans la création de types au niveau SQL.

    CREATE TYPE...

    permettant à tous les schémas de bénéficier du type.

    sauf bien sûr si le nombre de types à créer est extravagant.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    le probléme c'est que le type peux changer d'une base à l'autre (si j'ai bien compris )

    Exemple :

    Base B
    Table T (col VARCHAR2(10))

    BASE B'
    Table T (col DATE)

    ogre voudrait un code transportable sur les 2 bases du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE 
    var pkg.var_glob.T.col%TYPE;
    où pkg.var_glob est une variable globale dont la valeur représente le shéma.

    Est-ce que c'est clair pour tout le monde ?

  15. #15
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Ah ouais.... j'avions point compris ça !!!!

    Ben dans ce cas, il n'a pas 36 solutions : il faut qu'il écrive une procédure PL/SQL qui génèrera la procédure finale !!!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est peut-être moi qu'ai rien compris hein

    mais cette question revient de temps en temps donc bah... voila quoi

  17. #17
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Sans vouloir vous faire de la peine, ô grand maitre oraFrance,


    J'ai effectivement 2 schémas.
    Sur un premier schéma, je dispose des tables de mon application.
    Sur le deuxième schéma ce sont des tables temporaires me servant pour une reprise de données( ce sont donc des données d'une ancienne applis, des donnéesd e mapping ).
    Ne pouvant pas créer forcement un deuxieme schéma chez le client ou ne pouvant pas l'appeler comme je les fais dans mon apllication, je souhaite pouvoir mettre dans une variable ce nom de schéma pour n'avoir à le changer qu'à un seul endroit si besoin est. Et ne pas me taper tout le code pour changer le nomdu schéma....
    il semblerait qu'il n'y ait qu'une seule base et plusieurs schémas identiques...

  18. #18
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Une fine gestion de synonymes ne ferait pas l'affaire ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    qu'il y a 2 shémas ou 2 bases la problématique reste là même... tu ne peux pas mettre le schéma en paramétre dans un %TYPE

    PS : d'ailleurs mon exemple n'est effectivement pas adapté il faut remplacer Base par Shema

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par SheikYerbouti
    Une fine gestion de synonymes ne ferait pas l'affaire ?
    non parce que que tu pointes sur un synonyme ou sur la table la problématique reste la même : le type d'une table est différent selon le shéma

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2008] Variable globale et SQL Task
    Par annalady dans le forum SSIS
    Réponses: 2
    Dernier message: 13/05/2011, 15h22
  2. Réponses: 10
    Dernier message: 02/02/2007, 00h02
  3. Réponses: 2
    Dernier message: 04/09/2006, 18h07
  4. [sql] comment utiliser une variable global
    Par imedg dans le forum Oracle
    Réponses: 21
    Dernier message: 02/05/2006, 15h21
  5. PL/SQL : Variable globale
    Par poca10 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 07/12/2005, 09h34

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