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 12/10/2004, 17h06   #1
Invité de passage
 
Inscription : décembre 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 6
Points : 2
Points : 2
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 !
ogre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2004, 13h43   #2
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2004, 14h10   #3
Invité de passage
 
Inscription : décembre 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 6
Points : 2
Points : 2
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....
ogre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2004, 14h13   #4
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2004, 14h21   #5
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2004, 15h31   #6
Invité de passage
 
Inscription : décembre 2003
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 6
Points : 2
Points : 2
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 !!
ogre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h25   #7
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 !
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h30   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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é
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h35   #9
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 :
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;
:
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h39   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
C'est pas ça qu'il veut :

Code :
v_COL1 SCH1.TABLE1.COL1%TYPE;
mais pour reprendre ton exemple, ce serait ça :

Code :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h40   #11
Rédacteur
 
Inscription : septembre 2004
Messages : 626
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 626
Points : 622
Points : 622
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 :
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...)
lalystar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h42   #12
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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é...
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h44   #13
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h53   #14
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 :
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h56   #15
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
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 !!!
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h57   #16
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est peut-être moi qu'ai rien compris hein

mais cette question revient de temps en temps donc bah... voila quoi
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 16h58   #17
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Sans vouloir vous faire de la peine, ô grand maitre oraFrance,


Citation:
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...
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 17h04   #18
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 17h05   #19
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 17h07   #20
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h01.


 
 
 
 
Partenaires

Hébergement Web