[Oracle] Problème trigger auto increment

Problème trigger auto increment [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 23-07-2008 à 11:01:46    

Bonjour,
 
J'ai crée un trigger et une séquence pour faire un auto-increment sous Oracle mais il me pose un problème :
 
Séquence :
 

Code :
  1. CREATE SEQUENCE s_inc_port_tom4 START WITH 1 INCREMENT BY 1;


 
Trigger :  

Code :
  1. CREATE OR REPLACE TRIGGER tr_inc_port_tom BEFORE INSERT ON tmp_export_profils_port_tom
  2. FOR EACH ROW
  3. DECLARE
  4. BEGIN
  5. SELECT s_inc_port_tom.nextval INTO :new.tmp_export_profils_port_tom.id_port from DUAL;
  6. END;
  7. /


 
C'est la ligne

Code :
  1. SELECT s_inc_port_tom.nextval INTO :new.tmp_export_profils_port_tom.id_port from DUAL;

qui pose problème, voyez-vous pourquoi ?
 
Merci

Reply

Marsh Posté le 23-07-2008 à 11:01:46   

Reply

Marsh Posté le 23-07-2008 à 11:08:06    

je ne suis pas certain mais il me semble que pour la séquence, il faut dire qu'elle est la dernière valeur.
de 1 à 1000 par exemple. Quand il sera rendu à 1000 il retournera au départ et cherchera un emplacement vide. Tu peux mettre 50000 si tu veux ;)
 
CREATE SEQUENCE ma_sequence START WITH 1 INCREMENT BY 1 MAXVALUE 50000;


Message édité par slr56 le 23-07-2008 à 11:10:21
Reply

Marsh Posté le 23-07-2008 à 11:08:46    

C'est bon j'ai trouvé, en fait il ne faut pas mettre la table.nom du champ, mais simplement le nom du champ :
 
Réponse :

Code :
  1. CREATE SEQUENCE s_inc_port_tom START WITH 1 INCREMENT BY 1;
  2. commit;
  3. CREATE OR REPLACE TRIGGER tr_inc_port_tom
  4.    BEFORE INSERT
  5.    ON tmp_export_profils_port_tom
  6.    FOR EACH ROW
  7. BEGIN
  8.    SELECT s_inc_port_tom.NEXTVAL
  9.      INTO :NEW.id_port
  10.      FROM DUAL;
  11. END;
  12. /

Message cité 1 fois
Message édité par krovomi le 24-07-2008 à 11:40:40
Reply

Marsh Posté le 23-07-2008 à 11:11:47    

krovomi a écrit :

C'est bon j'ai trouvé, en fait il ne faut pas mettre la table.nom du champ, mais simplement le nom du champ :
 
Réponse :

Code :
  1. CREATE SEQUENCE s_inc_port_tom START WITH 1 INCREMENT BY 1;
  2. commit;
  3. CREATE OR REPLACE TRIGGER tr_inc_port_tom
  4.    BEFORE INSERT
  5.    ON tmp_export_profils_port_tom
  6.    FOR EACH ROW
  7. BEGIN
  8.    SELECT tr_inc_port_tom.NEXTVAL
  9.      INTO :NEW.id_port
  10.      FROM DUAL;
  11. END;
  12. /



 
 
ok. C'est bon à savoir.
 
Pour le post que j'ai mis précédemment, je me suis trompé car je viens de faire une rechercher à l'instant et on est pas obligé de donner une limite à la séquence.

Reply

Marsh Posté le 23-07-2008 à 11:19:09    

ouais je confirme tu n'es pas obligé.
 
A+

Reply

Marsh Posté le 23-07-2008 à 11:41:19    

Une autre question :
 
J'ai une table tmp_export_profils_portrait et une table tmp_export_profils_port_tom, elles ont la même structure, sauf que la première contrairement à la seconde n'a pas de champ id_port (champ auto_increment).
Avec le trigger crée au dessus, quand je fais :
 

Code :
  1. INSERT INTO tmp_export_profils_port_tom SELECT
  2.                                                company,
  3.                                                sub_unit,
  4.                                                name_prefix,
  5.                                                first_name,
  6.                                                last_name,
  7.                                                email_work,
  8.                                                cfa,
  9.                                                pin_number,
  10.                                                name_suffix,
  11.                                                dob,
  12.                                                verified_flag,
  13.                                                work_phone,
  14.                                                start_travel_date,
  15.                                                end_travel_date,
  16.                                                home_appart_code,
  17.                                                home_city_code,
  18.                                                pin_mailer_sent,
  19.                                                is_arranger_flag,
  20.                                                external_system_identifier,
  21.                                                bus_traveler_rollup_type_desc,
  22.                                                arranger_first_name,
  23.                                                arranger_last_name,
  24.                                                arranger_phone,
  25.                                                email_type,
  26.                                                arranger_email,
  27.                                                receive_e_invoice_flag,
  28.                                                client_defined_trvlr_type_name,
  29.                                                traveler_type_name,
  30.                                                privacy_option_acceptance_flag,
  31.                                                client_org_unit_id FROM tmp_export_profils_portrait;
  32. commit;


 
J'ai l'erreur ORA-00947 : Not enough values, donc je voudrais savoir pourquoi il me sort cette erreur alors que normalement il devrait simplement faire un copier/coller de la table tmp_export_profils_portrait dans tmp_export_profils_port_tom en mettant le champ tmp_export_profils_port_tom.id_port en auto-increment, non ?
 
Soit j'ai zappé un truc, soit je ne comprends pas le principe, quelqu'un pourrait m'expliquer ?
 
Merci


Message édité par krovomi le 23-07-2008 à 14:17:25
Reply

Marsh Posté le 23-07-2008 à 14:17:49    

UP !!!

Reply

Marsh Posté le 24-07-2008 à 11:41:00    

Reply

Marsh Posté le 24-07-2008 à 13:27:55    

insert into <table> (<fieldlist> ) select ...
 
et y'a plus de problème
 
et c'est l'unique syntaxe qu'il faut utiliser
 
si tu n'énumères pas les champs manuellement dans ton insert, c'est comme le "*" dans les select, t'es mort au bout de deux jours d'utilisation de ton application
 
et à noter que si tu mets un trigger sur ton champ auto-incrément, tu peux shooter la clause "not null" de la définition de la table, ça devrait te permettre d'éviter les ignominies que je vois dans le lien que tu as posté


Message édité par MagicBuzz le 24-07-2008 à 13:30:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed