Précision sur le curseur en pl/sql

Fermé
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 - 15 avril 2009 à 21:43
 KéKiDonc ?? - 16 avril 2009 à 06:33
Bonsoir,

Je voudrais savoir si le "close" est bien placé? Le résultat de mon curseur est une seule donnée. Je sais que je pouvais faire autre chose mais je veux juste savoir si cette possibilité est juste?

open c_sites_ch (leSid);
fetch c_sites_ch into v_sites_ch;
close c_sites_ch;


Merci de votre aide.

7 réponses

KéKeCest !!
15 avril 2009 à 21:52
Bsoir,

Open - Fetch - Close c'est correct je pense.

Crdlt.
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 22:02
ok merci. Ce cas là est possible si tu ne possèdes pas de loop ou sinon cela ne fonctionne pas.

J'ai une autre question:

Peux tu me donner ton avis sur cette syntaxe:

FUNCTION mise_a_jour (un_sid varchar2, un_pref varchar2, une_table varchar2) return varchar2 IS
DELETE FROM '||une_table||'@'||un_sid||' blx'||' WHERE EXISTS'
||' (SELECT * FROM t_anofiche ano'
||' WHERE blx.'||un_pref||'_idFiche = ano.id_fiche'
||'AND blx.'||un_pref||'_tyFiche = ano.type_fiche'
||'AND blx.'||un_pref||'_rang = ano.type_fiche)';


un_sid: c'est le nom du database link.


Merci pour ton aide
0
KéKeCest !!
15 avril 2009 à 22:23
Re,

1-

"Ok merci. Ce cas là est possible si tu ne possèdes pas de loop ou sinon cela ne fonctionne pas."

--> Si tu mets un Loop - ça fonctionnera OK sans problèmes mais il va mettre N fois à jour ton premier enregistrement récupéré dans ton curseur (:>).. ce qui n'est pas très intéressant c'est sur.

2-

FUNCTION mise_a_jour (un_sid varchar2, un_pref varchar2, une_table varchar2) return varchar2 IS
DELETE FROM '||une_table||'@'||un_sid||' blx'||' WHERE EXISTS'
||' (SELECT * FROM t_anofiche ano'
||' WHERE blx.'||un_pref||'_idFiche = ano.id_fiche'
||'AND blx.'||un_pref||'_tyFiche = ano.type_fiche'
||'AND blx.'||un_pref||'_rang = ano.type_fiche)';


Remarque A -

||'AND blx.'||un_pref||'_rang = ano.type_fiche .. tu est sur de ta Host Variable ??... ce n'est pas plutôt un truc du genre ano.rang ?..

Remarque B - ATTENTION !!..

Cette requête supprime toute ta table une_table@... si au moins un enregistrement est retourné dans ton sous SELECT... c'est vraiment ce que tu veux ?...

Crdlt.
0
KéKeCest !!
15 avril 2009 à 22:31
Re,

Je me suis trompé au niveau compréhension fonctionnelle de ta requête - je vais re-verifier.

a+.
0
KéKeCest !!
15 avril 2009 à 22:40
Re,

Ok.

DELETE FROM '||une_table||'@'||un_sid||' blx'||' WHERE EXISTS'
||' (SELECT * FROM t_anofiche ano'
||' WHERE blx.'||un_pref||'_idFiche = ano.id_fiche'
||'AND blx.'||un_pref||'_tyFiche = ano.type_fiche'
||'AND blx.'||un_pref||'_rang = ano.type_fiche)';


1-
Je sais pas au niveau syntaxe (fonction PL/SQL Oracle non ??) mais fonctionnellement elle supprime tous les enregistrement de la table une_table@... qui vérifient la condition de jointure avec la table t_anofiche.

2-
Oublie le problème des "host variables" - OK j'ai compris mais j'ai quand même un doute sur ||'AND blx.'||un_pref||'_rang = ano.type_fiche (voir message précédent) mais c'est peut être une erreur de frappe de ta part.

Slt.
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 22:34
1- Il n'y a pas de LOOP dans mon script, donc je l'ouvre, je met la valeur dans une variable et je ferme le curseur. Il ne sera remis à jour N fois.

2-

Remarque A:

Tu as raison, c'est une erreur de ma part. Bien joué


Remarque B:

Je veux supprimer les données (id, type, rang d'une table) d'une table (@.....) si elle existent bien dans une autre table.
Voilà ce que je veux.



Une autre question:

je veux utiliser une boucle for avec pl/sql mais je ne sais pas comment faire, est ce possible de faire sous cette forme:

for ( i = variable1; i <= variable1; i++)


Merci pour ton aide
0
KéKeCest !!
15 avril 2009 à 22:54
Re,

1-
J'avais pas percuté ta requête (voir message plus haut) - j'ai compris son principe et elle répond à ton besoins.

2-

Cas général (exemple) :

i := 0
variable1 := 10
LOOP
-- Traitements --
i := i + 1;

EXIT WHEN i > variable1;

Ton cas :

for ( i = variable1; i <= variable1; i++)

Malheureusement - tu ne rentreras qu'une fois dans ton for.

Mais bon.... :

i := variable1

LOOP
-- Traitements --
i := i + 1;

EXIT WHEN i > variable1;


Crdlt.
0
KéKeCest !!
15 avril 2009 à 23:15
Re,

Ok j'ai pensé à un UPDATE dans un LOOP (... la fatigue surement...).

LOOP (OPEN-FETCH-CLOSE) lit N fois le même enregistrement.
En tout cas ça plantera pas.

Crdlt.
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 22:48
exact, j'ai fais une erreur de frappe.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 23:10
ok mais est ce que l'on peut écrire cette syntaxe dans du pl/sql:

for ( i = variable1; i <= variable1; i++)

Merci.
0
KéKeCest !!
15 avril 2009 à 23:24
Re,

Jamais vu.

Boucles en PL/SQL :

1-

FOR LOOP_COUNTER IN LOWER_LIMIT..UPPER_LIMIT LOOP
-- Traitements --
-- Trt Condition sortie EXIT_CONDITION --
IF EXIT_CONDITION THEN
EXIT;
END IF;
END LOOP;

2-

WHILE CONDITION LOOP
-- Traitements --
END LOOP;

3-

LOOP
-- Traitements --
EXIT WHEN CONDITION;
END LOOP;

Crdlt.
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 23:21
tu ne réponds pas à ma question, est ce que l'on peut écrire la syntaxe suivant dans du pl/sql?

for ( i = variable1; i <= variable1; i++)






En ce qui concerne la première question que je t'avais posé, je veux savoir si je ne met pas de loop, est ce que cette syntaxe (OPEN, FETCH, CLOSE) marche bien.
Je suis d'acccord avec toi, si je met un loop, je vais lire N fois le même enregistrement. Mais dans mon cas, il n'y a pas de loop.

Merci pour ton aide
0
KéKeCest !!
15 avril 2009 à 23:26
Re,

(voir plus haut pour ton for(...))

Crdlt.
0
tipi75 Messages postés 680 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 16 avril 2015 27
15 avril 2009 à 23:48
merci je crois que j'ai trouvé une "parade" à mon algo.


Merci
0
KéKeCest !!
16 avril 2009 à 00:01
Re,

OK mais for ( i = variable1; i <= variable1; i++) revient strictement à :

for ( i = 0; i < 1; i++)

Pas besoin de variable1 à moins que tu n'ai besoin de l'initialisation de i à variable1 dans ta boucle pour des traitements particuliers mais alors il suffit d'utiliser directement variable1 à l'intérieur de ton for().

En C :

for ( i = 0; i < 1; i++)
{
<Utilisation variable1 - Traitements>
}

Doc : http://www.freebooksclub.net/128-oracle-plsql-by-example-4th-edition-prentice-hall.html

("Oracle PL/SQL By Example" - excellent).

Bonne nuit.
0
KéKiDonc ??
16 avril 2009 à 06:33
Re,

Étant entendu que :

for ( i = 0; i < 1; i++)
{
<gras>Traitements</gras>
}

... dans ces conditions revient donc strictement à :

Traitements

Slt.
0