OVH Cloud OVH Cloud

Delete et Curseurs

5 réponses
Avatar
David
Bonjour,

voici mon petit probl=E8me du jour :)
J'ai une table temporaire avec entre autre un element, un=20
sous-element et un score. Je fais un curseur sur cette=20
table tri=E9 par score. Lors du traitement des lignes du=20
curseur, je veux supprimer de la table et surtout du=20
curseur toutes les lignes correspondantes =E0 un element une=20
fois que je l'ai trait=E9.
Pb -> je n'arrive pas =E0 trouver les bonnes options avec le=20
curseur pour que mon delete se refl=E8te dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From MonCurseur"
(je sais que la 1=E8re r=E8gle des curseurs c'est ne pas faire=20
de curseur, mais l=E0 j'ai pas trop le choix :-)

en code =E7a donne :

Declare @MaTable Table (Element int, SousElement int,=20
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element =3D @Element
-- =3D> comment je fais pour que ce delete soit pris en=20
compte par le curseur et ne plus avoir de "element" dans=20
le curseur
Fetch
End
...


Merci de votre aide !

David

5 réponses

Avatar
deconnected
Salut :)

Pourquoi vouloir faire une telle manip ?
Et sinon, dis nous quels sont les traitements que tu fais ds le curseur,
peut etre pourrions nous t'aider à le squizer :)



"David" a écrit dans le message de
news:686301c4cd52$5c6df960$
Bonjour,

voici mon petit problème du jour :)
J'ai une table temporaire avec entre autre un element, un
sous-element et un score. Je fais un curseur sur cette
table trié par score. Lors du traitement des lignes du
curseur, je veux supprimer de la table et surtout du
curseur toutes les lignes correspondantes à un element une
fois que je l'ai traité.
Pb -> je n'arrive pas à trouver les bonnes options avec le
curseur pour que mon delete se reflète dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From MonCurseur"
(je sais que la 1ère règle des curseurs c'est ne pas faire
de curseur, mais là j'ai pas trop le choix :-)

en code ça donne :

Declare @MaTable Table (Element int, SousElement int,
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element = @Element
-- => comment je fais pour que ce delete soit pris en
compte par le curseur et ne plus avoir de "element" dans
le curseur
Fetch
End
...


Merci de votre aide !

David
Avatar
David
j'ai un temps limite pour faire des traitements.
Le score me permet de gérer ma priorité de traitement
(d'où le order by)
Le score est lié à un sous-élément, mais le traitement
appliqué est valable pour tout l'élément.
Donc lorsque j'ai traité un sous-élément d'un élément, les
autres sous-éléments ne sont plus à faire.

D'où ma question :)

Je peux certainement passer par d'autres solutions mais ne
serait-ce que pour ma culture perso, j'aimerai bien savoir
si mon idée 1ère est faisable ou pas.

David

-----Original Message-----
Salut :)

Pourquoi vouloir faire une telle manip ?
Et sinon, dis nous quels sont les traitements que tu fais


ds le curseur,
peut etre pourrions nous t'aider à le squizer :)



"David" a écrit


dans le message de
news:686301c4cd52$5c6df960$
Bonjour,

voici mon petit problème du jour :)
J'ai une table temporaire avec entre autre un element, un
sous-element et un score. Je fais un curseur sur cette
table trié par score. Lors du traitement des lignes du
curseur, je veux supprimer de la table et surtout du
curseur toutes les lignes correspondantes à un element une
fois que je l'ai traité.
Pb -> je n'arrive pas à trouver les bonnes options avec le
curseur pour que mon delete se reflète dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From


MonCurseur"
(je sais que la 1ère règle des curseurs c'est ne pas faire
de curseur, mais là j'ai pas trop le choix :-)

en code ça donne :

Declare @MaTable Table (Element int, SousElement int,
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By


Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element = @Element
-- => comment je fais pour que ce delete soit pris en
compte par le curseur et ne plus avoir de "element" dans
le curseur
Fetch
End
....


Merci de votre aide !

David


.



Avatar
deconnected
Je ne pense pas que cela soit faisable, mais je ne suis pas un pro...
Sinon est ce que l'exemple ci dessous correspond a une possible solution ?

create table el (e char(1),se int,o int)

insert into el values ('A',1,5)
insert into el values ('A',2,4)
insert into el values ('A',3,3)
insert into el values ('B',1,2)
insert into el values ('B',2,1)
insert into el values ('C',3,7)
insert into el values ('C',7,6)

-- 1ere requete curseur
select * from el order by o

--2eme requete curseur
select e,se,o
from el
where o in (select min(o)
from el
group by e
)
order by o

drop table el



"David" a écrit dans le message de
news:713f01c4cd59$1d890940$

j'ai un temps limite pour faire des traitements.
Le score me permet de gérer ma priorité de traitement
(d'où le order by)
Le score est lié à un sous-élément, mais le traitement
appliqué est valable pour tout l'élément.
Donc lorsque j'ai traité un sous-élément d'un élément, les
autres sous-éléments ne sont plus à faire.

D'où ma question :)

Je peux certainement passer par d'autres solutions mais ne
serait-ce que pour ma culture perso, j'aimerai bien savoir
si mon idée 1ère est faisable ou pas.

David

-----Original Message-----
Salut :)

Pourquoi vouloir faire une telle manip ?
Et sinon, dis nous quels sont les traitements que tu fais


ds le curseur,
peut etre pourrions nous t'aider à le squizer :)



"David" a écrit


dans le message de
news:686301c4cd52$5c6df960$
Bonjour,

voici mon petit problème du jour :)
J'ai une table temporaire avec entre autre un element, un
sous-element et un score. Je fais un curseur sur cette
table trié par score. Lors du traitement des lignes du
curseur, je veux supprimer de la table et surtout du
curseur toutes les lignes correspondantes à un element une
fois que je l'ai traité.
Pb -> je n'arrive pas à trouver les bonnes options avec le
curseur pour que mon delete se reflète dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From


MonCurseur"
(je sais que la 1ère règle des curseurs c'est ne pas faire
de curseur, mais là j'ai pas trop le choix :-)

en code ça donne :

Declare @MaTable Table (Element int, SousElement int,
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By


Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element = @Element
-- => comment je fais pour que ce delete soit pris en
compte par le curseur et ne plus avoir de "element" dans
le curseur
Fetch
End
....


Merci de votre aide !

David


.



Avatar
David
avec un mix d'options genre 'DYNAMIC' je pensais que
c'était faisable mais pour l'instant je n'ai effectivement
pas de solution de ce genre (mais pt-être je cherche à
produire une "hérésie" comme aime à dire un contributeur
bien connu de ce newsgroup :-)
pt-être est-ce à cause de ma table mémoire que j'utilise
en non une table classique ?

en attendant je suis passé par une autre table mémoire :
DECLARE @AlreadyDone TABLE (ObjectId INT)
que j'alimente et test au fur et à mesure de l'avancement
de mon traitement et ça marche...

Néanmoins, si un expert, MVP ou MS a une explication
technique, ça m'intéresse toujours de savoir !


David T.


-----Original Message-----
Je ne pense pas que cela soit faisable, mais je ne suis


pas un pro...
Sinon est ce que l'exemple ci dessous correspond a une


possible solution ?

create table el (e char(1),se int,o int)

insert into el values ('A',1,5)
insert into el values ('A',2,4)
insert into el values ('A',3,3)
insert into el values ('B',1,2)
insert into el values ('B',2,1)
insert into el values ('C',3,7)
insert into el values ('C',7,6)

-- 1ere requete curseur
select * from el order by o

--2eme requete curseur
select e,se,o
from el
where o in (select min(o)
from el
group by e
)
order by o

drop table el



"David" a écrit


dans le message de
news:713f01c4cd59$1d890940$

j'ai un temps limite pour faire des traitements.
Le score me permet de gérer ma priorité de traitement
(d'où le order by)
Le score est lié à un sous-élément, mais le traitement
appliqué est valable pour tout l'élément.
Donc lorsque j'ai traité un sous-élément d'un élément, les
autres sous-éléments ne sont plus à faire.

D'où ma question :)

Je peux certainement passer par d'autres solutions mais ne
serait-ce que pour ma culture perso, j'aimerai bien savoir
si mon idée 1ère est faisable ou pas.

David

-----Original Message-----
Salut :)

Pourquoi vouloir faire une telle manip ?
Et sinon, dis nous quels sont les traitements que tu fais


ds le curseur,
peut etre pourrions nous t'aider à le squizer :)



"David" a écrit


dans le message de
news:686301c4cd52$5c6df960$
Bonjour,

voici mon petit problème du jour :)
J'ai une table temporaire avec entre autre un element, un
sous-element et un score. Je fais un curseur sur cette
table trié par score. Lors du traitement des lignes du
curseur, je veux supprimer de la table et surtout du
curseur toutes les lignes correspondantes à un element




une
fois que je l'ai traité.
Pb -> je n'arrive pas à trouver les bonnes options avec




le
curseur pour que mon delete se reflète dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From


MonCurseur"
(je sais que la 1ère règle des curseurs c'est ne pas




faire
de curseur, mais là j'ai pas trop le choix :-)

en code ça donne :

Declare @MaTable Table (Element int, SousElement int,
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By


Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element = @Element
-- => comment je fais pour que ce delete soit pris en
compte par le curseur et ne plus avoir de "element" dans
le curseur
Fetch
End
....


Merci de votre aide !

David


.





.



Avatar
Fred BROUARD
Il faut utiliser l'option CURRENT OF dans le delete.
Mais faire du DELETE ou de l'INSERT dans un curseur est froidement totalement
déconseillée car cela déplace le positionnement du curseur à ton insu !

Il vaut mieux ne jamais utiliser de curseur. T-SQL est assez souple pour faire
cela en une seule requête.

Poste le code complet de ta SP et on te donnera l'équivalent en une requête.
Mais des commentaire afin de savoir ce que tu fait !

A +


David a écrit:
Bonjour,

voici mon petit problème du jour :)
J'ai une table temporaire avec entre autre un element, un
sous-element et un score. Je fais un curseur sur cette
table trié par score. Lors du traitement des lignes du
curseur, je veux supprimer de la table et surtout du
curseur toutes les lignes correspondantes à un element une
fois que je l'ai traité.
Pb -> je n'arrive pas à trouver les bonnes options avec le
curseur pour que mon delete se reflète dans le curseur.

Ai-je tout faux ? ou ai-je rater une option dispo ?
Est-il possible de faire une sorte "Delete From MonCurseur"
(je sais que la 1ère règle des curseurs c'est ne pas faire
de curseur, mais là j'ai pas trop le choix :-)

en code ça donne :

Declare @MaTable Table (Element int, SousElement int,
Score Int, ...)

Declare MonCurseur Cursor For
Select Element, SousElement From @MaTable Order By Score
Open MonCurseur
Fetch ... Into @Element, ...
While ...
Begin
...
Delete From @MaTable Where Element = @Element
-- => comment je fais pour que ce delete soit pris en
compte par le curseur et ne plus avoir de "element" dans
le curseur
Fetch
End
...


Merci de votre aide !

David



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************