Sie sind auf Seite 1von 70

IntroduccinallenguajePL/SQL

PL/SQL

www.kybele.urjc.es

BD PL/SQL1

ndice

1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control 5. Cursores 6. Procedimientos y Funciones Almacenados 7. 7 Paquetes 8. Tratamiento de los Errores y Excepciones

PL/SQL

www.kybele.urjc.es

BD PL/SQL2

Introduccin

/ Q ORACLEPL/SQL
Procedural Language/Structured Query Language Apareci por primera vez en ORACLE versin 6 (1988). Lenguaje de programacin sencillo similar a C y ADA Lenguaje procedimental (ahora tambin OO) que ampla la funcionalidad de SQL aadiendo estructuras l l f i lid d d di d t t habituales en otros lenguajes: variables y tipos, estructuras de control, procedimientos y funciones,

PL/SQL

www.kybele.urjc.es

BD PL/SQL3

Introduccin

p / Q AportacionesdePL/SQL
Navegar registros l id d l E b b el cdigo en el servidor en l Embeber l di lugar del cliente Gestin de Excepciones Trabar con variables, colecciones, etc.

PL/SQL

www.kybele.urjc.es

BD PL/SQL4

Introduccin

/ Q ORACLEPL/SQL
Creacin de Programas Se pueden crear con cualquier editor y ejecutarlos desde el prompt del SQL*PLUS con START o @. Los ficheros creados sern de texto y tendrn la extensin .sql. Para que un fichero se ejecute correctamente debe tener en su ltima lnea el smbolo /.

PL/SQL

www.kybele.urjc.es

BD PL/SQL5

ConceptosBsicosdePL/SQL

Estructura de Bloques
La unidad bsica en PL/SQL es el bloque. Todos los programas PL/SQL estn compuestos por bloques, que pueden definirse de forma secuencial o estar anidados. id d Normalmente cada bloque realiza una unidad lgica de trabajo en el programa, separando as unas tareas de otras.

PL/SQL

www.kybele.urjc.es

BD PL/SQL6

ConceptosBsicosdePL/SQL

Estructura de Bloques
Hay diferentes tipos de bloques: Annimos (Anonymous blocks).- se construyen de forma dinmica y se ejecutan una sola vez. Con nombre (Named blocks).- son bloques con nombre, que al ( ) q ,q igual que el anterior se construyen, generalmente, de forma dinmica y se ejecutan una sola vez. Subprogramas.- procedimientos, paquetes o funciones almacenados Subprogramas. en la BD. No suelen cambiar despus de su construccin y se ejecutan mltiples veces mediante una llamada call. Disparadores (Triggers).- son bloques con nombre que tambin se almacenan en la BD. Tampoco suelen cambiar despus de su construccin y se ejecutan varias veces. Se ejecutan ante algn suceso de di d disparo, que ser una orden del lenguaje de manipulacin de datos d d ll j d i l i d d t (INSERT, UPDATE o DELETE) que se ejecuta sobre una tabla de la BD.
PL/SQL www.kybele.urjc.es BD PL/SQL7

ConceptosBsicosdePL/SQL

EstructuradeBloques
Todos los bloques tienen tres secciones diferenciadas: Seccin Declarativa: Donde se localizan todas las variables, cursores y tipos usados por q p el bloque. Tambin se pueden declarar en esta seccin las funciones y procedimientos locales. Estos subprogramas estarn disponibles solo para ese bloque. Seccin Ejecutable: Donde se lleva a cabo el trabajo del bloque. En esta seccin pueden aparecer tanto rdenes SQL (LMD y LCD) como rdenes procedimentales. di t l Seccin Errores: El cdigo de esta seccin no se ejecutar a menos que ocurra un error.
PL/SQL www.kybele.urjc.es BD PL/SQL8

ConceptosBsicosdePL/SQL

q EstructuradeBloques
[DECLARE] Declaracin de variables y subprogramas BEGIN j , y Q Seccin ejecutable, se incluyen las sentencias de SQL y procedimientos Es la seccin principal del bloque y es obligatoria (al menos debe haber una orden ejecutable) j ) [EXCEPTION] Zona de excepcin, se pueden colocar aqu las sentencias en caso de error END;

Esta seccin es opcional

Esta seccin es opcional

PL/SQL

www.kybele.urjc.es

BD PL/SQL9

ConceptosBsicosdePL/SQL ReglasyConvencionesdelLenguaje Unidades Lxicas:

Secuencia de caracteres Conjunto de caracteres permitido:


Letras maysculas y minsculas: Dgitos: 0 9 Espacios en blanco: tabuladores tabuladores, espaciado y retorno de carro Smbolos matemticos: + - * / Smbolos de puntuacin: ( ) { } # % ~& _

AZ y az

caracteres de < > = [] ; : . @

PL/SQL

www.kybele.urjc.es

BD PL/SQL10

ConceptosBsicosdePL/SQL ReglasyConvencionesdelLenguaje Identificadores:


S emplean para dar nombre a los objetos PL/SQL, t l como variables, cursores, l d b l bj t PL/SQL tales i bl Se tipos y subprogramas. Los identificadores constan de una letra, seguida por una secuencia opcional de caracteres, que pueden incluir l de dl ($) d l letras, nmeros, signos d dlar ($), caracteres de d subrayado y smbolos de almohadilla (#). Los dems caracteres no pueden emplearse. La longitud mxima de un identificador es de 30 caracteres y todos los caracteres son significativos. Ejemplos vlidos
X, V_ENAME, CodEmp, V1, V2_, ES_UNA_VARIABLE_#

Variables MAL declaradas


X+Y , _ENAME, Cod Emp, 1V, ESTA ES . VARIABLE (+ de 30 caracteres)
PL/SQL www.kybele.urjc.es BD PL/SQL11

ConceptosBsicosdePL/SQL ReglasyConvencionesdelLenguaje Maysculas y minsculas:


Hay que tener en cuenta que PL/SQL no diferencia entre maysculas y i l t d l i i t id tifi d i i l t minsculas, as todos los siguientes identificadores serian equivalentes desde el punto de vista de PL/SQL:
NUM_EMP Num_emP num_emp nUM Emp nUM_Emp

Palabras reservadas: A la hora de declarar identificadores hemos de tener en cuenta las palabras reservadas, que son palabras que tienen un significado especial para PL/SQL y que no podemos utilizar como variables porque tendramos problemas de compilacin: DECLARE, BEGIN, END

PL/SQL

www.kybele.urjc.es

BD PL/SQL12

ConceptosBsicosdePL/SQL ReglasyConvencionesdelLenguaje
Delimitadores: Son smbolos que tienen un significado especial para PL/SQL y que se utilizan para separar unos identificadores de otros:
SIMBOLO + * = > ) % . : <> <= := || << */ <tab>
PL/SQL

DESCRIPCIN Operador de suma Operador de multiplicacin Operador de igualdad Operador mayor que Delimitador final de expresin Indicador de atributo Selector de componente Delimitador cadena caracteres Indicador variable asignacin Operador distinto de Operador menor o igual que Operador de asignacin Operador de concatenacin Comienzo de etiqueta Cierre de comentario multilnea i d i l il Carcter de tabulacin

SIMBOLO / < ( ; , @ ** != >= => ->> <space> <cr>

DESCRIPCIN Operador de resta Operador de divisin Operador menor que Delimitador inicial de expresin Terminador de orden Separador de elementos p Delimitador de enlace a BD. Delimitador cadena entrecomillada Operador de exponenciacin Operador distinto de Operador mayor o igual que Operador de asociacin Comentario, una sola lnea Fin de etiqueta Espacio i Retorno de carro
BD PL/SQL13

www.kybele.urjc.es

ConceptosBsicosdePL/SQL ReglasyConvencionesdelLenguaje
Literales (Valores):
Carcter
C t de t ill i l S d Constan d uno o ms caracteres d li it d por comillas simples. Se pueden delimitados asignar a variables de tipo CHAR o VARCHAR2, sin tener que hacer ningn tipo de conversin: 12345 100%

Numrico

Boolean

Representa un valor entero o real, puede asignarse a una variable de tipo NUMBER sin tener que efectuar conversin alguna. Los literales enteros consisten de una serie de dgitos, precedidos opcionalmente por un signo ( + o -). No se permite utilizar un punto decimal en un literal entero. 123 +7 -9 p Un literal real consta de signo, opcional, y una serie de dgitos que contiene punto decimal. Tambin pueden escribirse utilizando notacin cientfica. 17.7 23.0 1.345E7 -7.12e+12 Los literales booleanos representan la verdad o falsedad de una condicin y se utilizan en las rdenes IF y LOOP, solo existen tres posibles literales booleanos:

TRUE FALSE NULL

Verdadero Falso Nulo

PL/SQL

www.kybele.urjc.es

BD PL/SQL14

ConceptosBsicosdePL/SQL

ReglasyConvencionesdelLenguaje
Comentarios:
Monolnea: Comienzan con dos guiones y continua hasta el final de la lnea. -- Esto es un comentario Multilnea: Comienzan con el delimitador /* y terminan con el delimitador */. /* Esto es otro comentario, pero que puede abarcar varias lneas */

PL/SQL

www.kybele.urjc.es

BD PL/SQL15

ConceptosBsicosdePL/SQL

EntradaySalidadeDatos Para mostrar un valor por pantalla:


DBMS_OUTPUT.PUT_LINE(cadena);

En caso de que el valor no sea una cadena, se puede cadena usar la funcin TO_CHAR para transformarlo. Es necesario activar la salida por pantalla mediante la siguiente instruccin en el SQL*Plus:
SET SERVEROUTPUT ON [SIZE tamao del buffer];

PL/SQL

www.kybele.urjc.es

BD PL/SQL16

ConceptosBsicosdePL/SQL

EntradaySalidadeDatos Para leer valores por pantalla se puede usar las variables de sustitucin y/o el comando ACCEPT:
Variable de sustitucin: pueden aparecer directamente en la sentencia SELECT sin necesidad de definirla , anteponindola el smbolo & y SQL nos preguntar el valor que queremos asignarle.

PL/SQL

www.kybele.urjc.es

BD PL/SQL17

ConceptosBsicosdePL/SQL

EntradaySalidadeDatos
Ejemplo:
SELECT numEmp, nombreEmp, salario, numDept FROM Empleados WHERE numEmp = &Num_Emp; En el prompt aparecer e s gu e te mensaje: e p o pt apa ece el siguiente e saje

Enter value for Num_Emp:

PL/SQL

www.kybele.urjc.es

BD PL/SQL18

ConceptosBsicosdePL/SQL
Ejemplo:
SET VERIFY OFF -- para no mostrar por pantalla el valor anterior de la variable SET SERVEROUTPUT ON DECLARE v_fecha DATE:='&fecha'; BEGIN DBMS_OUTPUT.PUT_LINE('La fecha introducida es: '||TO_CHAR(v_fecha)); END; /

I t d l >Introduzca un valor para f h 11/12/2007 fecha: >La fecha introducida es: 11/12/07 >Procedimiento PL/SQL t P di i t terminado correctamente. i d t t SQL>

PL/SQL

www.kybele.urjc.es

BD PL/SQL19

ConceptosBsicosdePL/SQL

EntradaySalidadeDatos
ACCEPT permite declarar una variable de SQL y leer su valor p Q poniendo un mensaje en el Prompt.
ACCEPT variable [NUMBER|CHAR|DATE] [FORMAT] [PROMPT text] [HIDE] ]

De nuevo, para utilizar la variable accedemos a ella anteponindole el smbolo &. p PERO: No podemos utilizar ACCEPT para leer variables dentro de un bloque PL/SQL, si queremos utilizarlo debemos hacerlo fuera. bl PL/SQL i tili l d b h l f

PL/SQL

www.kybele.urjc.es

BD PL/SQL20

ConceptosBsicosdePL/SQL

EntradaySalidadeDatos
Ejemplo:
SET VERIFY OFF -- para no mostrar por pantalla el valor anterior de la SET SERVEROUTPUT ON ACCEPT producto NUMBER FORMAT 9999 PROMPT Introduce el precio: ACCEPT iva NUMBER FORMAT 99.99 PROMPT Introduce el IVA: DECLARE BEGIN END; /
v_producto NUMBER:= &producto; i v_iva NUMBER &iva; NUMBER:= &i

variable

PL/SQL

www.kybele.urjc.es

BD PL/SQL21

VariablesdePL/SQL
Se definen en la seccin DECLARE. Las variables deben tener un tipo asociado. Su formato es el siguiente: Nombre_variable tipo_variable [:= valor_inicial]; DECLARE V_Fecha_Ingreso DATE := SYSDATE;

Es preferible inicializar una variable siempre que su valor se pueda determinar, no obstante, PL/SQL define el contenido de las variables no inicializadas, asignndolas el valor NULL (valor desconocido o no definido).

PL/SQL

www.kybele.urjc.es

BD PL/SQL22

VariablesdePL/SQL
NUMRICO: Contienen un valor numrico entero o de punto flotante -Number : numrico -Dec, decimal: numrico decimal Dec -Double precision : doble precisin -Integer, int : enteros -Real : reales -Smallint : entero corto -Binary_integer: enteros (se usa para almacenar valores que slo se van a usar en clculos y no se van a almacenar en la BD). -Natural: nmeros naturales -Positive: nmeros positivos CARCTER -Varchar -Varchar2 -Char -Character -Long Long ROWID: Se puede almacenar un identificador de columna que es una clave que identifica unvocamente a cada fila de la base de datos -Rowid RAW (Tipo Binario); Se emplean para almacenar datos binarios -Raw -Long Raw BOOLEAN: Slo pueden contener los valores TRUE, FALSE o NULL TIPOS COMPUESTOS: Constan de una serie de componentes. -Table T bl -Record

PL/SQL

www.kybele.urjc.es

BD PL/SQL23

VariablesdePL/SQL UTILIZACIN DE %TYPE

Hay que Ha ocasiones q e las variables que usamos en PL/SQL se a iables q e samos emplean para manipular datos almacenados en una tabla de la BD. En estos casos tendr que ser la variable del mismo tipo que las columnas de las tablas.

DECLARE v_salarios Empleado.salario%TYPE; v salarios Empleado salario%TYPE;

DEFINICIN DE SUBTIPOS

d d f d l Podemos definir nuevos tipos restringiendo los tipos numricos bsicos

DECLARE C SUBTYPE nombre_subtipo IS tipo_base [RANGE min..max] [NOT NULL];

PL/SQL

www.kybele.urjc.es

BD PL/SQL24

VariablesdePL/SQL REGISTROS
La sintaxis general para definir un tipo de registro es: TYPE tipo registro IS RECORD ( tipo_registro Campo1 Tipo1 [NOT NULL] [[DEFAULT | :=] expr1], Campo2 Tipo2 [NOT NULL] [:= expr2], Campo3 Tipo3 [NOT NULL] [: expr3], [:= expr3] .. Campo(n) Tipo(n) [NOT NULL] [:= expr(n)]);

Es tpico en el trabajo con BD el declarar registros con el mismo formato que las filas de las tablas. Si se conoce la estructura de las tablas se crea un registro con ese formato, si no se utiliza el operador %ROWTYPE, similar a %TYPE. El registro p p q p tendr los mismos campos y del mismo tipo que la tupla de la tabla correspondiente de la BD.
PL/SQL www.kybele.urjc.es BD PL/SQL25

VariablesdePL/SQL REGISTROS
Para hacer referencia a los campos de un registro se utiliza la notacin punto (.). Nombre_registro.nombrecampo Para poder asignar un registro a otro ambos deben ser del mismo tipo. Tambin T bi se pueden asignar valores de un registro completo mediante una d i l d i t l t di t SELECT que extraera los datos de la BD y los almacena en el registro.
SELECT nombre, apellido, carrera INTO V_Registro FROM Estudiantes WHERE ID_Estudiante=1000;

V_Registro es una variable de tipo registro: TYPE Registro IS RECORD( Nombres Estudiantes.nombre%TYPE, Apellidos Estudiantes.apellido%TYPE, Carrera Estudiantes.carrera%TYPE);

PL/SQL

www.kybele.urjc.es

BD PL/SQL26

VariablesdePL/SQL REGISTROS
Ejemplo: l
DECLARE TYPE tipoDireccion IS RECORD ( tipoVia VARCHAR2(10) NOT NULL :=CALLE, nombreVia VARCHAR2(50), ciudad VARCHAR2(25), i d d VARCHAR2(25) cp VARCHAR2(5)); V_Direccion tipoDireccion; BEGIN

... END;
PL/SQL

-- Inicializacin de campos de la variable V_Direccion.nombreVia:=ALCALA; V_Direccion.ciudad: MADRID ; V Direccion.ciudad:=MADRID; V_Direccion.cp:=28901; DBMS_OUTPUT.PUT_LINE(V_Direccion.tipoVia|| || V_Direccion.nombreVia);

www.kybele.urjc.es

BD PL/SQL27

VariablesdePL/SQL REGISTROS
Ejemplo:
DECLARE -V_Empleados Empleado%ROWTYPE; BEGIN
-- Inicializacin de campos de la variable V Empleados codigo:=Emp01; V_Empleados.codigo:= Emp01 ; V_Empleados.nombre:=Pablo Martnez; V_Empleados.ciudad:=MADRID;

... END;

PL/SQL

www.kybele.urjc.es

BD PL/SQL28

VariablesdePL/SQL REGISTROS ANIDADOS


Ejemplo: l
DECLARE TYPE tipo_nombre_completo IS RECORD ( nombre VARCHAR2(10 CHAR) := 'John' , apellido VARCHAR2(10 CHAR) := 'Taylor'); tipo_persona IS RECORD TYPE ti ( DNI NUMBER DEFAULT 1 , nombre_completo tipo_nombre_completo); demo tipo_persona; tipo persona; BEGIN dbms_output.put_line('['||demo.DNI||']'); dbms_output.put_line( dbms output put line( '['||demo.nombre_completo.nombre||'] ['||demo.nombre_completo.apellido||'] END; /
PL/SQL www.kybele.urjc.es BD PL/SQL29

VariablesdePL/SQL TABLAS

Para poder declarar na Pa a pode decla a una tabla es necesario p ime o defini su tipo y luego necesa io primero definir s l ego una variable de dicho tipo. La sintaxis general para definir un tipo de tabla es: TYPE tipotabla IS TABLE OF tipo [NOT NULL] INDEX BY BINARY_INTEGER; Donde: tipotabla.- es el nombre del nuevo tipo que est siendo definido
tipo.- es un tipo escalar predefinido o una referencia a un tipo escalar
mediante %TYPE

Una vez declarados el tipo y la variable, podemos hacer referencia a un variable elemento determinado de la tabla PL/SQL mediante la sintaxis: Donde nombretabla es el nombre de una tabla e ndice es una variable de tabla, tipo BINARY_INTEGER.
PL/SQL www.kybele.urjc.es BD PL/SQL30

nombretabla (ndice)

VariablesdePL/SQL S TABLAS
Ejemplo: DECLARE TYPE tipo_tabla IS TABLE OF VARCHAR2(9) INDEX BY BINARY_INTEGER; V_tabla tipo_tabla; BEGIN
V_tabla(1):=; ...

END;

PL/SQL

www.kybele.urjc.es

BD PL/SQL31

VariablesdePL/SQL

ATRIBUTOS DE LA TABLA
NUMBER. Devuelve el nmero de filas de la tabla DELETE N/A. Borra filas de la tabla EXISTS BOOLEAN. Devuelve TRUE si existe en la tabla el elemento especificado FIRST BINARY_INTEGER. Devuelve el ndice de la primera fila de la tabla LAST BINARY_INTEGER. Devuelve el ndice de la primera fila de la tabla. NEXT BINARY_INTEGER. Devuelve el ndice de la fila de la t bl l tabla que sigue a la fila especificada i l fil ifi d PRIOR BINARY_INTEGER. Devuelve el ndice de la fila de la tabla que antecede a la fila especificar. SINTAXIS SINTAXIS:
<TableName>.<attribute> DELETE y EXISTS pueden operar sobre una nica fila <TableName>.<attribute>(<IndexNumber>[,<IndexNumber>]) <TableName> <attribute>(<IndexNumber>[ <IndexNumber>])

PL/SQL

www.kybele.urjc.es

BD PL/SQL32

VariablesdePL/SQL Consideraciones a tener en cuenta


DELETE constituye una orden completa por s mismo; no se utiliza como parte de una expresin como sucede con los otros atributos EXISTS devolver TRUE si existe el elemento buscado
En caso contrario devolver FALSE. Este atributo es til para evitar el error ORA-1403 que se produce cuando el elemento no existe

Tanto FIRST como LAST devolvern el ndice, no el valor contenido en dichas filas Excepto usando el atributo DELETE no hay manera de borrar todas las filas de una tabla

PL/SQL

www.kybele.urjc.es

BD PL/SQL33

VariablesdePL/SQL S TABLAS
Ejemplo: DECLARE
TYPE number_table IS TABLE OF NUMBER; list NUMBER_TABLE := number_table(1,2,3,4,5,6,7,8); BEGIN list.DELETE(2); FOR i IN 1..list.COUNT LOOP IF list.EXISTS(i) THEN dbms_output.put('['||list(i)||']'); END IF; END LOOP; SALIDA dbms_output.new_line; [1][3][4][5][6][7][8] END; /
PL/SQL www.kybele.urjc.es BD PL/SQL34

VariablesdePL/SQL
TABLAS
Ejemplo:
DECLARE TYPE t_czip_type IS TABLE OF customers.post code%TYPE INDEX BY BINARY INTEGER; customers.post_code%TYPE BINARY_INTEGER; t_czip t_czip_type; v_czip_index BINARY_INTEGER; BEGIN t_czip(11203) := nyc; t_czip(11201) := Brkl; t_czip(49341) := SF; BEGIN v_czip_index := t_czip.first; LOOP DBMS_OUTPUT.PUT_LINE(t_czip(v_czip_index)); EXIT WHEN v_czip_index = t_czip.LAST; v_czip_index := t_czip.NEXT(v_czip_index); END LOOP; RAISE NO_DATA_FOUND; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(Alcanzado fin del array.); ( y ); END; END;
PL/SQL www.kybele.urjc.es BD PL/SQL35

EstructurasdeControl 1) Estructuras lgicas: IF THEN ELSE


IF-THEN A) IF THEN B) IF-THEN-ELSE C) IF-THEN-ELSIF

2) Expresiones CASE 3) Estructuras de BUCLE


A) Bucles simples ) l B) Bucles WHILE C) Bucles FOR

4) GOTO y ETIQUETAS
A) Restricciones de GOTO B) Etiquetado

PL/SQL

www.kybele.urjc.es

BD PL/SQL36

EstructurasdeControl
A) Estructuras lgicas: IF THEN ELSE Su sintaxis es: IF <expresin_booleana> THEN

S i d d Secuencia_de_rdenes; [ELSIF <expresin_booleana> THEN Secuencia_de_rdenes;]


[ELSE

END IF;

Secuencia_de_rdenes;] ;]

Donde <expresiones booleanas> es cualquier expresin que de cmo <expresiones_booleanas> resultado un valor booleano. Las clusulas ELSIF y ELSE son opcionales y puede haber tantas clusulas ELSIF como se quiera.

PL/SQL

www.kybele.urjc.es

BD PL/SQL37

EstructurasdeControl
1) Estructuras lgicas: IF THEN ELSE
A) IF THEN Si se evala la condicin y resulta verdadera se ejecutan uno o ms lneas de verdadera, cdigo de programa. En el caso de que la condicin resulte ser falsa, NO se realiza NINGUNA accin. IF fecha_nac<1-01-1970 THEN -- No termina con un ; salario:= salario *1.15; -- aumento de salario en un 15% END IF; Se pueden anidar varias instrucciones: IF fecha_nac<1-01-1970 THEN IF apellido =Martnez THEN -- IF ANIDADO salario: salario:= salario *1.15; -- aumento de salario en un 15% 1.15; END IF;
PL/SQL

END IF; -- END IF OBLIGATORIO


www.kybele.urjc.es

BD PL/SQL38

EstructurasdeControl
1) Estructuras lgicas: IF THEN ELSE
B) IF THEN ELSE Si se evala la condicin y resulta verdadera se ejecutan uno o ms lneas de verdadera, cdigo de programa. En el caso de que la condicin resulte ser falsa, se ejecutan las instrucciones que siguen a la instruccin ELSE. ELSE

salario:= salario *1 15; -- aumento de salario en un 15% 1.15; ELSE -- No termina con un ;
salario:= salario* 1.05; -- aumento de salario en un 5% END IF; Se pueden anidar varias instrucciones IF-THEN-ELSE. Slo se permite una instruccin ELSE en cada instruccin IF .

IF fecha_nac<1-01-1970 THEN -- No termina con un ;

PL/SQL

www.kybele.urjc.es

BD PL/SQL39

EstructurasdeControl
1) Estructuras lgicas: IF THEN ELSE
C) IF THEN ELSIF Si se evala la condicin y resulta verdadera se ejecutan uno o ms lneas de verdadera, cdigo de programa. En el caso de que la condicin resulte ser falsa, se evala la condicin especificada ELSIF. en el ELSIF IF apellido =Prez THEN salario:= salario *1.10; -- aumento de *1 10; ELSIF apellido =Martnez THEN salario:= salario *1.15; -- aumento de ELSIF apellido=Alvarez THEN apellido= Alvarez salario:= salario *1.20; -- aumento de ELSE salario: salario salario:= salario* 1.05; -- aumento de END IF; -- Slo se necesita un nico END IF
PL/SQL www.kybele.urjc.es

salario en un 10% salario en un 15% salario en un 20% salario en un 5%

BD PL/SQL40

EstructurasdeControl
Condiciones Nulas
Procedimiento que nos dice si el nmero 1 (Num1) es mayor que el nmero 2 (Num2) : DECLARE Num1 NUMBER :=3; Num2 NUMBER; -- Como no inicializamos la variable, su valor es NULL EsMayor VARCHAR2(15); BEGIN Es muy importante inicializar siempre las IF Num1 < Num2 THEN Variables!! EsMayor := Yes; ELSE EsMayor := N E M No; END IF; Solucin??? END;

PL/SQL

www.kybele.urjc.es

BD PL/SQL41

EstructurasdeControl
2) Expresiones CASE
La i instruccin CASE es una evolucin en el control lgico. i C S l i l l l i Se diferencia de las estructuras IF-THEN-ELSE en que se puede utilizar una estructura simple para realizar selecciones lgicas en una lista de valores. P d utilizarse tambin para establecer el valor de una variable. t bi t bl l l d i bl Puede tili

Su sintaxis es: CASE variable WHEN expresin1 WHEN expresin2 WHEN expresin3 WHEN expresin4 ELSE valor5 END;

then then then then

valor1 valor2 valor3 valor4

No i t l it N existe lmite para el nmero de expresiones que se pueden definir en una l d i d d fi i expresin CASE.
PL/SQL www.kybele.urjc.es BD PL/SQL42

EstructurasdeControl
2) Expresiones CASE
EJEMPLO: DECLARE equipo varchar(100); ciudad varchar(50):= MADRID BEGIN equipo:= CASE ciudad WHEN MADRID then RealMadrid WHEN BARCELONA then FCBarcelona WHEN LACORUA then Deportivo de La Corua ELSE SIN EQUIPO END; END;
Expresin a evaluar se p p pasa al p principio de la sentencia CASE: p ciudad=VALOR
PL/SQL www.kybele.urjc.es BD PL/SQL43

EstructurasdeControl
2) Expresiones CASE
Cada clusula WHEN puede tener su propia expresin a evaluar. En este caso, despus del CASE no aparece ninguna expresin. p p g p EJEMPLO: CASE WHEN precio<11 THEN descuento:=2; WHEN precio>10 and precio<25 THEN descuento:=5; WHEN precio>24 THEN descuento:=10; ELSE descuento:=15: END CASE;
Expresin a evaluar se pasa en cada clusula WHEN

PL/SQL

www.kybele.urjc.es

BD PL/SQL44

EstructurasdeControl
3) Estructuras de BUCLE
A) Bucles simples Su sintaxis es: LOOP

LOOP; END LOOP

<Secuencia_de_rdenes>;

Este bucle sera infinito, no tiene condicin de parada. Para salir de un bucle le pondremos la orden EXIT: EXIT [WHEN <Condicin>]; Esta orden sera equivalente a: IF <Condicin> THEN EXIT; END IF;
PL/SQL www.kybele.urjc.es BD PL/SQL45

EstructurasdeControl
3) Estructuras de BUCLE A) Bucles simples EJEMPLO: DECLARE V_Contador BINARY_INTEGER:=1; V Contador BINARY INTEGER:=1; BEGIN LOOP VALUES (V_Contador); V_Contador:=V_Contador +1; EXIT WHEN V_Contador =10; END LOOP; END;

INSERT INTO Tabla (Valor) (Valo )

PL/SQL

www.kybele.urjc.es

BD PL/SQL46

EstructurasdeControl
3) Estructuras de BUCLE B) Bucles WHILE S sintaxis es: Su i t i WHILE <Condicin> LOOP

<Secuencia_de_rdenes>; <Secuencia de rdenes>;


END LOOP; Antes de entrar en el bucle evala la condicin, si es verdadera entrar. Si la condicin es falsa o nula el bucle se termina. Hay que tener en cuenta que si la condicin del bucle no toma el valor TRUE la primera vez que se comprueba el bucle no llegar nunca a ejecutarse. Pueden usarse las rdenes EXIT o EXIT WHEN dentro de un bucle WHILE para salir del bucle, sin llegar a terminar la condicin.
PL/SQL www.kybele.urjc.es BD PL/SQL47

EstructurasdeControl
3) Estructuras de BUCLE
B) Bucles WHILE EJEMPLO:

DECLARE V_Contador BINARY_INTEGER:=1; V Contador BINARY INTEGER:=1; BEGIN WHILE Contador <11 LOOP

INSERT INTO Tabla (Valor)


VALUES (V_Contador); V_Contador:=V_Contador +1; V C t d V C t d 1 END LOOP; END;
PL/SQL www.kybele.urjc.es BD PL/SQL48

EstructurasdeControl
3) Estructuras de BUCLE
C) Bucles FOR En el caso en que sepamos el nmero de iteraciones utilizaremos bucles FOR. Su sintaxis es: FOR <contador_bucle> IN [ REVERSE ] menor . . mayor LOOP

Secuencia_de_rdenes
END LOOP LOOP; donde <contador_bucle> es una variable que no hace falta que se declare ya que lo hace de forma implcita como BINARY_INTEGER. Los valores menormayor muestran el rango en que se ejecutar el bucle.

PL/SQL

www.kybele.urjc.es

BD PL/SQL49

EstructurasdeControl
3) Estructuras de BUCLE C) Bucles FOR EJEMPLO: DECLARE BEGIN FOR V_Contador IN 1..10 LOOP VALUES (V_Contador); END LOOP; END;

INSERT INTO Tabla (Valor) ( )

PL/SQL

www.kybele.urjc.es

BD PL/SQL50

EstructurasdeControl
4) GOTO y etiquetas
Su sintaxis es: GOTO <Etiqueta>; donde <Etiqueta> es una etiqueta definida en el bloque PL/SQL. Al evaluar una orden GOTO el control pasa inmediatamente a la orden identificada por la etiqueta, por ejemplo: DECLARE BEGIN GOTO Etiqueta 1; Etiqueta_1; <<Etiqueta_1>> END;
PL/SQL www.kybele.urjc.es BD PL/SQL51

ndice

1. Introduccin al PL/SQL 2. Conceptos Bsicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje Entrada y Salida de Datos 3. Variables de PL/SQL 4. Estructuras de Control

5. Cursores 6. Procedimientos y Funciones Almacenados 7. 7 Paquetes 8. Tratamiento de los Errores y Excepciones

PL/SQL

www.kybele.urjc.es

BD PL/SQL52

Cursores Qu son los cursores


Un cursor es un puntero al conjunto de datos recuperados por una consulta y almacenados en memoria hasta que el cursor se cierra. Permiten procesar las filas devueltas por una consulta de una en una. p p Proporciona un snapshot de la BD tomada en el momento de abrir el cursor. Cambios sobre los datos subyacentes no sern reflejados en el cursor despus de abrirlo. Reciben un nombre, as que podemos usarlo posteriormente

Tipos de Cursores
Cursor Implcito
Declarado por Oracle automticamente cada vez que se ejecuta una sentencia DML de SQL (INSERT, UPDATE, DELETE) o una SELECT INTO Se crean y destruyen de forma trasparente para el usuario

Cursor Explcito
Se declaran por el programador para procesar el resultado devuelto por una p p g p p p consulta
PL/SQL www.kybele.urjc.es BD PL/SQL53

Cursores
Ejemplo:CURSORexplcito DECLARE CURSOR cpaises (p_continente VARCHAR2) IS SELECT CO_PAIS, DESCRIPCION, CONTINENTE FROM PAISESWHERE CONTINENTE = p continente; p_continente; registro cpaises%ROWTYPE; BEGIN OPEN cpaises('EUROPA'); FETCH cpaises INTO registro; i i t CLOSE cpaises; END;

Ejemplo: Cursor Implcito


DECLARE n NUMBER; BEGIN SELECT 1 INTO n FROM dual; dbms_output.put_line( Selected ['||SQL%ROWCOUNT||']'); dbms output.put line('Selected [ ||SQL%ROWCOUNT|| ] ); END; /
PL/SQL www.kybele.urjc.es BD PL/SQL54

Cursores

DeclaracindeunCURSOR
Sintaxis: CURSOR nombre_cursor IS sentencia_SELECT;

l b d l d f d / El nombre del cursor es un identificador PL/SQL, y h de ser ha d declarado en la seccin declarativa del bloque antes de poder hacer referencia a l.

Nota:

PL/SQL

www.kybele.urjc.es

BD PL/SQL55

Cursores
Apertura de un CURSOR

La sintaxis para abrir un cursor es: OPEN nombre_cursor;


Al abrir un cursor suceden tres cosas: bi d t 1.- Se examinan los valores de las variables aceptadas. 2.- Se determina el conjunto activo, basndose en los valores de dichas variables 3. 3.- Se hace apuntar el puntero a la primera fila del conjunto activo El conjunto activo es el conjunto de filas que satisfacen los criterios de la consulta. Se determina en el momento de abrir un cursor. La l L clusula WHERE se evala para la tabla o tablas referenciadas en la clusula FROM de la l l l t bl t bl f i d l l l d l consulta, y todas las filas para las cuales se evale la condicin como TRUE son aadidas al conjunto activo. Tambin se establece un puntero al conjunto activo en el momento de abrir el cursor. Este puntero indica cul es la siguiente fila que el cursor extraer extraer. Es legal abrir un cursor que ya est abierto. PL/SQL ejecutar implcitamente una orden CLOSE antes de reabrir el cursor con la segunda orden OPEN. Puede haber ms de un cursor abierto al mismo tiempo.

PL/SQL

www.kybele.urjc.es

BD PL/SQL56

Cursores

ExtraccindelosdatosdeunCURSOR
La clusula INTO de la consulta es parte de la orden FETCH. Dicha orden tiene dos formas posibles: FETCH nombre_cursor INTO lista_variables; FETCH nombre_cursor INTO registro_PL/SQL;
Nombre_cursor: Identifica a un cursor abierto y ya declarado. Lista_variables: Es una lista de variables PL/SQL previamente declaradas y separadas por comas. Registro_PL/SQL: Es un registro PL/SQL previamente declarado. En ambos casos, la variable o variables de la clusula INTO deben d b ser compatibles en cuanto a tipo con la lista de seleccin ibl i l li d l i de la consulta. Despus de cada FETCH, se incrementa el puntero activo, para que apunte a la siguiente fila. De esta forma, cada FETCH fila forma devolver filas sucesivas del conjunto activo, hasta que se devuelve el conjunto completo.
PL/SQL www.kybele.urjc.es BD PL/SQL57

Cursores
CIERRE de un CURSOR Cuando se ha terminado de extraer el conjunto activo, debe cerrarse el cursor. Esta accin informa a PL/SQL d que el programa ha terminado de f / Q de l h d d utilizar el cursor, y de que se pueden liberar los recursos con l asociados. Estos recursos incluyen las reas de almacenamiento empleadas para contener el conjunto activo, as como cualquier activo espacio temporal utilizado en la determinacin de dicho conjunto.

L sintaxis para el cierre del cursor es: l i d l La i t i CLOSE nombre_cursor; Si intentamos cerrar un cursor que ya est cerrado nos dara un error ORA 1001 ORA-1001.
PL/SQL www.kybele.urjc.es BD PL/SQL58

Cursores

ATRIBUTOS de un CURSOR
%FOUND devuelve TRUE: Si la sentencia DML cambi alguna fila (IMPLCITO) Si la sentencia DQL afect a alguna fila (IMPLCITO) Q g ( ) Si hay filas por recuperar del cursor (EXPLCITO) %ISOPEN informa de si el cursor est abierto Devolver FALSE para cualquier cursor implcito %NOTFOUND es el opuesto de FOUND %ROWCOUNT devuelve Nmero de filas afectadas por una sentencia DML Nmero de filas devueltas por una sentencia SELECT INTO Cuantas filas se han recuperado ya del cursor (EXPLCITO) La excepcin NO_DATA_FOUND se eleva en las sentencias SELECT.. INTO cuando la consulta no devuelve ninguna fila Debido a esta circunstancia todos los bucles de extraccin utilizan %NOTFOUND o %FOUND para determinar la condicin de salida del bucle, en lugar de capturar la excepcin NO_DATA_FOUND

PL/SQL

www.kybele.urjc.es

BD PL/SQL59

Cursores

NO_DATA_FOUND y %NOTFOUND
Ejemplo:
BEGIN
Si la anterior orden UPDATE no se UPDATE R Rooms aplica a ninguna fila, inserta una SET number_seats=100 nueva fila en la tabla WHERE room_id=10101; _ ; IF SQL%NOTFOUND THEN INSERT INTO Rooms (room_id, number_seats) VALUES (10101 100); (10101,100); END IF;

END; /

Alternativa: IF SQL%ROWCOUNT=0 THEN Alt ti


PL/SQL www.kybele.urjc.es BD PL/SQL60

Cursores

Uso de SQL%ROWCOUNT
Ejemplo BEGIN post_code 12345 UPDATE customers SET post code = '12345' WHERE post_code = '67890'; DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT||' fueron actualizadas f t li d en la tabla customers'); END; ; /

PL/SQL

www.kybele.urjc.es

BD PL/SQL61

Cursores
Ejemplo:
DECLARE v_cust_no CUSTOMERS.Cust_no%TYPE; CURSOR c customer IS -- declaracin c_customer SELECT Cust_no FROM customers y ; WHERE city = Madrid; BEGIN OPEN c_customer; -- abrir el cursor LOOP FETCH c_customer INTO v_cust_no; -- carga del cursor EXIT WHEN c_customer%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('Customer ID: '||v_cust_no); END LOOP; CLOSE c_customer; -- cierre del cursor END; /

PL/SQL

www.kybele.urjc.es

BD PL/SQL62

Cursores

p BuclesFORparaCURSORES
Hay una manera de manejar cursores sin tener que realizar los pasos de declaracin, apertura, carga y cierre de un cursor. Esto se consigue mediante la utilizacin de bucles FOR. FOR
DECLARE CURSOR C_HISTORYSTUDENTS IS SELECT ID, FIRST_NAME, LAST_NAME ID FIRST NAME LAST NAME FROM STUDENTS WHERE MAJOR = HISTORY; BEGIN FOR V_STUDENTDATA IN C HISTORYSTUDENTS LOOP -- OPEN implcito V STUDENTDATA C_HISTORYSTUDENTS INSERT INTO REGISTERED_STUDENTS (STUDENT_ID, STUDENT_NAME) VALUES (V_STUDENTDATA.ID, V_STUDENTDATA.FIRST_NAME || || V_STUDENTDATA.LAST_NAME); V STUDENTDATA LAST NAME); -- FETCH implcito -- Chequeo implcito de datos antes de continuar el bucle END LOOP; END;

PL/SQL

www.kybele.urjc.es

BD PL/SQL63

Cursores Ejemplo:
DECLARE CURSOR c_customer IS SELECT Cust_no FROM customers y ; WHERE city = Madrid; -- declaracin BEGIN -- abrir el cursor FOR r customer IN c customer LOOP r_customer c_customer DBMS_OUTPUT.PUT_LINE('Customer ID: '||r_customer.Cust_no); -- cerrar el cursor END LOOP; END; /

PL/SQL

www.kybele.urjc.es

BD PL/SQL64

Cursores

CURSORESPARAMETRIZADOS
Permiten utilizar la orden OPEN para pasarle al cursor el valor de uno o i t varios parmetros: DECLARE CURSOR C_Estudiantes (V_Titulacion Estudiante.titulacion%TYPE) IS SELECT iden, nombre, apellidos FROM Estudiantes WHERE titulacion=V_Titulacion; BEGIN OPEN C_Estudiantes (Ing. Informtica);

PL/SQL

www.kybele.urjc.es

BD PL/SQL65

CursoresParametrizados

j p Ejemplo:
DECLARE v_post_code customers.post_code%TYPE := '&sv_zip'; CURSOR c_customer(p_zip customers.post_code%TYPE) IS SELECT cust_name FROM customers cust name WHERE post_code = p_zip; BEGIN FOR r_customer IN c_customer(v_post_code) LOOP DBMS_OUTPUT.PUT_LINE(r_customer.cust_name); END LOOP; END; /
PL/SQL www.kybele.urjc.es BD PL/SQL66

Cursores SELECTFORUPDATE(CURSORES)
Para el caso de que en un bucle se deseen modificar las filas extradas por el cursor, PL/SQL proporciona una sintaxis especfica. Consta de dos partes: p La clusula FOR UPDATE en la declaracin del CURSOR La clusula WHERE CURRENT OF en la orden UPDATE o DELETE. La clusula FOR UPDATE es parte de una orden SELECT. Es la ltima clusula de la SELECT orden, despus de la clusula ORDER BY (si es que existe). Su sintaxis es: CURSOR IS SELECT FROM FOR UPDATE [OF referencia_columna] [NOWAIT] [ [ ] Donde referencia_columna es una columna o lista de columnas de la tabla sobre la que se realiza la consulta consulta.

PL/SQL

www.kybele.urjc.es

BD PL/SQL67

Cursores SELECTFORUPDATE(CURSORES) Si el cursor se cre con la clusula FOR UPDATE, en las sentencias UPDATE y DELETE se puede incluir la clusula:
UPDATE tabla WHERE CURRENT OF cursor;

PL/SQL

www.kybele.urjc.es

BD PL/SQL68

Cursores

SELECTFORUPDATE(CURSORES)
Ejemplo:
DECLARE
-- Variable para aadir estos crditos al total de cada estudiante -- Cursor que selecciona los estudiantes matriculados en 3 de Informtica

V_Creditos Clases.num_creditos%TYPE;

c_EstudiantesRegistrados CURSOR c EstudiantesRegistrados IS SELECT * FROM Estudiantes WHERE Id Estudiante IN (SELECT Id Estudiante Id_Estudiante Id_Estudiante FROM Estudiante_Registrado WHERE Departamento=INF AND Curso=3) Curso= 3 ) FOR UPDATE OF Creditos_Actuales;

Variable que se va a modificar


PL/SQL www.kybele.urjc.es BD PL/SQL69

Cursores

SELECTFORUPDATE(CURSORES)
Ejemplo (continuacin):

BEGIN FOR V_Estudiantes IN C_EstudiantesRegistrados LOOP


-- Selecciona los crditos de 3 de Informtica

SELECT num_creditos INTO v_Creditos FROM Clases WHERE Departamento=INF AND Curso=3;
-- Actualiza la fila que acaba de recuperar con el cursor

UPDATE Estudiantes E t di t Set Creditos_Actuales=Creditos_Actuales+V_Creditos WHERE CURRENT OF C_EstudiantesRegistrados; END LOOP; COMMIT; END; /

PL/SQL

www.kybele.urjc.es

BD PL/SQL70

Das könnte Ihnen auch gefallen