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",¶m);
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 FReEDoM (site web personnel) . Évalué à 1.
# il y a moyen de faire plus simple...
Posté par Colargol . Évalué à 1.
http://download-east.oracle.com/docs/cd/B19306_01/appdev.102(...)
# Plus d'infos à propos de mon problème
Posté par Benoit Gaillard . Évalué à 1.
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.