Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Base de Datos Oracle: desarrollo de aplicaciones
Oracle Pro-C/C++
jul-04 Alberto M.F.A. [email protected] 2
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. [email protected] 3
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
jul-04 Alberto M.F.A. [email protected] 4
Características� Permite conexión simultanea a varios
servidores� Control cómodo de errores� Soporta tipos objeto, LOBS, CLOBS� Puede interactuar con OCI
jul-04 Alberto M.F.A. [email protected] 5
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. [email protected] 6
Compilación
Exec
jul-04 Alberto M.F.A. [email protected] 7
Compilación detallada
Preproceso Compilación010101010111001
Linkage
010101010111001
.obj
.lib
.tmp
.pc .c
010101010111001
.exe.h .h <<includes>>
PROC VC++
jul-04 Alberto M.F.A. [email protected] 8
Compilación MVC++ 6.0� Librerías solo para MSVC++ 6.0� El preprocesador proc.exe en
%ORA_HOME%\bin
� Linkar con oraSQL8.lib y oraSQX8.lib en%ORA_HOME%\precomp\lib\msvc
jul-04 Alberto M.F.A. [email protected] 9
Ficheros de inclusión� Es necesario incluir en nuestro código:#include <oci.h>
#include <sqlca.h>/*SQL Communications Area*/
� <oci.h> está en%ORA_HOME%\oci\include
� <sqlca.h> está en %ORA_HOME%\precomp\public
jul-04 Alberto M.F.A. [email protected] 10
Invocación de proc.exeproc parse=FULL � varios modos
iname=$(InputName).pconame=$(InputName).cinclude=“%ORA_HOME%\oci\include"include=“%ORA_HOME%\precomp\public"include="$(MSDEVDIR)\..\..\vc98\include“
� Tiene más opciones ver: $>proc -h
jul-04 Alberto M.F.A. [email protected] 11
Integración con VC++� Sobre <fichero>.pc� Botón derecho ratón � Settings...� Seleccionar Custom build� Cuadro Commands...
� %ORA_HOME%\bin\proc.exe parse=FULL ...� Cuadro Outputs...
� $(InputName).c� Así para cada fichero .PC� Incluir en el proyecto los generados .C
jul-04 Alberto M.F.A. [email protected] 12
Project Settings en VC++
jul-04 Alberto M.F.A. [email protected] 13
Línea de comando para precompilación sencila%ORA_HOME%\bin\proc.exe parse=FULL
iname=$(InputName).pc
oname=$(InputName).c
include="%ORA_HOME%\oci\include“
include="%ORA_HOME%\precomp\public“
include="$(MSDEVDIR)\..\..\vc98\include“
include="."
jul-04 Alberto M.F.A. [email protected] 14
Estructura de ejecución
Net8
OCI
SQLLIB
Código Pro-C/C++
Código .PC
Interfaz propietario, no documentado
jul-04 Alberto M.F.A. [email protected] 15
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. [email protected] 16
Código SQL incrustado� Estructura:
EXEC SQL <sentencia SQL> ;� Se puede insertar en cualquier parte� Se pueden referenciar variables del
programa host
jul-04 Alberto M.F.A. [email protected] 17
Código PL/SQL incrustadoEXEC SQL EXECUTE
DECLARE
...
BEGIN
...
END;
END-EXEC;
jul-04 Alberto M.F.A. [email protected] 18
Reglas para código incrustado� Admite comentarios C y SQL� Strings en SQL con ‘ ’ y NO “ ”� Código C (prototipos de función):
� MODE=CPP � C++� MODE=KR_C � Kernighan y Ritchie� MODE=ANSI_C
� Continuación strings EXEC SQL .... \
jul-04 Alberto M.F.A. [email protected] 19
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. [email protected] 20
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
jul-04 Alberto M.F.A. [email protected] 21
Ejemplo variables hostint nEmpleado; //Esto es C
...
EXEC SQL SELECT //Esto es PRO-C
NVL(MAX(empno), 0) INTO:nEmpleado FROM emp;
...
if (nEmpleado <> 0) // Esto es C
{
...
jul-04 Alberto M.F.A. [email protected] 22
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
jul-04 Alberto M.F.A. [email protected] 23
Indicadores� Avisan de NULL y truncamientos
char emplName[14];
char emplJob[10];
short indJob; // ���� Indicador
EXEC SQL FETCH c INTO:emplName, :emplJob:indJob;
jul-04 Alberto M.F.A. [email protected] 24
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;
jul-04 Alberto M.F.A. [email protected] 25
Indicadores, valores� 0 Todo correcto� -1 Valor leído/escrito es NULL� -2 Truncamiento no determinable� >0Truncamiento, la longitud inicial es
el valor
jul-04 Alberto M.F.A. [email protected] 26
Cursores� Para las SELECT que devuelvan una
sola fila no hace falta declararlos
� Para las SELECT múltiples si
jul-04 Alberto M.F.A. [email protected] 27
Ejemplo CursoresEXEC SQL DECLARE <nombre> CURSOR FOR <sql>;
...
EXEC SQL OPEN c;
EXEC SQL WHENEVER NOT FOUND DO break;
while(MORE_ROWS)
{
EXEC SQL FETCH c INTO <binded vars>
... Proceso ...
}
EXEC SQL CLOSE c;
jul-04 Alberto M.F.A. [email protected] 28
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. [email protected] 29
Abrir la conexión� EXEC SQL CONNECT :user_pass;
� EXEC SQL CONNECT :user IDENTIFIED BY :password;
� EXEC SQL CONNECT :user IDENTIFIEDBY :password ALTER AUTHORIZATION :newpass;
jul-04 Alberto M.F.A. [email protected] 30
Conexión automática� OP$<username>
� <username> en el S.O.� Trata de conectar automáticamente si:
� Si opción de proc.exeAUTO_CONNECT=YES
� O en códigochar *oraid = “/”; � Solo 1 charEXEC SQL CONNECT :oraid;
jul-04 Alberto M.F.A. [email protected] 31
Cerrar la conexiónEXEC SQL COMMIT RELEASE;
� Si el programa acaba sin COMMIT todo el trabajo perdido
EXEC SQL ROLLBACK RELEASE;� Si se detecta error grave
jul-04 Alberto M.F.A. [email protected] 32
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. [email protected] 33
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
jul-04 Alberto M.F.A. [email protected] 34
Transacciones� Cuando el programa para por fallo software o
hardware...� Se produce un ROLLBACK automático
� Todo las escrituras que haga el programa están dentro de una ÚNICA transacción hasta que se hace COMMIT o ROLLBACK � Hacerlo con frecuencia� Excepción: Si por el medio se mete DDL
jul-04 Alberto M.F.A. [email protected] 35
SavePoints� Dentro de una transacción compleja:
EXEC SQL SAVEPOINT start_delete;
EXEC SQL DELETE FROM ...;
EXEC SQL ROLLBACK TO SAVEPOINTstart_delete;
jul-04 Alberto M.F.A. [email protected] 36
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. [email protected] 37
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
jul-04 Alberto M.F.A. [email protected] 38
SQLCA� Es una struct C que almacena status de
operaciones� Inclusión, dos alternativas:
EXEC SQL INCLUDE SQLCA;
#include <sqlca.h>
jul-04 Alberto M.F.A. [email protected] 39
Contenido de SQLCA� Entre otras cosas...
� sqlca.sqlcode� 0 si OK, >0 NO_DATA, <0 Error grave
� sqlca.sqlerrm.sqlerrmc mensaje de error� sqlca.sqlerrm.sqlerrml longitud err. mens� sqlca.sqlerrd[2] nº de filas procesadas� sqlca.sqlerrd[4] nº de columna error parse� sqlca.sqlwarm[0..7] varios warms
jul-04 Alberto M.F.A. [email protected] 40
WHENEVEREXEC SQL WHENEVER <condition><action>;
� Condiciones:� SQLWARNING � consultar SQLCA� SQLERROR� NOT FOUND � última fila, no hay filas
jul-04 Alberto M.F.A. [email protected] 41
Acciones WHENEVER� CONTINUE� DO <expresion_lenguaje>� DO BREAK� DO CONTINUE� GOTO <label>� STOP
jul-04 Alberto M.F.A. [email protected] 42
Ejemplos WHENEVEREXEC SQL WHENEVER NOT FOUND DOhandle_error();
EXEC SQL WHENEVER SQLWARNINGCONTINUE;
EXEC SQL WHENEVER SQLERROR GOTOfinaliza;
jul-04 Alberto M.F.A. [email protected] 43
Ejemplos WHENEVER
EXEC SQL WHENEVER NOT FOUND DO break;
while(MORE_ROWS)
{
EXEC SQL FETCH c INTO :emplName,:emplJob:indJob;
... Proceso ...
}
jul-04 Alberto M.F.A. [email protected] 44
Á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
jul-04 Alberto M.F.A. [email protected] 45
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. [email protected] 46
Llamada a P/F almacenados� Dos métodos
� CALL� BEGIN ... END
� CALL cómodo para llamar a procedimientos y funciones
� BEGIN ... END única forma si el procedimiento devuelve un cursor
jul-04 Alberto M.F.A. [email protected] 47
CALLEXEC SQL
CALL [schema.][package.]stored_proc[@db_link](arg1, ...)
[INTO :ret_var[[INDICATOR]:ret_ind]] ;
jul-04 Alberto M.F.A. [email protected] 48
Ejemplo call...
int num, fact;
...
EXEC SQL CALLmathpkge.fact(:num) INTO:fact ;
...
jul-04 Alberto M.F.A. [email protected] 49
BEGIN ... ENDEXEC SQL EXECUTE
BEGIN
raise_salary(:emp, :increase);
END;
END-EXEC;
jul-04 Alberto M.F.A. [email protected] 50
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
jul-04 Alberto M.F.A. [email protected] 51
Ejemplo Procs y cursores (1)SQL_CURSOR crsr;
EXEC SQL ALLOCATE :crsr;
EXEC SQL EXECUTE
BEGIN proc(:id, :crsr); END;
END-EXEC;
jul-04 Alberto M.F.A. [email protected] 52
Ejemplo Procs y cursores (y 2)EXEC SQL WHENEVER NOT FOUND ...
while(MORE_ROWS)
{
EXEC SQL FETCH :crsr INTO ...
}
EXEC SQL CLOSE :crsr;
EXEC SQL FREE :crsr;
jul-04 Alberto M.F.A. [email protected] 53
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. [email protected] 54
Compilación detallada
Preproceso Compilación010101010111001
Linkage
010101010111001
.obj
.lib
.tmp
PROC VC++010101010111001.pc .c
.exe.h .h
#INCLUDE
jul-04 Alberto M.F.A. [email protected] 55
Precompilación condicional� Como la precompilación normal del
compilador pero para Pro-C
jul-04 Alberto M.F.A. [email protected] 56
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, #, ##
jul-04 Alberto M.F.A. [email protected] 57
Opciones del precompilador� Muchas opciones se pueden dar desde la
línea de comandos de proc.exe
� También se pueden ajustar en código EXEC ORACLE OPTION(<opc>=<val>);
� Está en efecto hasta que aparece otra OPTION en el mismo fichero.
� No pasan de un fichero a otro.
jul-04 Alberto M.F.A. [email protected] 58
Opciones si se usa PL/SQL ...� ... o se desea chequeo estricto� Más opciones en la línea de comandos:%ORA_HOME%\proc.exe ...
SQLCHECK=SEMANTICSUSERID=user/pass@instance
� Para solo algunas partes de código:EXEC ORACLE OPTION(SQLCHECK=SEMANTICS)
� PROC chequea contra el diccionario de datos� Se conecta con el servidor para precompilar� ¡El servidor debe estar on-line!
jul-04 Alberto M.F.A. [email protected] 59
Algunas opciones