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 14/04/2011, 15h13   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
Par défaut Insert Into avec temporisation

Bonjour, voici mon problème :

J'aimerais créer une PROCEDURE ou FONCTION, qui créerais un TRIGGER, lui même créant une temporisation pour un INSERT INTO.

Le problème réside dans le fait que l'une des données insérée est un SYSDATE (format DD/MM/YYYY HH24:MI:SS)

J'aimerais que chaque données enregistrée ai son SYSDATE comme donnée unique (pas avoir 2 INSERT INTO avec la même date). Pour cela j'ai déjà créé un code que voici :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE TRIGGER trigger_test
AFTER INSERT ON TMP
FOR EACH ROW
BEGIN
DBMS_LOCK.SLEEP(2);
END;
 
INSERT INTO TMP
SELECT 
	    cd_esp
	   , NULL AS cd_pop
	   ,cd_releve
	   ,cd_nom
	   ,nom_cite
	   ,SYSDATE
	   ,'D2' AS code_valid
	   , 0 AS donnees_maj	   
FROM  I202 I
WHERE cd_ref = 124325
;
 
DROP TRIGGER trigger_test;

Mon TRIGGER me fait bien une temporisation de 2 secondes entre chaque données insérées, mais ils ont tous la même date.

Par la suite, j'aimerais en faire une procédure, pour que le TRIGGER se créé puis se supprime, j'ai testé, mais il n'aime pas les CREATE :/

Merci par avance.
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h27   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par dark_mouette Voir le message
...

Le problème réside dans le fait que l'une des données insérée est un SYSDATE (format DD/MM/YYYY HH24:MI:SS)

J'aimerais que chaque données enregistrée ai son SYSDATE comme donnée unique (pas avoir 2 INSERT INTO avec la même date). ...
Utilisez un timestamp.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h38   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
Même résultat avec le CURRENT_TIMESTAMP
Ils ont tous la même date
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h50   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Sysdate est évalué une fois pour le select même s'il est long :
http://asktom.oracle.com/pls/apex/f?...86300346043715

Tu peux incrémenter la date d'1s artificiellement dans le select en faisant :
sysdate + rownum/24/60/60
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/04/2011, 15h52   #5
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
Rassurez-nous, vous n'envisagez pas de mettre une telle bidouille en production ?
Parce que franchement, c'est une idée de shadock !

Il suffit de définir une clé primaire numérique et de l'alimenter par une séquence, et vous n'aurez pas de problème d'unicité.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h57   #6
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
La solution sysdate + rownum/24/60/60 semble fonctionner pour une 20aine de données.

Citation:
Envoyé par Pomalaix Voir le message
Il suffit de définir une clé primaire numérique et de l'alimenter par une séquence, et vous n'aurez pas de problème d'unicité.
Mais la table est déjà alimentée.
Je n'ai jamais eu à faire cela !

MAJ :
Ah, je pense voir ce que vous voulez dire : une incrémentation numérique
Non ce n'est pas le but.
En faite, si je met une date provisoire dans la date, c'est pour une autre procédure. Celle ci fera une nouvelle mise à jour grâce à cette date, il la prendra et la mettra sous cette forme : AAAAMMJJHHMMSS.

Et cette donnée sera insérée dans une autre table, et sera sa clef primaire.

Donc si la date est identique dans la table nommé TMP, cela aura une incidence pour une autre table qui en aura besoin pour sa clef primaire.

Je ne sais pas si j'ai été clair :/
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 16h17   #7
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
Citation:
Envoyé par dark_mouette Voir le message
Je ne sais pas si j'ai été clair :/
Impec !
La solution de skuatamad me paraît excellente dans ce cas.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 16h47   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par dark_mouette Voir le message
Même résultat avec le CURRENT_TIMESTAMP
Ils ont tous la même date
Oui, bien sûr qu’ils ont la même date mais ce n’est pas la même fractionne de seconde.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> CREATE TABLE test_tim (
  2    id         varchar2(30)  PRIMARY KEY,
  3    a_col      varchar2(100)
  4  )
  5  /
 
TABLE created
SQL> CREATE TRIGGER bi_test_tim
  2  before INSERT ON test_tim
  3  FOR each row
  4  begin
  5    :new.id := to_char(systimestamp,'DD/MM/YYYY HH24:MI:SS.FF6');
  6  end;
  7  /
 
TRIGGER created
SQL> INSERT INTO test_tim(a_col)
  2    SELECT object_name
  3      FROM all_objects
  4     WHERE rownum < 30
  5  /
 
29 rows inserted
SQL> SELECT *
  2    FROM test_tim
  3   WHERE rownum <= 10
  4  /
 
ID                             A_COL
------------------------------ --------------------------------------------------------------------------------
14/04/2011 16:44:11.299081     CON$
14/04/2011 16:44:11.299462     I_COL2
14/04/2011 16:44:11.299547     I_USER#
14/04/2011 16:44:11.299612     C_TS#
14/04/2011 16:44:11.299688     I_OBJ#
14/04/2011 16:44:11.299762     I_CON2
14/04/2011 16:44:11.299825     IND$
14/04/2011 16:44:11.299889     BOOTSTRAP$
14/04/2011 16:44:11.299952     UET$
14/04/2011 16:44:11.300014     COL$
 
10 rows selected
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/04/2011, 09h26   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
Citation:
Envoyé par mnitu Voir le message
Oui, bien sûr qu’ils ont la même date mais ce n’est pas la même fractionne de seconde.
Oui mais on ne garde que JJ/MM/AAAA HH:MM:SS
Le reste on ne l'utilise pas, et d'ailleurs j'ai créé une clef de registre pour n'afficher que cela.

Merci à skuatamad ta solution fonctionne à merveille et est très rapide (pas besoin d'avoir une attente de 2 secondes à chaque INSERT).

Je me suis encore pris la tête a vouloir faire une procédure qui créé un trigger pour ensuite le supprimer ^^

Merci à tous
dark_mouette 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 01h12.


 
 
 
 
Partenaires

Hébergement Web