tplai
asked on
ORA-01460 : unimplemented or unreasonable conversion requested.
This piece of Pro*C code works correctly on Sun Solaris, Oracle 7.3.4, and wrong on Sun Solaris, Oracle 8.0.4.
/*------------------------ ---------- ---------- ---------- ---------- ----
* FONCTION : ora_getregio
* AUTEUR :
* CREE LE : 22 Decembre 1999
* MODIFIE LE : 23 Decembre 1999
* ENTREES : # idregion : identifiant de la region courante.
* SORTIES : # infosreg : informations sur la region.
* RESULTAT : 0 si traitement OK,
* : -1 si probleme de traitement.
* EXTERNE : -
* ACTION : Recuperation des informations d'une région dans la base Oracle.
* NOTES : -
* ATTENTION : -
* REVISION : -
*------------------------- ---------- ---------- ---------- ---------- ---
*/
int ora_getregio(char *idregion, TYPE_ORA_REG *infosreg)
{
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Declarations des variables de travail. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
int lg;
char typeregi = 'R';
EXEC SQL WHENEVER SQLERROR GOTO error_getregio;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Selection de la region souhaitee. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
(void) uti_trace_print("%s: ora_getregio: avant requete ...\n", MODULE);
EXEC SQL
SELECT codezone, libezone
INTO :infosreg
FROM REGDEP
WHERE typezone=:typeregi AND codezone=:idregion;
(void) uti_trace_print("%s: ora_getregio: apres requete ...\n", MODULE);
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Normalisation des informations sur la region souhaitee. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
lg = uti_lenutile(infosreg->cod eregi, sizeof(infosreg->coderegi) );
infosreg->coderegi[lg] = 0;
lg = uti_lenutile(infosreg->lib eregi, sizeof(infosreg->liberegi) );
infosreg->liberegi[lg] = 0;
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Sortie normale **/
/**----------------------- ---------- ---------- ---------- ---------- **/
return (0);
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Traitement en cas d'erreur. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
error_getregio:
ora_sqlerror("ora_getregio : Probleme de recuperation des informations d'une region dans la
base Oracle ...");
return(-1);
}
And here is the result :
TRA, 25/01/2000, 08:43:51, ORAFONCS: ora_getregio: avant requete ...
ERR, 25/01/2000, 08:43:51, ORAFONCS: ERREUR: ora_getregio: Probleme de recuperation des
informations d'une region dans la base Oracle ...
ERR, 25/01/2000, 08:43:51, ORAFONCS: ERREUR: ORA-01460: unimplemented or unreasonable
conversion requested
Here are my variables :
NLS_LANG = FRENCH_FRANCE.WE8ISO8859P1 .
ORACLE_BASE = /medoc/vol1/oracle
ORACLE_HOME = /medoc/vol1/oracle/product /804
ORACLE_SID = A
ORACLE_TERM = sun5
Are these definitions compatible with my piece of code ?
Thanks for your answer.
Thierry
/*------------------------
* FONCTION : ora_getregio
* AUTEUR :
* CREE LE : 22 Decembre 1999
* MODIFIE LE : 23 Decembre 1999
* ENTREES : # idregion : identifiant de la region courante.
* SORTIES : # infosreg : informations sur la region.
* RESULTAT : 0 si traitement OK,
* : -1 si probleme de traitement.
* EXTERNE : -
* ACTION : Recuperation des informations d'une région dans la base Oracle.
* NOTES : -
* ATTENTION : -
* REVISION : -
*-------------------------
*/
int ora_getregio(char *idregion, TYPE_ORA_REG *infosreg)
{
/**-----------------------
/** Declarations des variables de travail. **/
/**-----------------------
int lg;
char typeregi = 'R';
EXEC SQL WHENEVER SQLERROR GOTO error_getregio;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
/**-----------------------
/** Selection de la region souhaitee. **/
/**-----------------------
(void) uti_trace_print("%s: ora_getregio: avant requete ...\n", MODULE);
EXEC SQL
SELECT codezone, libezone
INTO :infosreg
FROM REGDEP
WHERE typezone=:typeregi AND codezone=:idregion;
(void) uti_trace_print("%s: ora_getregio: apres requete ...\n", MODULE);
/**-----------------------
/** Normalisation des informations sur la region souhaitee. **/
/**-----------------------
lg = uti_lenutile(infosreg->cod
infosreg->coderegi[lg] = 0;
lg = uti_lenutile(infosreg->lib
infosreg->liberegi[lg] = 0;
/**-----------------------
/** Sortie normale **/
/**-----------------------
return (0);
/**-----------------------
/** Traitement en cas d'erreur. **/
/**-----------------------
error_getregio:
ora_sqlerror("ora_getregio
base Oracle ...");
return(-1);
}
And here is the result :
TRA, 25/01/2000, 08:43:51, ORAFONCS: ora_getregio: avant requete ...
ERR, 25/01/2000, 08:43:51, ORAFONCS: ERREUR: ora_getregio: Probleme de recuperation des
informations d'une region dans la base Oracle ...
ERR, 25/01/2000, 08:43:51, ORAFONCS: ERREUR: ORA-01460: unimplemented or unreasonable
conversion requested
Here are my variables :
NLS_LANG = FRENCH_FRANCE.WE8ISO8859P1
ORACLE_BASE = /medoc/vol1/oracle
ORACLE_HOME = /medoc/vol1/oracle/product
ORACLE_SID = A
ORACLE_TERM = sun5
Are these definitions compatible with my piece of code ?
Thanks for your answer.
Thierry
Could you give us a description of the table REGDEP?
ASKER
-------------------------- ---------- ---------- ---------- -
-- Table des regions et departements --
-------------------------- ---------- ---------- ---------- -
create table regdep (
typezone varchar2(1),
codezone varchar2(3),
libezone varchar2(30),
coderegi varchar2(2)
)
tablespace annuaire
storage (initial 10k next 10k pctincrease 0);
-- Table des regions et departements --
--------------------------
create table regdep (
typezone varchar2(1),
codezone varchar2(3),
libezone varchar2(30),
coderegi varchar2(2)
)
tablespace annuaire
storage (initial 10k next 10k pctincrease 0);
ASKER
I have changed my function and it works on Oracle 7.3.4 and 8.0.4, but I don't undestand why !!!
Here is the new code :
int ora_getregio(char *idregion, TYPE_ORA_REG *infosreg)
{
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Declarations des variables de travail. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
int lg;
char requete[BUFSIZ];
EXEC SQL WHENEVER SQLERROR GOTO error_getregio;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Selection de la region souhaitee. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
(void) sprintf(requete, "SELECT codezone, libezone FROM REGDEP WHERE typezone='R' AND codezone='%s'", idregion);
(void) uti_trace_print("%s: requete = %s\n", MODULE, requete);
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Recuperation des informations sur la region souhaitee. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
EXEC SQL PREPARE T FROM :requete;
EXEC SQL DECLARE cur_infos_reg CURSOR FOR T;
EXEC SQL OPEN cur_infos_reg;
EXEC SQL FETCH cur_infos_reg INTO :infosreg;
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Normalisation des informations sur la region souhaitee. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
lg = uti_lenutile(infosreg->cod eregi, sizeof(infosreg->coderegi) );
infosreg->coderegi[lg] = 0;
lg = uti_lenutile(infosreg->lib eregi, sizeof(infosreg->liberegi) );
infosreg->liberegi[lg] = 0;
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Sortie normale **/
/**----------------------- ---------- ---------- ---------- ---------- **/
return (0);
/**----------------------- ---------- ---------- ---------- ---------- **/
/** Traitement en cas d'erreur. **/
/**----------------------- ---------- ---------- ---------- ---------- **/
error_getregio:
ora_sqlerror("ora_getregio : Probleme de recuperation des informations d'une region dans la base Oracle ...");
return(-1);
}
Here is the new code :
int ora_getregio(char *idregion, TYPE_ORA_REG *infosreg)
{
/**-----------------------
/** Declarations des variables de travail. **/
/**-----------------------
int lg;
char requete[BUFSIZ];
EXEC SQL WHENEVER SQLERROR GOTO error_getregio;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
/**-----------------------
/** Selection de la region souhaitee. **/
/**-----------------------
(void) sprintf(requete, "SELECT codezone, libezone FROM REGDEP WHERE typezone='R' AND codezone='%s'", idregion);
(void) uti_trace_print("%s: requete = %s\n", MODULE, requete);
/**-----------------------
/** Recuperation des informations sur la region souhaitee. **/
/**-----------------------
EXEC SQL PREPARE T FROM :requete;
EXEC SQL DECLARE cur_infos_reg CURSOR FOR T;
EXEC SQL OPEN cur_infos_reg;
EXEC SQL FETCH cur_infos_reg INTO :infosreg;
/**-----------------------
/** Normalisation des informations sur la region souhaitee. **/
/**-----------------------
lg = uti_lenutile(infosreg->cod
infosreg->coderegi[lg] = 0;
lg = uti_lenutile(infosreg->lib
infosreg->liberegi[lg] = 0;
/**-----------------------
/** Sortie normale **/
/**-----------------------
return (0);
/**-----------------------
/** Traitement en cas d'erreur. **/
/**-----------------------
error_getregio:
ora_sqlerror("ora_getregio
return(-1);
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.