résolu: problème curseur

résolu: problème curseur - SQL/NoSQL - Programmation

Marsh Posté le 28-01-2010 à 13:07:37    

Bonjour,
 
Voilà je vous explique mon problème.
 
je veux récupérer 6540 lignes de données.
 
j'ai fait un curseur pour cela en utilisant un FOR pour récupérer les 3637 premières lignes dans la variable (étant limité par la taille de la variable à 32767!!).
 
Le problème c'est que j'aurais voulu récupéré le reste des données c'est à dire de 3638 à 6540 et à ce moment là la boucle recommence du début.
 
Voici mon code de la procédure:
 
CREATE OR REPLACE PROCEDURE testopsub001b IS
vcValParam2 VARCHAR2(32767);
vcValParam3 VARCHAR2(32767;
CURSOR C_OPLOPCOD IS
select FIOPF.FIOPF_COD,OPLOP_COD from OPLOP,FIOPF
where OPLOP.FIOPF_COD = FIOPF.FIOPF_COD
AND FIOPF.TOTIE_CODSOC = 7
AND FIOPF.TASTA_COD <>'A'
AND FIOPF.TASTA_COD <>'S';
 
ivcVAL2 VARCHAR(8);
ivcVAL3 VARCHAR(8);
 
BEGIN
 
OPEN C_OPLOPCOD ;
 FOR i IN 1..3637  
 LOOP
  FETCH C_OPLOPCOD INTO ivcVAL2,ivcVAL3;
  EXIT WHEN C_OPLOPCOD%NOTFOUND;
   
  IF (vcValParam2 is null) THEN
   vcValParam2 := ''||(ivcVAL2);
  ELSE
   vcValParam2 := vcValParam2||'!'||(ivcVAL2);
  END IF;
   
  IF (vcValParam3 is null) THEN
   vcValParam3 := ''||(ivcVAL3);
  ELSE
   vcValParam3 := vcValParam3||'!'||(ivcVAL3);
  END IF;
   
 END LOOP;
 CLOSE C_OPLOPCOD;
 vcValParam2 := vcValParam2||'!';
 vcValParam3 := vcValParam3||'!';
END;
/  
 
et j'ai une deuxième procédure avec le FOR allant de 3638 à 6540 mais le résultat me ramène les premières lignes et non pas à partir de la ligne 3638!!!
 
Merci d'avance de votre aide.


Message édité par jarod_93 le 29-01-2010 à 12:19:18
Reply

Marsh Posté le 28-01-2010 à 13:07:37   

Reply

Marsh Posté le 28-01-2010 à 13:46:28    

elle recommence forcément au début vu que tu fais un close de ton curseur après la fin de la boucle.
 
Je suis pas sur de bien comprendre ce que tu veux faire mais a mon avis y a moyen de faire autrement et genre pas bancal

Reply

Marsh Posté le 28-01-2010 à 13:55:04    

En faites je voudrais commencer à récupérer les données à partir de la ligne 3638 jusqu'à  la fin c'est à dire 6450. Initialiser le curseur sur cette ligne 3638 au lieu du tout début.
 
Merci

Reply

Marsh Posté le 28-01-2010 à 14:17:27    

je ne me suis jamais amusé a ca mais j'imagine que si tu remplaces le close de ton curseur par une nouvelle boucle avec le fetch qui va jusqu'au bout ca devrait.
 
ou alors tu le réouvres et durant les 3637 eres itérations tu ne fais rien.
 
les deux sont moches
 

Code :
  1. CREATE OR REPLACE PROCEDURE testopsub001b IS
  2. vcValParam2 VARCHAR2(32767);
  3. vcValParam3 VARCHAR2(32767;
  4. CURSOR C_OPLOPCOD IS
  5. SELECT FIOPF.FIOPF_COD,OPLOP_COD FROM OPLOP,FIOPF
  6. WHERE OPLOP.FIOPF_COD = FIOPF.FIOPF_COD
  7. AND FIOPF.TOTIE_CODSOC = 7
  8. AND FIOPF.TASTA_COD <>'A'
  9. AND FIOPF.TASTA_COD <>'S';
  10.  
  11. ivcVAL2 VARCHAR(8);
  12. ivcVAL3 VARCHAR(8);
  13.  
  14. BEGIN
  15.  
  16. OPEN C_OPLOPCOD ;
  17. FOR i IN 1..3637  
  18. LOOP
  19.  FETCH C_OPLOPCOD INTO ivcVAL2,ivcVAL3;
  20.  EXIT WHEN C_OPLOPCOD%NOTFOUND;
  21.  
  22.  IF (vcValParam2 IS NULL) THEN
  23.   vcValParam2 := ''||(ivcVAL2);
  24.  ELSE
  25.   vcValParam2 := vcValParam2||'!'||(ivcVAL2);
  26.  END IF;
  27.  
  28.  IF (vcValParam3 IS NULL) THEN
  29.   vcValParam3 := ''||(ivcVAL3);
  30.  ELSE
  31.   vcValParam3 := vcValParam3||'!'||(ivcVAL3);
  32.  END IF;
  33.  
  34. END LOOP;
  35.  
  36. LOOP
  37.  FETCH C_OPLOPCOD INTO ivcVAL2,ivcVAL3;
  38.  EXIT WHEN C_OPLOPCOD%NOTFOUND;
  39.  -- ton traitement
  40. END LOOP;
  41.  
  42. CLOSE C_OPLOPCOD;
  43. vcValParam2 := vcValParam2||'!';
  44. vcValParam3 := vcValParam3||'!';
  45. END;

Reply

Marsh Posté le 28-01-2010 à 14:35:26    

Merci pour ta réponse mais ça ne fonctionne pas. Il recommence de la première ligne même en ne fermant pas le curseur.
L'idée serait de pouvoir initialiser le pointeur du curseur sur une ligne particulière.

Reply

Marsh Posté le 28-01-2010 à 14:56:38    

he bien alors tu ouvres ton curseur, tu gardes dans une variable ou tu en es dans ton itération genre p_nbr_iteration:= p_nbr_iteration +1 a chaque fois, et une condition par la suite if (p_nbr_iteration <= 3637) then () else ....

Reply

Marsh Posté le 29-01-2010 à 10:12:38    

Est-ce tu peux me décrire la syntaxe par rapport à mon code car j'ai essayé et je n'obtiens par le résultat voulu.
 
Merci

Reply

Marsh Posté le 29-01-2010 à 12:18:00    

C'est bon j'ai obtenu ce que je voulais.
 
Merci encore pour la participation.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed