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->coderegi, sizeof(infosreg->coderegi));
                     infosreg->coderegi[lg] = 0;
                     lg = uti_lenutile(infosreg->liberegi, 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
tplaiAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

HaukeCommented:
Could you give us a description of the table REGDEP?
0
tplaiAuthor Commented:
---------------------------------------------------------
-- 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);
0
tplaiAuthor Commented:
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->coderegi, sizeof(infosreg->coderegi));
  infosreg->coderegi[lg] = 0;
  lg = uti_lenutile(infosreg->liberegi, 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);
}

0
HaukeCommented:
I think the problem is '.. WHERE typezone=:typeregi ..' and the variable of type char. Try to use 'char typeregi[] = "R";' instead. A varchar2(1) column needs a string variable. A variable of type char is scalar.

For a constant value '.. WHERE typezone='R' ..' is the best choice.

 
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Oracle Database

From novice to tech pro — start learning today.