Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 05/07/2011, 16h19   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Par défaut Insert into avec n+1 sans séquence

Bonjour à tous,

Je suis sous Oracle 10g, je bosse actuellement sur une base de données sur laquelle je dois faire des insert sur 2 tables en même temps. Mon problème n'est pas de faire 2 insert dans deux tables, mais la compréhension de la structure d'une table dans laquelle je dois insérer (table codebarre).

Dans codebarre j'ai une colonne prefix qui nullable = No. Je n'ai aucune séquence stockée en base de données pour cette colonne mais celle ci contient des données déjà insérées par d'autres personnes. Le prefix semble s'auto incrémenter de +1 à chaque insertion en fonction du secteur.

codebarre :
ID NUMBER(10,0) No
SECTOR CHAR(1 BYTE) No
YEAR NUMBER(2,0) No
PREFIX NUMBER(5,0) No

codebarre :
id Sector YEAR Prefix
1 L 10 1
2 L 10 2
3 L 10 3
4 L 10 4
5 L 10 5
36699 F 11 1
36905 F 11 2
36906 F 11 3
36909 F 11 4

Je me demande si il y aurait un moyen d'insérer dans codebarre un prefix tel que : sector like 'F' and YEAR = 11 and PREFIX = precedent prefix+1 dans un insert into ?
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h34   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
un sujet similaire abordé ici

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 16h40   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'avez pas tout simplement un trigger sur votre table ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 18h27   #4
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
salut,

Merci pour vos réponses. J'ai effectivement un trigger pour cette table, mais je n'ai pas l'impression qu'il gère la colonne PREFIX.

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
CREATE OR REPLACE TRIGGER "TBB".TOB_CODEBARRE
	BEFORE INSERT OR UPDATE ON CODEBARRE
	FOR EACH ROW
DECLARE 
	integrity_error  exception;
	errno            integer;
	errmsg           char(200);
BEGIN
	-- autoincrement
	IF INSERTING THEN
		BEGIN
			SELECT S_CODEBARRE.NEXTVAL INTO :NEW.ID FROM dual;
		EXCEPTION
			WHEN integrity_error THEN 
				raise_application_error(errno, errmsg);
		END;
	END IF;
 
  BEGIN
	-- calculated row CODEBARRE of RESSOURCE table
	UPDATE RESSOURCE SET CODEBARRE = 	:NEW.SECTOR || TO_CHAR(:NEW.YEAR,'FM00') || TO_CHAR(:NEW.PREFIX,'FM00000') ||
			    					DECODE(:NEW.CATEGORY, 2, 'E', 3, 'D', NULL,'','') || TO_CHAR(:NEW.SUFFIX,'FM00') 
		WHERE CODEBARRE_ID = :NEW.ID ;
  EXCEPTION
    WHEN OTHERS THEN NULL;
  END;
 
END;
C'est pour cela que je demande si il est possible de faire des insert into avec conditions. Je suis un peu perdu.

Any idea ?

Merci.
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 18h55   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
On peut faire ce qu'on veut, vous avez de gros éléments de réponse dans le lien posté par Yanika_bzh.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 19h58   #6
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Merci Waldar pour ta réponse. Je vais me pencher un peu plus sur le lien de Yanika_bzh.

Par contre, le trigger ne gère pas la colonne PREFIX, c'est bien ça?

A+
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 11h04   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout à fait, le trigger sert à deux choses :
  1. En cas d'insertion, il utilise la séquence S_CODEBARRE pour générer un nouvel ID pour la table CODEBARRE.
  2. Dans tous les cas, il met à jour la colonne CODEBARRE de la table RESSOURCE en concaténant les éléments de la formule.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h05   #8
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
En tout cas il faudrait enlever ce EXCEPTION WHEN OTHERS THEN NULL qui veut dire "quelque soit le problème, je ne veux pas que l'appelant soit au courant" et qui est à peu près la pire chose qu'on puisse faire dans un gestionnaire d'erreurs.

Apparemment Oracle 11g a même introduit un warning spécialement contre cet usage.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/07/2011, 16h33   #9
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 810
Points : 5 810
On peut facilement renoncer aussi au code suivant
Code :
1
2
3
4
 
EXCEPTION
			WHEN integrity_error THEN 
				raise_application_error(errno, errmsg);
vu qu'il ne sert à rien.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/07/2011, 09h06   #10
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Salut à tous,

Merci beaucoup pour votre aide . J'y vois plus clair maintenant.

A+
Jarod51 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 03h12.


 
 
 
 
Partenaires

Hébergement Web