Professional Documents
Culture Documents
desarrollo de aplicaciones
Oracle Pro-C/C++
Contenidos
Introducción
Compilación
Código incrustado
Comunicación de variables
Conexión
Transacciones
Control de errores
Llamadas a procedimientos almacenados
Más sobre el pre-compilador
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 2
Características
Se escribe todo en C/C++
Precompila SQL, valida sintaxis antes de
ejecutar
Se puede emplear cualquier sentencia
SQL y PL/SQL
Permite Threading
Conversión de tipos C a Oracle
Características
Permite conexión simultanea a varios
servidores
Control cómodo de errores
Soporta tipos objeto, LOBS, CLOBS
Puede interactuar con OCI
Compilación
Exec
.h .h <<includes>>
.exe
01010
10101
11001
.pc PROC VC++
.c
01010
Preproceso Compilación 10101 Linkage
11001
.tmp .obj
01010
10101 .lib
11001
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 7
Invocación de proc.exe
proc parse=FULL varios modos
iname=$(InputName).pc
oname=$(InputName).c
include=“%ORA_HOME%\oci\include"
include=“%ORA_HOME%\precomp\public"
include="$(MSDEVDIR)\..\..\vc98\include“
Estructura de ejecución
Código .PC
Código Pro-C/C++
SQLLIB
OCI
Net8
Variables host
Cualquier escalar o array
Son de lectura/escritura para SQL y el
programa host
Esta asociación se denomina binding
En C se referencian por el <nombre>
En SQL por :<nombre>
El nombre debe ser idéntico
Declare Section
Declare Section:
EXEC SQL BEGIN DECLARE SECTION;
char *uid = "scott/tiger";
...
EXEC SQL END DECLARE SECTION;
Necesaria si CODE=CPP o MODE=ANSI
o PARSE=NONE o PARSE=PARTIAL
char emplName[14];
char emplJob[10];
short indJob; // Indicador
EXEC SQL FETCH c INTO
:emplName, :emplJob:indJob;
Indicadores
Son de entrada/salida
Pueden usarse arrays como variables
Si se necesitan indicadores, otro array de
la misma dimensión con solo indicadores
int vector[5]; //Valores
int ind[5]; //Indicadores
EXEC SQL INSERT INTO tbl (val)
VALUES :vector:ind;
Cursores
Para las SELECT que devuelvan una
sola fila no hace falta declararlos
Contenidos
Introducción
Compilación
Código incrustado
Comunicación de variables
Conexión
Transacciones
Control de errores
Llamadas a procedimientos almacenados
Más sobre el pre-compilador
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 28
Abrir la conexión
EXEC SQL CONNECT :user_pass;
Conexión automática
OP$<username>
<username> en el S.O.
Trata de conectar automáticamente si:
Si opción de proc.exe
AUTO_CONNECT=YES
O en código
char *oraid = “/”; Solo 1 char
EXEC SQL CONNECT :oraid;
Contenidos
Introducción
Compilación
Código incrustado
Comunicación de variables
Conexión
Transacciones
Control de errores
Llamadas a procedimientos almacenados
Más sobre el pre-compilador
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 32
Transacciones
Cada sentencia inicia una
implícitamente
Las sentencias DDL inician y terminan
implícitamente
Las sentencias DML hacen COMMIT o
ROLLBACK cuando:
EXEC SQL COMMIT/ROLLBACK [WORK];
Se inicia detrás una sentencia DDL
Transacciones
Cuando el programa para por fallo software o
hardware...
Se produce un ROLLBACK automático
Contenidos
Introducción
Compilación
Código incrustado
Comunicación de variables
Conexión
Transacciones
Control de errores
Llamadas a procedimientos almacenados
Más sobre el pre-compilador
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 36
Control de errores
Dos mecanismos:
Uso de la SQLCA
Si es necesaria más información también se
usa ORACA
Uso de la sentencia WHENEVER
SQLCA
Es una struct C que almacena status de
operaciones
Inclusión, dos alternativas:
EXEC SQL INCLUDE SQLCA;
#include <sqlca.h>
WHENEVER
EXEC SQL WHENEVER <condition>
<action>;
Condiciones:
SQLWARNING consultar SQLCA
SQLERROR
NOT FOUND última fila, no hay filas
Ejemplos WHENEVER
EXEC SQL WHENEVER NOT FOUND DO
handle_error();
EXEC SQL WHENEVER SQLWARNING
CONTINUE;
EXEC SQL WHENEVER SQLERROR GOTO
finaliza;
Ámbito WHENEVER
Su ámbito es posicional, no lógico
Vigila todas las sentencias que
físicamente siguen en el código
¡No vigila el flujo del programa!
Una WHENEVER está activa hasta que
otra la revoca
Buena práctica: Una antes de cada SQL
a vigilar
Ejemplo call
...
int num, fact;
...
EXEC SQL CALL
mathpkge.fact(:num) INTO
:fact ;
...
Procedimientos y cursores
Variable de tipo SQL_CURSOR
Se inicializa (allocate)
Se le pasa el proc almacenado
Se recorren todas las filas
Se cierra
Se libera
Compilación detallada
#INCLUDE
.h .h
.exe
01010
PROC VC++ 10101
11001
.pc .c
01010
Preproceso Compilación 10101 Linkage
11001
.tmp .obj
01010
10101 .lib
11001
jul-04 Alberto M.F.A. alb@lsi.uniovi.es 54
Precompilación condicional
Como la precompilación normal del
compilador pero para Pro-C
Ficheros de inclusión C
Pro-C interpreta la mayoría de las
directivas del preprocesador C del
compilador.
#define, #ifdef, ...
NO interpreta:
#pragma, #error, #line, #, ##
%ORA_HOME%\proc.exe ...
SQLCHECK=SEMANTICS
USERID=user/pass@instance
Para solo algunas partes de código: