Procesar Oracle en Debian Woody | ||
---|---|---|
Anterior |
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:
El tema mas importante que no está documentado en ningún sitio es quitar la variable de entorno $LANG , si no lo quitas el «installer» no funciona.
Después, si te da el error de fin de canal de comunicaciones al hacer el startup nomount, hay que parchear las glib, aunque creo recordar que para debian no es necesario. De todos modos esto está ya muy documentado y buscado en google o en metalink seguro que encontráis algo. De todos modos no desesperéis, dentro de poco haré la prueba, y lo documentaré otra vez. Bueno, como ya supondréis la mejor manera de probar los compiladores son los ejemplos que oracle proporciona, pero yo por si acaso voy a daros otro que es más simple y es lo básico que ha de compilar.
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 |
La sintaxis del gcc para que compile bien:
gcc conecta.c -o conecta -idirafter $ORACLE_HOME/precomp/public \ -L$ORACLE_HOME/lib -lclntsh |
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.