Bonjour,
Comment pourrai je faire un select sur une colonne dans une table
sachant que le nom de la colonne en question est stocké dans une variable ??
colname varchar2(10);
colname := 'colonne1';
select (colname) from tab1
where ....
merci d'avance
Version imprimable
Bonjour,
Comment pourrai je faire un select sur une colonne dans une table
sachant que le nom de la colonne en question est stocké dans une variable ??
colname varchar2(10);
colname := 'colonne1';
select (colname) from tab1
where ....
merci d'avance
du SQL dynamique mais ça dépend ce que tu veux faire exactement (application, requête simple, etc.)
C'est à dire aller voir du coté de "EXECUTE IMMEDIATE" dans la doc PL/SQL ou bien jouer avec les spool s'ils s'agit de traitement simple par sqlplus...Citation:
Envoyé par nuke_y
J'aimerai tester dans un "trigger sur update" si certaines colonnes ont changés de valeur
les colonnes en question sont dans une table de parametrage.
j'ai vu le sql dynamique ...
quand je construit ma requete dynamiquement et j'essaye de l'executer via EXECUTE IMMEDIATE il gueule,
c'est normal les rowtype new et old ont une portée (trigger)
si vous avez une idée ou un bout de code je suis preneur
merci encore
C'est un peu léger comme indice, je suppose qu'il se contente pas de faire "AAAAAAAHHHHHH!!" il doit bien te donner un message quand meme ? :mouarf:Citation:
Envoyé par cyclone_yas
Sinon si c'est comparer des ancienne et nouvelles valeurs, il tu peux utlisiser :OLD et :NEW ... mais le problème c'est que ça se fait pas en dynamique c'est vrai.... donc tu pourra pas faire une fonction générique qui marchera pour toutes les tables...
voila le message d'erreur :
ORA-04092 : Pas de libelle dans TMESPEC
voila ce que je pense :
Quand je construit dynamiquement des requettes les objects utilisés sont dans la base tables, vues ... (portée globale)
là le problème, c'est que l'info est stoquée dans un rowtype (old et new) en memoire inaccessible depuis l'EXECUTE IMMEDIATE
je construit une requette semblable à :
requete := 'select 1 from dual where p_old.CAPINT != p_new.CAPINT OR p_old.CATSSJT != p_new.CATSSJT OR p_old.CATVAR1 != p_new.CATVAR1'
que j'execute :
EXECUTE IMMEDIATE requete into changed;
Oui tu ne pourras pas mettre de :new et :old dans une requête dynamique, il faut que tu soit exaustif sur tes noms de colonnes en dur dans le trigger... à la limite tu peux automatiser la création de ton trigger au moment ou tu crée la table...
je vais exposer autrement mon problème:
je dispose d'une table Tab(col1, col2, col3 .... coln)
L'idée est de lancer un traitement à chaque fois que l'une des colonne "coli" ou "colj" est mise à jour. les noms des colonnes "coli" et "colj" sont dans une table de paramètrage.
j'aimerai intervenir au niveau du trigger sur update de la table "Tab" ou je dispose des rowtypes "new" et "old".
ma question est comment ecrire cette requete :
IF new.coli != old.colj OR
new.coli != old.colj
THEN
(traitement);
END IF;
sans mettre explicitement les noms des colonnes "coli" et "colj" dans la requete ??
si je dispose de veux variables qui contiennent les noms de ces colonnes :
var1 :="coli";
var2 :="colj";
comment pourrai je réecrire la même requete en utilisant var1 et var2 ??
Merci beaucoup pour le temps que vous consacrez à lire et à répondre.
oui j'avais bien compris mais malheureusement, c'est pas possible (en tout cas je ne vois pas comment faire de manière simple...) tu vas devoir faire en dur ton test pour toute tes colonnes... :?
Tu ne peux pas mettre :old et :new dans un objet générique qui contient des tuples et boucler sur les n colonnes de cet objet ? Genre un tableau quoi.
Merci
On peut toujours optimiser le code au maximum en limitant à la portion congrue la partie spécifique à chaque table, mais meme là, dans la boucle il va bien faloir mettre :new.NOM_DE_COLONNE en dur car ça ne passera pas le execute immediate. Mais se posera à ce moment là le problème du typage de ce tableau générique.Citation:
Envoyé par nuke_y
Sauf s'il est possible de dire tableau = :old%ROWTYPE (syntaxe conceptuelle hein ? ;) ), mais est-ce possible ?