Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 21/03/2007, 14h00   #1
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 148
Points : 39
Points : 39
Par défaut Oracle 9i limiter le nbre d'enregistrement

Bonjour,

Comment fait-on pour limiter le nombre d'enregistrement dans une table par exemple 250?

merci d'avance

A+ Laurent
laurent1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h39   #2
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
Code :
when rowcount = 250 then crash
CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h56   #3
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 148
Points : 39
Points : 39
Code :
1
2
 
when rowcount = 250 then crash
tu peux m'en dire plus, je ne sais pas ou placer ce code et est-ce que je garde les 250 derniers enregistrements ?
laurent1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h22   #4
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
je ne sais pas s'il y a une logique dans ta demande .

Néanmois pour traiter le cas présent, dans la table visée :

1. Créer une sequence et alimenter une colonne de ta table avec le contenu de la séquence à travers une trigger...

2. Dans ce même trigger, tu pourras toujours faire un delete du 1er enregistrement ( min(id_seq)) si count(*) = 250 ...

Il y a peut-être d'autres solutions $ ....


CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h28   #5
Membre habitué
 
Avatar de olivanto
 
Responsable d'exploitation informatique
Inscription : mars 2005
Messages : 437
Détails du profil
Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Finance

Informations forums :
Inscription : mars 2005
Messages : 437
Points : 147
Points : 147
moi je trouve çà bien compliqué, et pas du tout apte à durer ... tu fais quoi si du jour au lendemain on te dit ; fianlement il fallait prendre 300 enregistrements ; t'en as perdu 50 !!!

pourquoi ne pas limiter l'extraction / la requête à 250 rows, tout simplement ?? t'as toujours toutes tes données, et voilà ...
__________________
apprenti sorcier Oracle & boulet intérimaire...
http://www.courtois.cc/murphy/murphy_informatique.html
olivanto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 16h03   #6
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 148
Points : 39
Points : 39
J'ai surement mal expliqué ma requete :

Je veux creer une table qui contient au maximum 250 enregistrements. le 251 ieme evenement est supprimé de lcette table.

Cordialement,
laurent1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 17h19   #7
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut ,

Tu fais un trigger sur ta table before insert et tu comptes le nombre de tes enregistrements si dépasse 250, tu géres l'exception.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 09h11   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Ou alors tu crées la table avec 250 enregistrements vide et tu enlèves les droits INSERT
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 09h52   #9
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
La solution du trigger ne marche pas dans le cas de transactions concurrentes car chaque transaction ne peut pas voir ce que les autres transactions sont en train de faire. Une solution plus fiable semble être l'utilisation d'une vue matérialisée et d'une contrainte sur cette vue.

Voir la discussion sur le forum OTN (en anglais).
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 13h31   #10
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

On peux résoudre se problème, dans le triger on fait un select ... for update no_wait sur la table

exemple

Code :
1
2
3
4
5
6
7
8
9
10
 
begin 
SELECT ... FOR UPDATE no_wait ;
.........
faire le SELECT count ...
 
execption 
when others  then 
dbms_output.put_line('record is already locked. please try later ');
end ;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 14h15   #11
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Mais si la ligne n'existe pas (si une transaction en train de créer une ligne avec un INSERT dans une transaction en cours, une transaction concurrente qui fait un SELECT ne peut pas voir cette nouvelle ligne), elle ne peut pas être verrouillée ... Cela peut marcher si on pose un verrou exclusif sur toute la table: dans ce cas, on sérialise toutes les mises à jour (INSERT, UPDATE, DELETE) sur la table.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 14h17   #12
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : Conseil

Informations forums :
Inscription : janvier 2004
Messages : 2 866
Points : 3 448
Points : 3 448
Et puis faire un select sur la table traitée par le trigger, tu vas te trouver avec une belle erreur ORA-04091 dite erreur de la table mutante.
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2007, 15h32   #13
Nouveau Membre du Club
 
Inscription : février 2003
Messages : 148
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 148
Points : 39
Points : 39
J'ai mis en place une sequence et un trigger sur insert, je delete la ligne de rang n-250 et j'insere la nouvelle. Je pense avoir de la chance, car je n'ai qu'un prog qui alimente ma table.

Merci
laurent1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h22.


 
 
 
 
Partenaires

Hébergement Web