Forum Programmation.autre Utilisation des attributs %found et %isopen d'un sql_cursor dans un bloc PL/SQL en Pro*C oracle10g

Posté par  .
Étiquettes : aucune
0
25
jan.
2006
Bonjour, j'aimerais utiliser l'attribut %found d'un curseur déclaré dans un bloc PL/SQL.

Voici mon code:


include(SRINCLUDE/header.srh)
include(SRINCLUDE/srorapas.srh)
include(SRINCLUDE/cadre.src)


#define ELM_LONGSTR 20


void errexit(char * param,char* s,int i,char *d,char*t);
void finNormaleProgramme(char *);

int main(argc,argv)
/*================*/
long argc;
char *argv[];
{
EXEC SQL BEGIN DECLARE SECTION;
int noint;
char nom[1000]="";
SQL_CURSOR mainc1;
char sql[1000]="select noint,nom from identite.membre where rownum < 10 ";
EXEC SQL END DECLARE SECTION;

printf("\n debut du programme \n");
EXEC SQL WHENEVER SQLERROR do fatalError(__FILE__,__LINE__);
el_connect("batch");
printf("\n connecté \n");
EXEC SQL WHENEVER NOT FOUND CONTINUE;

EXEC SQL WHENEVER SQLERROR DO fatalError(__FILE__,__LINE__);
EXEC SQL WHENEVER NOT FOUND CONTINUE;

EXEC SQL BEGIN DECLARE SECTION;
int found=0;
int isopen=0;
int isnull=0;
EXEC SQL END DECLARE SECTION;

EXEC SQL ALLOCATE :mainc1;

EXEC SQL EXECUTE
BEGIN
OPEN :mainc1 FOR :sql;
IF :mainc1 %ISOPEN THEN
:isopen:=1;
ELSE
:isopen:=-1;
END IF;
END;
END-EXEC;
printf("\nisopen after open==%d\n",isopen);

EXEC SQL WHENEVER NOTFOUND CONTINUE;
EXEC SQL FETCH :mainc1 into :noint,:nom;
EXEC SQL EXECUTE
BEGIN
IF :mainc1 %FOUND THEN
:found:=1;
ELSE
:found:=-1;
END IF;
END;
END-EXEC;
while(found==1)
{
printf("\n %d %s ",noint,nom);
EXEC SQL FETCH :mainc1 into :noint,:nom;
EXEC SQL EXECUTE
BEGIN
IF :mainc1 %FOUND THEN
:found:=1;
ELSE
:found:=-1;
END IF;
END;
END-EXEC;
}

EXEC SQL CLOSE :mainc1;

EXEC SQL COMMIT WORK RELEASE;
finNormaleProgramme(argv[0]);

return 0;
}

void errexit(char * param,char* s,int i,char *d,char*t)
{
printf("Erreur ORACLE %.70s (%d) at line %d %s %s %s\n", sqlca.sqlerrm.sqlerrmc, sqlca.sqlcode,i,s,d,t);
printf("\n%s\n",&param);
EXEC SQL ROLLBACK WORK RELEASE;
exit(0);
}
void finNormaleProgramme(char * nomProgramme)
{
printf("\nFin normale du programme %s\n",nomProgramme);
}

include(SRINCLUDE/header.src)
include(SRINCLUDE/srorapas.src)

Lorsque j'exécute ce programme, j'obtiens l'erreur suivante :
Oracle : -1001 ORA-01001: curseur non valide au premier test de la valeur de l'attribut %FOUND.

Avez-vous une idée de ce qui pourrait se passer?
D'avance merci.
  • # C'est du proC ?

    Posté par  (site web personnel) . Évalué à 1.

    Je me demande ça parce que les includes y sont bizarre ? et qu'en plus je pensais pas voir quelqu'un poster du proC ici :)
  • # il y a moyen de faire plus simple...

    Posté par  (site web personnel) . Évalué à 1.

    ça fait des années que je n'ai pas fait de Pro*C :) je ne peux donc pas te renseigner précisément sur l'erreur mais je te suggére de revoir ton code car il me paraît bien compliqué pour parcourir les 10 premières lignes d'une table. L'exemple donné dans la doc est plus simple :
    http://download-east.oracle.com/docs/cd/B19306_01/appdev.102(...)
  • # Plus d'infos à propos de mon problème

    Posté par  . Évalué à 1.

    Merci à tous pour vos réponses.

    Je sais que je ne cherche pas la facilité mais je dois préparer la migration de programmes C écrit il y a très longtemps et donc je m'attends au pire!!!!!!!

    C'est pourquoi j'essaie de pousser mes réflexions.

    Ce que j'aimerais est de pouvoir utiliser les attributs %found, %isopen, %notfound,... sur sql_cursor dans PLUSIEURS blocs PL/SQL différents à travers un programme.

    Ce qui ce passe d'étrange: lorsque j'ouvre le curseur dans le premier bloc PL/SQL, je peux tester ses différents attributs sans aucun problème. Si je réalise les mêmes tests dans un autre bloc PL/SQL (situé juste après celui qui ouvre le curseur) j'obtiens une erreur du style : "invalid cursor".

    Pourtant mes EXEC SQL FETCH fonctionnent endehors des bloc PL/SQL.

    Il y a peut-être un paramètre de portée de ma variable sql_cursor que je ne maîtrise pas trop.

    J'ai essayé de chercher dans le code C généré mais je suis déjà à un boîte d'aspirine.

    D'avance merci de vos réponses, réflexions, conseils à venir.

    Benoit Gaillard

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.