30
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

desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 2: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 3: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 4: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 5: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 6: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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++

Page 7: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 8: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 9: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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 .... \

Page 10: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 11: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 12: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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;

Page 13: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 14: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 15: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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;

Page 16: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 17: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 18: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 19: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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>

Page 20: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 21: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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;

Page 22: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 23: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 24: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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 ;

...

Page 25: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 26: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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;

Page 27: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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

Page 28: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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, #, ##

Page 29: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

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!

Page 30: desarrollo de aplicaciones Base de Datos Oracledi002.edv.uniovi.es/~vinuesa/cursos/curso_oracle/transp...Base de Datos Oracle: desarrollo de aplicaciones Oracle Pro-C/C++ jul-04 Alberto

jul-04 Alberto M.F.A. [email protected] 59

Algunas opciones