bje tt le monde.
je veu savoir si il y'a le type auto-increment ds oracle comme mysql.
sinon comment je peu faire pour que oracle ajoute lui même l'identificateur de ma table??
et merci d'avance
bje tt le monde.
je veu savoir si il y'a le type auto-increment ds oracle comme mysql.
sinon comment je peu faire pour que oracle ajoute lui même l'identificateur de ma table??
et merci d'avance
Il n'y a pas de type auto-incrément comme mysql.
Tu crées un SEQUENCE, et dans un trigger POST-INSERT FOR EACH ROWS, tu mets ton champ avec le n° de séquence suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part :new.identificateur := ma_sequence.nextval;
c'est lourd le trigger !!Envoyé par McM
pourquoi ne pas faire l'insert directement en appelant la séquence ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Insert into ma table ( monID, ... ) Values ( maSequence.NextVal, ...) ;
Le trigger n'est pas si lourd et surtout il a l'immense avantage d'uniformiser toutes les procédures d'insertion.
On ne spécifie pas de valeur pour la colonne auto-incrémentée et hop, tout toule tout seul ! :-)
Sinon, il faut tout reprendre l'application dès que l'on change un petit truc...
Pas de valeur auto-incrémentée, il faut écrire une séquence.
Ce que j'ai l'habitude de faire, c'est un package sur la table avec un tas de procédure (fonction) comprenant les inserts sur la table, des select (return un record), un update avec check si la ligne existe (si oui --> update, sinon insert)...
moi je travail avec les EJBs (de type CMP), pour insérer un enregistrement ds une table j'appel la fonction create(je mets lici les paramétres + identificateur)
donc comment je peut appeler les sequences pour éviter de passer le paramétre identificateur ds la liste des paramétres de la fonction create
et merci d'avance
Ca dépend où tu gères l'insert...Envoyé par LeoAnderson
dans le cadre d'une base de donnée multi-application, il plus simple (à mon avis) d'avoir des prcédures (dans des packages pour ce qui me concerne) d'insertion qui reçoivent en paramètre les données "utilisateur" à insérer.
pour le coup, toutes les colonnes "à valeur automatique" (séquences, USER, sysdate (pour date de création), etc...) sont renseignée dans ces procédures.
du coup toutes les applis peuvent appeler la même procédure.
donc pour la séquence dont on parle ici, le "séquence.NexVal" est justement dans cette procédure.
Certes mais tu n'es absolument pas certain que cette procédure sera TOUJOURS appellée, dans tous les cheminements de l'application et en plus, si tu souhaites par exemple faire un import/SQL*Loader, cette procédure ne sera pas appellée.Envoyé par Yorglaa
Avec alors le risque d'avoir une séquence non en phase avec les données (séquence inférieure au max) ce qui provoquerait des erreurs de doublons sur la prochaine insertion avec la-dite procédure !![]()
Donc, à mes yeux, il n'y a que la solution du trigger qui soit satisfaisante ! ;-)
De plus dans des applis comme Forms, comment tu gères tes procédures d'insertion ?
@LeoAnderson
c'est juste, je suis d'accord avec cet argument...
mais je suppose que dans n'importe quel contexte, l'utilisation d'outils comme SQLLoader demande une certaine systématique / discipline dans leur utilisation.
@McM
je ne sais pas, je n'utilise pas Forms...
mais à priori rien n'empêche d'appeler des procs stockées depuis Forms... si ?
Ben Forms gère automatiquement les ordres SQL d'insert, update,etc...Envoyé par Yorglaa
donc pour insérer à partir d'une procédure, ça marche pas.
Je n'insère jamais directement dans la table source avec un SQL-Loader. J'utilise tjs une table intermédiaire qui permet de faire toutes les vérifications avant la vraie insertion dans la table cible. Cela évite d'avoir à gérer des "rollbacks à la main" pour annuler un chgt qui a planté à moitié. Le SQL-Loader ne permet pas d'annuler facilement une transaction s'il y a une erreur. Il rejette les enregistrements purement et simplement. Gérer une table temporaire permet de valider ou annuler la transaction en entier.Envoyé par LeoAnderson
@+,
NicK.
C'est bien là le problème... tu ne fais que supposer... tu ouvres donc la voie aux "avec de la chance ça devrait le faire" ou autres approximations. C'est pour ça que je préfère blinder avec un trigger...Envoyé par Yorglaa
Je me permets de supposer ici parce que je ne connais ni ne contrôle les environnements des autres personnes ici présentes...
Pour ce qui est de(s) environnement(s) dont je suis en charge, c'est une certitude !![]()
bjr
moi je travail avec les EJBs (de type CMP), pour insérer un enregistrement ds une table j'appel la fonction create(je mets lici les paramétres + identificateur)
donc comment je peut appeler les sequences pour éviter de passer le paramétre identificateur ds la liste des paramétres de la fonction create
et merci d'avance
Partager