2. Preparación

Bueno, supongamos que ya tenéis instalado y funcionando el soft de oracle. Os adelanto un par de cuestiones sobre cómo instalarlo. El proceso consiste básicamente en:


int main()
{
char login[255]="usuario/contraseña@basedatos";
char c;
/*Esto es un comentario*/
EXEC SQL BEGIN DECLARE SECTION;
char *uid="eyps_manager/eyps_manager@pru_prd_dba";
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca.h;
EXEC SQL CONNECT :uid;
printf("dale caña");
c=getchar();
EXEC SQL COMMIT WORK RELEASE;
return 0;
}
  

Este fichero no hace nada. Únicamene conecta con la base de datos y espera a que pulsemos una tecla. Es simplemente para confirmar que funciona el proc. La configuracion de variables de entorno que tengo son:


LANG=es_ES.ISO-8859-15
LC_ALL=es_ES.ISO-8859-15
LC_MESSAGES=spanish
LD_LIBRARY_PATH=:/opt/oracle/product/8.1.7/lib
ORACLE_BASE=/opt/oracle
ORACLE_HOME=/opt/oracle/product/8.1.7
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/oracle/product/8.1.7/bin:
				/opt/java/jdeveloper/jdev/bin:/opt/java/jdk1.3.1_07/bin
  

Si intentamos compilar a mano el fichero que he puesto al principo pasa lo siguiente:
$ proc conecta.pc
Esto generará un fichero conecta.c que tendremos que compilar en el gcc. Ojo al dato: el proc se configura con un fichero $ORACLE_HOME/precomp/admin/pcscfg.cfg Este fichero por omisión está vacío, y de momento dejadlo así. Luego os contaré qué poner ahí.

La sintaxis del gcc para que compile bien:
gcc conecta.c -o conecta -idirafter $ORACLE_HOME/precomp/public \ -L$ORACLE_HOME/lib -lclntsh
Se debería poder indicar las bibliotecas en el $LD_LIBRARY_PATH pero yo no he conseguido que funcione, así que pasamos los parámetros en la línea de comandos.

Bueno, ya podéis ejecutarlo. En el mejor de los casos conectará a la base de datos y os pedirá que pulséis una tecla y en el peor de los casos os dará un error ORA-***** pero el ejecutable está funcionando.

¿Ha sido fácil no? pues intentar compilar ahora el sample1.pc a ver que pasa.


---------------------Error.log------------------------

Pro*C/C++: Release 8.1.7.4.0 - Production on Sáb Jun 28 20:37:39 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

Valores de la opción predeterminados del sistema tomados de: 
		/opt/oracle/product/8.1.7/precomp/admin/pcscfg.cfg

Error en la línea 34, columna 11 del fichero /usr/include/stdio.h
# include <stddef.h>
..........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 29, columna 10 del fichero /usr/include/bits/types.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error de sintaxis en la línea 50, columna 3, fichero /usr/include/bits/pthreadtypes.h:
Error en la línea 50, columna 3 del fichero /usr/include/bits/pthreadtypes.h
  size_t __guardsize;
..1
PCC-S-02201, Se ha encontrado el símbolo "size_t" cuando se esperaba uno de los 
siguientes:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,

El símbolo "enum," ha sido sustituido por "size_t" para continuar.

Error de sintaxis en la línea 53, columna 3, fichero /usr/include/bits/pthreadtypes.h:
Error en la línea 53, columna 3 del fichero /usr/include/bits/pthreadtypes.h
  size_t __stacksize;
..1
PCC-S-02201, Se ha encontrado el símbolo "size_t" cuando se esperaba uno de los 
siguientes:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,
El símbolo "enum," ha sido sustituido por "size_t" para continuar.

Error en la línea 14, columna 10 del fichero /usr/include/_G_config.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 48, columna 10 del fichero /usr/include/wchar.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error de sintaxis en la línea 72, columna 5, fichero /usr/include/wchar.h:
Error en la línea 72, columna 5 del fichero /usr/include/wchar.h
    wint_t __wch;
....1
PCC-S-02201, Se ha encontrado el símbolo "wint_t" cuando se esperaba uno de los 
siguientes:

   char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,
El símbolo "enum," ha sido sustituido por "wint_t" para continuar.

Error de sintaxis en la línea 29, columna 3, fichero /usr/include/_G_config.h:
Error en la línea 29, columna 3 del fichero /usr/include/_G_config.h
  __mbstate_t __state;
..1
PCC-S-02201, Se ha encontrado el símbolo "__mbstate_t" cuando se esperaba uno de
 los siguientes:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,
El símbolo "enum," ha sido sustituido por "__mbstate_t" para continuar.

Error de sintaxis en la línea 34, columna 3, fichero /usr/include/_G_config.h:
Error en la línea 34, columna 3 del fichero /usr/include/_G_config.h
  __mbstate_t __state;
..1
PCC-S-02201, Se ha encontrado el símbolo "__mbstate_t" cuando se esperaba uno de
 los siguientes:

   } char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,
El símbolo "enum," ha sido sustituido por "__mbstate_t" para continuar.

Error en la línea 48, columna 10 del fichero /usr/include/wchar.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 31, columna 10 del fichero /usr/include/gconv.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error de sintaxis en la línea 72, columna 26, fichero /usr/include/gconv.h:
Error en la línea 72, columna 26 del fichero /usr/include/gconv.h
                            unsigned char **, size_t *, int, int);
.........................1
PCC-S-02201, Se ha encontrado el símbolo "size_t" cuando se esperaba uno de los 
siguientes:

   ... auto, char, const, double, enum, float, int, long,
   ulong_varchar, OCIBFileLocator OCIBlobLocator,
   OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
   OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
   short, signed, sql_context, sql_cursor, static, struct,
   union, unsigned, utext, uvarchar, varchar, void, volatile,
   a typedef name, exec oracle, exec oracle begin, exec,
   exec sql, exec sql begin, exec sql type, exec sql var,
El símbolo "enum," ha sido sustituido por "size_t" para continuar.

Error de sintaxis en la línea 85, columna 7, fichero /usr/include/gconv.h:
Error en la línea 85, columna 7 del fichero /usr/include/gconv.h
                                  size_t *);
......1
PCC-S-02201, Se ha encontrado el símbolo "size_t" cuando se esperaba uno de los 
siguientes:

   ... auto, char, const, double, enum, float, int, long,
   ulong_varchar, OCIBFileLocator OCIBlobLocator,
   OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
   OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
   short, signed, sql_context, sql_cursor, static, struct,
   union, unsigned, utext, uvarchar, varchar, void, volatile,
   a typedef name, exec oracle, exec oracle begin, exec,
   exec sql, exec sql begin, exec sql type, exec sql var,
El símbolo "enum," ha sido sustituido por "size_t" para continuar.

Error de sintaxis en la línea 94, columna 6, fichero /usr/include/gconv.h:
Error en la línea 94, columna 6 del fichero /usr/include/gconv.h
                                        size_t *);
.....1
PCC-S-02201, Se ha encontrado el símbolo "size_t" cuando se esperaba uno de los 
siguientes:

   ... auto, char, const, double, enum, float, int, long,
   ulong_varchar, OCIBFileLocator OCIBlobLocator,
   OCIClobLocator, OCIDateTime, OCIExtProcContext, OCIInterval,
   OCIRowid, OCIDate, OCINumber, OCIRaw, OCIString, register,
   short, signed, sql_context, sql_cursor, static, struct,
   union, unsigned, utext, uvarchar, varchar, void, volatile,
   a typedef name, exec oracle, exec oracle begin, exec,
   exec sql, exec sql begin, exec sql type, exec sql var,
El símbolo "enum," ha sido sustituido por "size_t" para continuar.

Error de sintaxis en la línea 103, columna 3, fichero /usr/include/gconv.h:
Error en la línea 103, columna 3 del fichero /usr/include/gconv.h
  __gconv_trans_fct __trans_fct;
..1
PCC-S-02201, Se ha encontrado el símbolo "__gconv_trans_fct" cuando se esperaba 
uno de los siguientes:

   char, const, double, enum, float, int, long, ulong_varchar,
   OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
   OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
   OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
   struct, union, unsigned, utext, uvarchar, varchar, void,
   volatile, a typedef name,

Error en la línea 53, columna 11 del fichero /usr/include/libio.h
# include <stdarg.h>
..........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 33, columna 10 del fichero /usr/include/string.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 33, columna 10 del fichero /usr/include/stdlib.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 146, columna 10 del fichero /usr/include/sys/types.h
#include <stddef.h>
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error en la línea 25, columna 10 del fichero /usr/include/alloca.h
#include <stddef.hgt;
.........1
PCC-S-02015, no se ha podido abrir el fichero de inclusión
Error de sintaxis en la línea 0, columna 0, fichero sample1.pc:
Error en la línea 0, columna 0 del fichero sample1.pc
PCC-S-02201, Se ha encontrado el símbolo "<eof>" cuando se esperaba uno de los s
iguientes:

   ; : an identifier, end-exec, random_terminal

Error en la línea 0, columna 0 del fichero sample1.pc
PCC-F-02102, Error fatal al realizar el preprocesamiento de C
---------------------------Error.log----------------------

Ahora resulta que el stdio.h tiene errores de sintaxis.

Bueno pues esto es lo que más tiempo me ha llevado. La solución es:

Cuanto pagais ehhhhhh??? Venga venga que esta me ha costado muchas horitas.....

Todo sea por la comunidad linux, os lo cuento gratis. La solucion se la debemos a Michael Ngarimu que lo publicó en un correo en dbforums.com.

El problema viene que el precompilador de c no funciona correctamente y la solucion consiste en añadir un ficherito que solucione el problema de la stdarg.h El ficherito en cuestión es: $usr/local/include/sdtarg.h


-------------------------------sdtarg.h--------------------
#if !defined(_H_STDARG_)
#define _H_STDARG_
#define __builtin_va_list void **
#include "/usr/lib/gcc-lib/i386-linux/3.0.4/include/stdarg.h"
#endif
/*_H_STDARG_*/
-------------------------------sdtarg.h--------------------

y ahora nos falta configurar el pcscfg.cfg para que utilice este fichero y para que funcione OK. El ficherito es:


---------------------------pcsdfg.cfg---------------------------------
sys_include=(/usr/local/include,$ORACLE_HOME/precomp/public,/usr/lib/gcc-lib/i386-linux/3.0.4/include,/usr/include)
include=($ORACLE_HOME/precomp/public)
include=($ORACLE_HOME/rdbms/demo)
include=($ORACLE_HOME/network/public)
include=($ORACLE_HOME/plsql/public)
include=$ORACLE_HOME/precomp/syshdr
CODE=ANSI_C
---------------------------pcsdfg.cfg---------------------------------

Bueno, con esto le hemos dicho donde están la bibliotecas, y además que escoja primero el fichero stdarg.h que hemos creado nosotros.

Ahora si precompilamos pasa lo siguiente: $proc sample1.pc Y funciona Ahora volvemos a compilar como antes. gcc sample1.c -o sample1 -idirafter $ORACLE_HOME/precomp/public -L$ORACLE_HOME/lib -lclntsh


-----------------------Error.log--------------------------
/tmp/ccce7vPv.o: En la función `main':
/tmp/ccce7vPv.o(.text+0x344): the `gets' function is dangerous and should not be used.
--------------------Error.log--------------------------

Bueno un errorcillo sin importancia. Pues eso es todo. Espero que no tengáis problemas para compilar con el proc.

Este documento ha sido escrito por: Guybrush Threepwood. Guybrush@jazzcyber.com No os molestéis en mandarme preguntas porque lo he conseguido resolver casi de coña. Y no creo que pueda solucionaros el problema.