|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2008 Messages : 15 ![]() |
Bonjour,
Dans un procédure, j'ai recours à un SELECT par deux fois, une fois dans un CURSOR et une autre pour un UPDATE. Ce SELECT est strictement identique dans les 2 cas. Où écrire cette requête afin de pouvoir l’appeler n fois dans une même procédure, est-t-il possible de la mettre dans une variable ? Merci Cdlt |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Tu peux peut-être faire un SELECT FOR UPDATE pour pouvoir mettre à jour les lignes sélectionnées. Mais attention, ça lock la table alors faut pas qu'entre le SELECT et l'UPDATE il se passe trop de temps.
|
|
|
00
|
|
|
#3 |
|
Membre éprouvé
![]() |
Tu peux peut-être également stocker le résultat de ton SELECT dans un tableau avec un BULK COLLECT, puis réutiliser ce tableau pour faire l'UPDATE avec un FORALL par exemple.
|
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Citation:
|
|
|
|
00
|
|
|
#5 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2008 Messages : 15 ![]() |
Voir ci-dessous (je débute en SQl et Pl/SQL...)
C'est la même requête utilisée pour le CURSOR et l'UPDATE : je n'utilise pas l'UPDATE dans la boucle car cela ferait n UPDATE au lieu d'un seul et j'ai cru comprendre qu'il valait mieux, voilà pourquoi j'aimerais pourvoir définir la requête 1 seule fois et la réutiliser ailleurs dans le script. j'utilise la boucle uniquement la boucle pour compter les occurrences à modifier et générer un mail d'info. Code :
|
||
|
|
00
|
|
|
#6 | |
|
Membre éprouvé
![]() |
Citation:
|
|
|
|
10
|
|
|
#7 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Généralement pour factoriser une requête utilisée à différents endroits ou dans différentes procédures, on utilise les vues.
Dans ton cas le curseur est inutile, supprime le, puis execute l'update directement et utilise RETURNING BULK COLLECT INTO pour récupérer les info nécessaire à la rédaction du mail. Au cas où, est ce que l'update peut être modifié comme suit pour éviter le double scan de table1 ? : Code :
|
||
|
|
10
|
|
|
#8 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
C’est une procédure simple mais elle pose plusieurs problèmes.
D’abord votre algo est :
Si les nombres de dossiers à modifiés est raisonnable la meilleure solution est de procéder comme dans l’exemple : Code :
|
||
|
|
10
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2008 Messages : 15 ![]() |
@mnitu : merci pour l'analyse de mon code et l'exemple.
Et également mes remerciements pour toutes les autres réponses. Je vais regarder tout cela... Cdlt. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com