Sie sind auf Seite 1von 199

M arcela Gmez

L oja 2008
DECLARACIN DE VARIABLES
Conocer la estructura de un bloque PL /S QL bsico y sus
secciones.

Declarar variables PL /S QL

E jecutar un bloque PL /S QL
PL /S QL , consiste de tres secciones:

DECLARE
....
BEGIN

EXCEPTION
..
END;
E jecutando S entencias y B loques
PL /S QL
DE CL A RE
v_variable V A RCHA R2(5);
B EGIN
S EL E CT column_name
NTO v_variable
FROM table_name;
EX CE PTION
WHE N exception_name THE N
..
END;
Es importante:

Poner punto y coma (;) al final de una sentencia S QL o sentencia


de control PL /S QL .
Cuando un bloque es ejecutado exitosamente sin errores
de manejo y compilacin, aparece el siguiente mensaje:

PL /S QL procedure successfully completed

L as palabras claves de seccin DE CL A RE , B E GIN y E X CE PTION no van


seguido de punto y coma.
E ND y todas las otras sentencias PL /S QL requieren un punto y coma para
terminar la sentencia.
S e puede tener toda la expresin en una sola lnea, pero este mtodo no es
recomendable para claridad o edicin.
NOTA:

E n PL /S QL a un error se lo llama excepcin.

Con la modularidad es fcil solucionar un problema


complejo esto gracias a que se puede trabajar en mdulos.
Tipos de bloque
Annimo Procedimiento Funcin

FUNTION name
DECLARE name
[DECLARE] RETURN datatype

IS IS
BEGIN
BEGIN BEGIN
-- statements --statements
--statements
RETURN value;
[EXCEPTION]
[EXCEPTION]
[EXCEPTION]
END; END; END;

PL /S QL es un programa que tiene uno o ms bloques. E stos bloques pueden


estar separados o anidados unos con otros. Por lo tanto, un bloque puede
representar una pequea parte de otro bloque.
Bloque annimo.- es un bloque secreto. E stos son
declarados en un punto en una aplicacin donde son
ejecutados. S e puede enraizar en un bloque annimo
dentro de un programa pre-compilado y dentro de
iS QL *Plus o un servidor director. L os triggers en los
componentes de Oracle Developer constan de estos
bloques.

Sub-Programas.- son bloques nombrados en PL /S QL que


pueden aceptar parmetros y pueden ser invocados. S e los
puede declarar como procedimientos o como funcione.
Generalmente se usa un procedimiento para ejecutar una
accin y una funcin para computar un valor.
Usando los componentes de Oracle Developer (formas,
reportes, y grficos), tu puedes declarar procedimientos y
funciones como parte de la aplicacin (un formulario o
reporte) y llamar a estos desde otros procedimientos,
funciones y triggers dentro de una misma aplicacin.

NOTA:
Una funcin es similar a un procedimiento, excepto que una
funcin puede retornar un valor.
Conceptos de programa
La siguiente tabla contiene una idea general de los conceptos de
programa de PL /S QL que usa un bloque bsico.
Uso de V ariables

Con PL /S QL se puede declarar variables. Las variables pueden ser


usadas para lo siguiente:
Almacenamiento Temporal de Datos: los datos pueden ser
temporalmente guardados en una o ms variables para ser usados
cuando se validan los datos de entrada y para el procesamiento
despus en el proceso de circulacin de datos.
Manipulacin de Valores guardados: las variables pueden ser
usadas para clculos y otras manipulaciones de datos sin acceder a
la base de datos.
Reusabilidad: despus de ser declaradas, las variables pueden
ser usadas repetidamente en una aplicacin solo mencionndolas
en otras declaraciones, otra declaracin de sentencias.

Facilidad de mantenimiento: cuando use %TY PE y


%ROWTY PE, usted declara variables, basando la declaracin en
la definicin de una columna de una base de datos. S i una
definicin subyacente cambia, la declaracin variable cambia en
consecuencia al tiempo de ejecucin. Esto suministra la
independencia de datos, reduce el coste de mantenimiento, y
permite que programas se adapten a los cambios de base de datos
para cubrir nuevas necesidades de la empresa.
M anejando variables en PL/S QL

Declaracin y Inicializacin de Variables en la seccin de


declaracin: se puede declarar variables en la parte declarativa de
PL/S QL de cualquier bloque, subprograma o paquete. Las
declaraciones asignan un espacio para almacenar un valor,
especifican el tipo de datos, y nombran la ubicacin en donde se va
a almacenar con el propsito de hacer referencia al valor. Las
declaraciones tambin pueden atribuir un valor inicial e imponer la
restriccin NOT NUL L en la variable. S e debe declarar una variable
antes de mencionarla en otras declaraciones, incluyendo la
declaracin de otras sentencias.
Asignar nuevos valores para variables en la seccin
ejecutable: en la seccin ejecutable, el valor existente de la
variable es remplazado por un nuevo valor que es asignado
para la variable.

Paso de valores en subprogramas PL/SQL a travs de


parmetros: existen tres modos de parmetros, IN (por
defecto), OUT, y IN OUT. Use el parmetro IN para pasar
valores al subprograma que est siendo llamado. Use el
parmetro OUT para retornas valores al que llama a un
subprograma. Y use el parmetro IN OUT para pasar valores
inciales a un subprograma que est siendo llamado y para
devolver valores actualizados al que llama al subprograma.
Tipos de V ariables

Todas las variables PL/S QL tienen un tipo de dato, cuando se


especifica el formato de almacenamiento, restricciones y validar el
rango de valores. PL /S QL soporta cuatro categoras de tipos de
datos: escalar, compuesto, referencia y LOB (objetos grandes), que
se pueden utilizar para declarar variables, constantes y punteros.
3.Datos de tipo escalares sujetan un solo valor. Los principales
tipos de datos son sos que corresponden a un tipo de columna en
las tablas de un servidor Oracle; PL/S QL tambin soporta variables
booleanas.
1. Datos de tipo compuesto, como los registros,
permiten que grupos de campos sean definidos y
manipulados en bloques PL/S QL.

3. Los tipos de datos de referencia sujetan valores,


llamados punteros, que designan otros tems del
programa.

5. Los tipos de datos LOB sujetan valores, llamados


halladores, eso especifica la ubicacin de objetos
grandes (como ideas grficas) que son guardados
fuera de lnea.
Declaracin de V ariables PL /S QL

Sintaxis:

Identifier: es el nombre de la variable

CONSTANT: restringe la variable con el propsito de


que su valor no pueda cambiar; las constantes deben ser
inicializadas.
Data type: puede ser un escalar, compuesto,
referenciado o LOB .

NOT NULL: restringe a la variable para que tenga un


valor .

Expr: es cualquier expresin PL/S QL que puede ser


una expresin literal, otra variable o una expresin que
involucra operadores y funciones.
Inicializacin de variables y palabras claves

Identifier: es el nombre de la variable escalar


Expr: puede ser una variable, literal o llamada a una funcin, pero no a
una columna de la base de datos.
L as variables son inicializadas todo el tiempo en un bloque o
subprograma. Por defecto las variables son inicializadas con NUL L .
Default: se puede usar la palabra clave de default en lugar del operador
de asignacin.
NOT NULL: imponer la estriccin NOT NULL cuando la variable
debe contener un valor.
Tipos de datos base escalares
Declaracin de V ariables B ooleanas

Este tipo de variables nos permiten realizar comparaciones a travs


de expresiones booleanas, estas pueden ser simples o complejas
separadas por operadores relacionales.

Ejemplo:
v_sal1 := 50000;
v_sal2 := 60000;

La siguiente expresin es verdadera


v_sal1 < v_sal2
Declaracin y inicializacin de una variable booleana
DECLARE
v_flag BOOLEAN:= FALSE;
BEGIN
v_flag := TRUE;
END;
DBMS_OUTPUT.PUT_LINE

S e puede declarar una variable principal o anfitriona,


referenciarla en un bloque PL/S QL, y luego presentar su
contenido en iS QL *Plus usando el comando PRINT. Otra
alternativa para presentar que la informacin de un bloque de
PL /S QL es DB M S _OUTPUT.PUT_LINE es un paquete oracle-
supplied, y PUT_LINE es un procedimiento dentro de ese
paquete.
Dentro de un bloque PL /S QL , referencia DB M S _OUTPUT.PUT_L INE y
entre parntesis se especifica lo que se quiere que presente. E l paquete debe
estar primero permitido en una sesin en iS QL *Plus. Para ejecutar el paquete
en iS QL *Plus se debe realizar con el comando S E RV E ROUTPUT ON.
Ejemplo:
SINTAXIS DE BLOQUE DE PL-SQL.
Declaracin puede continuar despus de varias lneas.
Una lnea de PL -S QL contiene grupo de caracteres
conocidos como unidades lxicas que pueden clasificarse
como:
Delimitadores (simples y smbolos compuestos).
Identificadores (se incluye cualquier palabra reservada)
L iterales.
Comentarios.
IDENTIFICADORES.
Pueden contener 30 caracteres.
Deben empezar con un carcter alfabtico.
Pueden contener nmeros, signos de dlar, subrayar, y
signos de nmeros.
No pueden contener caracteres como guiones, slashes, y
espacios.
No deben tener el mismo nombre de una columna de la tabla
de la base de datos.
No deben haber palabras reservadas.
SINTAXIS DE BLOQUE DE PL-SQL.
LITERALES.
Caracteres y fechas deben estar encerrados en comillas
simples.
v_name := `Henderson`
L os nmeros pueden ser simples valores o notaciones
cientficas.
Un slash (/) corre en bloques de PL -S QL en archivos de
script o en herramientas tales como iS QL *PL US .
COMENTARIOS EN CODIGO.
L os comentarios en lneas simples se hacen con dos guiones
(--)
L os comentarios para mltiples lneas se hace entre los
smbolos /* y */. E jm
DE CL A RE

V _sal number (9,2);


B E GIN
/*calcular el salario anual basado en la fecha de contrato*/
V _sal : g_montly_sal *12;
E ND
FUNCIONES DE SQL EN PL/SQL
Disponible en declaracin de procedimientos:
Filas simples numeradas.
Caracteres de fila simple.
Conversin de tipos de datos.
Datos.
Timestamp
Grandes y mnimas.
M iscelnea de funciones.
No disponible en declaracin de procedimientos:
decode
Grupo de funciones.
FUNCIONES DE SQL EN PL/SQL:
Ejemplo.
Construyendo una lista de correo para una empresa:
V _mailing_address := v_name o CHR (10) o v_address o
CHR (10) o v_state o CHR (10) o v_sp;

Convertir el nombre de empleado a minuscula:


V _ename := L OWE R (v_name);
CONVERSION DE TIPOS DE DATOS
Convertir datos a tipos de datos comparables.}
M ezcla de tipos de datos pueden resultar en un error y
afectar el funcionamiento.
Funciones de conversin son:
- TO_CHA R
_ TO_DA TE
_TO_NUM B E R
DE CL A RE
V _date date := TO_DA TE (`12-JA N-2001`,`DD-M ON-
Y Y Y Y );
B E GIN
E ste declaracin produce un error en tiempo de ejecucin si
la variable v_date es declarada como un tipo de dato
DA TE .
V _date := `January 13, 2001`;
para corregir el error, use la funcin de conversin
TO_DA TE .
V _date := TO_DA TE (`January 13, 2001`,`M onth DD,
Y Y Y Y `);
BLOQUE ANIDADOS Y ALCANCE DE
LAS VARIABLES.
L os bloques de PL /S QL pueden ser anidadas dondequiera
que una declaracin ejecutable sea permitida.
Un bloque anidado llega a ser una declaracin.
Una seccin de excepcin puede contener bloques anidados.
Una seccin de excepcin puede contener bloques anidados.
E l alcance de un identificador es desde la regin de una
unidad de programa desde la cual usted puede referenciar
el identificador.
ALCANCE DE LOS IDENTIFICADORES.
Un identificador es visible en la regin donde usted puede
referenciar el identificador sin tener que caracterizar este:
Un bloque puede buscar bloques encerrados.
Un bloque no puede observar los bloques encerrados.
CAPACITAR UN IDENTIFICADOR
L a capacitacin puede etiquetar un bloque encerrado.
Capacitar un identificador puede usarse el prefijo de
etiquetacin de bloques.
DE CL A RE
birthdate DA TE ;
B E GIN
DE CL A RE
birthdate DA TE ;
B E GIN
outer.birthdate := TO_DA TE (03-A UG-1976, DD-
M ON-Y Y Y Y )
E ND
E ND
OPERADORES EN PL/SQL.
L gicos
A ritmticos.
Concatenacin.
Parntesis para controlar el orden de las operaciones.
L os mismo es S QL .

Operadores exponencial (**).


PROGRAMACION GUIDELINES.
E l cdigo hecho se mantiene fcilmente por:
Cdigo documentado con comentarios.
Desarrollando un caso de conversin para el cdigo.
Desarrollando conversin de nombres por identificadores
y otros objetos.
Incremento de legibilidad y
CODIGO INDENTING.
Para claridad, se muestra un ejemplo de cdigo.
B EGIN
IF x = 0 THEN
y:=1;
EN IF
END;
DECLA RE
V _deptno NUM B ER (4);
V _location_id NUM B ER (4);
B EGIN
S ELECT department_id, location_id, v_deptno, v_location_id
FROM deparments
WHERE deparment_name = `S A L ES `
END;
S on smbolos simples o compuestos que
tienen significado especial para PL/S QL.
Smbolos Simples
Smbolos compuestos

Nota.- No puede usarse palabras reservadas como los


identificadores a menos que ellos son adjuntos en la cita
doble.
Objetivos
Despus de completada esta leccin, usted estar en la
capacidad de:
E scribir en PL /S QL una sentencia S E L E CT exitosamente.
E scribir en PL /S QL sentencias DM L
Controlar transacciones en PL /S QL
Determinar el resultado de las sentencias del L enguaje de
M anipulacin de datos. (DM L )
S entencias S QL en PL /S QL
Cuando usted extraiga informacin o aplique cambios a la
base de datos usted debe usar S QL . PL /S QL soporta el
L enguaje de M anipulacin de datos (DM L ) y los comandos
del control de transacciones de S QL . Usted puede usar una
sentencia S E L E CT para incrementar una variable con
valores consultados de una fila o una tabla.
Usted puede usar comandos DM L para modificar los datos en una
tabla de la base de datos. S in embargo recuerde los siguientes puntos
acerca de los bloques PL /S QL mientras est usando sentencias DML
y comandos de control de transacciones.

La palabra clave END significa el fin de un bloque PL/S QL, no el


fin de una transaccin. Justo como un bloque puede contener
mltiples transacciones una transaccin puede tener mltiples
bloques.

PL/S QL no soporta directamente el L enguaje de Definicin de


Datos (DDL ), as como CREA TE TA B L E, A L TER TA B LE o
DROP TA B L E.

PL/S QL no soporta sentencias del L eguaje de Control de Datos


(DCL) as como GRA NT o REV OKE.
Resumen
A travs de las sentencias S QL en PL/S QL se podr:
Extraer una fila de datos usando el comando S ELECT.
Hacer cambios a filas en la base de datos usando
comandos DM L.
Controlar una transaccin con comandos como el
COM M IT, ROLLB A CK o S A V EPOINT.
Determinar el resultado DML con atributos de cursor
implcito.
Recuperando datos usando PL/S QL
Utilice la sentencia S ELECT para recuperar datos de la
base de datos. Con la sintaxis:
select_list : es una lista de al menos una columna y
puede incluir expresiones S QL, filas, funciones, o grupo
de funciones.
variable_name: es la variable escalar que retiene el
valor recuperado.
record_name: es el registro PL/S QL que alberga el
valor recuperado.
table: E specifica el nombre de la tabla de la base de datos.
condition: est compuesta de un nombre de columna,
expresin, constante, y operadores de comparacin
incluyendo variables y constantes PL /S QL .

Sintaxis:
S E L E CT select_list
INTO {variable_name[, variable_name]
|record_name}
FROM table
[WHE RE condition];
Gua para recuperar datos en PL/S QL
Terminar cada sentencia S QL con un punto y coma (;).
L a clusula INTO se requiere para la sentencia S EL ECT cuando esta
es insertada en PL/S QL.
L a clusula WHERE es opcional y puede ser usada para especificar
variables de entrada, constantes, literales o expresiones PL /S QL .
Especificar el mismo nmero de variables en la clusula INTO como
columnas en la base de datos en la clusula S ELECT. Debe asegurar
que se correspondan posicionalmente y que sus tipos de datos sean
compatibles.
Use funciones de grupo, as como S UM, en una sentencia S QL .
porque las funciones de grupo se aplican a filas en una tabla.
S entencia S ELECT en PL/S QL
Clusula INTO
L a clusula INTO es obligatoria y ocurre entre las clusulas
S E L E CT y FROM . E sta es usada para especificar los
nombres de variables que contienen los valores que S QL
retorna de una clusula S E L E CT. Usted debe especificar
una variable para cada tem seleccionado, y el orden de las
variables debe corresponderse con los tems
seleccionados.
Use la clusula INTO para llenar variables o variables host.
Las consultas deben retornar una y solo
una fila.

L a sentencia S EL ECT dentro de un bloque PL /S QL est


dentro de la clasificacin A NS I de insertar S QL , para lo
cual se aplican las siguientes reglas: L as consultas deben
retornar una y solo una fila, una consulta que retorna mas
de una fila o ninguna genera un error.

PL /S QL maneja estos errores levantando excepciones, las


cuales usted puede atrapar en la seccin de excepciones
del bloque con las excepciones NO_DA TA _FOUND y
TOO_M A NY _ROWS .
Ejemplo 1
DE CL A RE
v_deptno NUM B E R(4);
v_location_idNUM B E R(4);
B E GIN
S E L E CT department_id, location_id
INTO v_deptno, v_location_id
FROM departments
WHE RE department_name = S ales;
E ND;
/
Ejemplo 2
DE CL A RE
v_hire_date employees.hire_date%TY PE ;
v_salary employees.salary%TY PE ;
B E GIN
S E L E CT hire_date, salary
INTO v_hire_date, v_salary
FROM employees
WHE RE employee_id = 100;
E ND;
/
E n el ejemplo anterior, la variable v_hire_date y v_salary
son declarados en la seccin DE CPL A RE del bloque
PL /S QL .

E n la seccin ejecutable, los valores de las columnas


HIRE _DA TE y S A L A RY para el empleado con el nmero
de empleado 100 son recuperados de la tabla E mpleados y
almacenados en las variables v_hire_date y v_salary
respectivamente.

Observe como la clusula INTO, a lo largo con la sentencia


S E L E CT, recupera los valores de las columnas de la base
de datos dentro de las variables PL /S QL .
Ejemplo 3
S ET S ERV EROUTPUT ON
DECL A RE
v_sum_sal NUM B ER(10, 2);
v_deptno NUM B ER NOT NULL := 60;
B EGIN
S EL ECT S UM (salary) - funcin de grupo
INTO v_sum_sal
FROM employees
WHERE department_id = v_deptno;
DB M S _OUTPUT.PUT.LINE (La suma del salario es
||TO_CHA R(v_sum_sal));
END;
/
En el ejemplo 3, las variables v_sum_sal y v_deptno son
declaradas en la seccin DECLA RE del bloque PL/S QL.
En la seccin ejecutable, el total del salario para el departamento
con el nmero de departamento 60 es calculado usando la funcin
de grupo S UM de S QL , y asignado a la variable v_sum_sal.
Ntese que la funcin de grupo no puede ser usada en la sintaxis
PL /S QL . Ellas son usadas en la sentencia S QL dentro del bloque
PL /S QL .
La salida del bloque PL/S QL se muestra a continuacin:
La suma del salario es 28800
PL/S QL procedure successfully completed.
Convencin de nombres
DECLA RE
v_hire_date employees.hire_date%TY PE;
sys_date hire_ date%TY PE;
employee_id employees.employee_id%TY PE := 176;
B EGIN
S ELECT hire_date, sysdate
INTO v_hire_date, v_salary
FROM employees
WHERE employee_id = employee_id;
END;
/

DECLA RE
*
ERROR al line 1:
ORA -01422: exact fetch returns more than requested number of rows
ORA -06512: at line 6
En sentencias S QL potencialmente ambiguas, los
nombres de las columnas de la base de datos preceden
sobre los nombres de variables locales. El ejemplo es
definido como sigue: Retorna la fecha de inicio y la fecha
de hoy de la tabla Empleados para el empleado cuyo id es
176.
Este ejemplo levanta una excepcin en tiempo de
ejecucin no manejada porque en la clusula WHERE,
los nombres de las variables PL/S QL son los mismos que
los nombres de las columnas de la base de datos en la
tabla empleados
L a siguiente sentencia DE L E TE quita todos los
empleados de la tabla empleados en donde el
apellido no es nulo, no justo K ing, porque el
servidor Oracle asume que ambos apellidos en la
clusula WHE RE se refiere a la columna de la
base de datos.

DECLA RE
last_name V A RCHA R2(25) := King;
B EGIN
DELETE FROM employees
WHERE last_name = last_name;

M anipulando Datos usando PL /S QL


Usted manipula los datos en la base de datos usando
comandos DML. Usted puede usar comandos DML
como INS ERT, UPDA TE, DELKETE y M ERGE sin
restriccin en PL/S QL. Filas bloqueadas son liberadas
incluyendo sentencias COM MIT o ROLLB A CK en el
cdigo PL/S QL.
La declaracin INS ERT aade nuevas filas de datos a la
tabla.
La declaracin UPDA TE modifica lasa filas existentes
en la tabla.
La declaracin DELETE quita filas no deseadas de la
tabla.
La declaracin M ERGE selecciona filas de una tabla
para actualizar o insertarlas en otra tabla. La decisin de
insertar, actualizar o no dentro de la tabla objetivo se
basa en una condicin dentro de la clusula ON.
NOTA:
MERGE es una declaracin determinista. Usted no
puede actualizar la misma fila de la tabla objetivo
mltiples veces en la misma declaracin M ERGE. Usted
debe tener privilegios de objeto INS ERT y UPDA TE en
la tabla objetivo y el privilegio S ELECT en la tabla
origen.
Insertando datos
En el ejemplo que se muestra a continuacin, una declaracin
INS ERT es usada dentro del bloque PL/S QL para insertar un
registro dentro de la tabla Empleados. M ientras este usando el
comando INS ERT en un bloque PL/S QL usted puede:

Usar funciones como US E R y S Y S DA TE .


Generar valores de claves primarias usando
secuencias de base de datos.
Derivar valores en el bloque PL/S QL
A adir valores por defecto de columna
Ejemplo
A ada nueva informacin de empleados a la tabla Empleados .
B EGIN
INSERT INTO employees
(employee_id, first_name, last_name, email, hire_date, job_id, salary)
VALUES
(employees_seq.NEXTV A L, Ruth, Cores, RECORES , sysdate,
A D_A S S T, 4000);
END;
/
NOTA:
No hay posibilidad de ambigedad con identificadores y nombres de
columnas en la sentencia S ELECT. Ningn identificador en la
clusula INS ERT debe ser el nombre de una columna de la base de
datos.
A ctualizando datos
Puede haber ambigedad en la clusula S E T de una
declaracin UPDA TE porque aunque el identificador en la
parte izquierda del operador de asignacin es siempre una
columna de la base de datos, el identificador de la parte
derecha no puede ser una columna de la base de datos o
variable PL /S QL .
Recuerde que la clusula WHE RE es usada para
determinar que filas son afectadas. S i no hay filas
modificadas, no ocurren errores, a diferencia de una
sentencia S E L E CT en PL /S QL .
Ejemplo
Incremente el salario de todos los empleados quienes son empleados
(stock clerks).
DECLARE
v_sal_increase employees.salary%TY PE := 800;
BEGIN
UPDA TE employees
S ET salary = salary + v_sal_increase
WHERE job_id = S T_CL ERK;
END;
/
NOTA: L a variable de asignacin de PL /S QL siempre usa :=; y S QL para
una columna de asignacin siempre usa =. M emorice que si el nombre de
una columna y el nombre de un identificador son idnticos en la clusula
WHE RE , el servidor Oracle observa a la base de datos primero por el
nombre .
B orrando datos
L a sentencia DE L E TE quita filas no deseadas de una tabla. S in el uso de una
clusula WHE RE , los contenidos enteros de una tabla pueden ser quitados, a
condicin de que no hay restricciones de integridad.

Ejemplo
B orre filas que pertenezcan al departamento 10 de la tabla empleados.
DECLARE
v_deptno employees.department_id%TY PE := 10;
BEGIN
DELETE FROM employees
WHERE department_id = v_deptno;
END;
/
Combinacin de filas
L a declaracin M E RGE inserta o actualiza filas en una
tabla, usando los datos de otra tabla. Cada fila es insertada
o actualizada en la tabla objetivo, dependiendo de una
condicin de equijoin.

E l ejemplo muestra un enlace de la clave de empleado en la


tabla COPY _E M P a la clave de empleado en la tabla
E M PL OY E E S . S i se encuentra un enlace, la fila es
actualizada para enlazar la fila en la tabla E mpleados. S i la
fila no se encuentra, esta es insertada dentro de la tabla
COPY _E M P.
DECLARE
v_empno EM PL OY EE S .EM PL OY E E_ID%TY PE := 100;
BEGIN
M ERGE INTO copy_emp c
US ING employees e
ON (e.employee_id = v_empno)
WHEN M A TCHED THE N
UPDA TE S ET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.mail,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
WHEN NOT M A TCHED THEN
INS ERT V A L UE S (e.employee_id, e.first_name, e.last_name, e.email, e.phone_number,
e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.departament_id);
END;
/
Convenciones de nombres

E vite la ambigedad en la clusula WHE RE adhirindose a


una convencin de nombres que distingue nombres de
columna de base de datos de nombres de variables PL /S QL ,
en resumen:

Use una convencin de nombres para evitar ambigedad


en la clusula WHE RE .

L os nombres de las columnas de la base de datos e


identificadores deben tener nombres distintos.
E rrores en la sintaxis pueden surgir porque PL /S QL
primero verifica la base de datos por columna en l atabla.

L os nombres de variables locales y parmetros formales


preceden a los nombres de las tablas de la base de datos.

L os nombres de las columnas de las tablas de la base de


datos preceden a los nombres de las variables locales.
L a siguiente tabla muestra una configuracin de prefijos y sufijos que
distinguen identificadores de otros identificadores, objetos de datos y otros
nombres de objetos.
Cursor S QL

S iempre que usted ejecute una sentencia S QL , el servidor


Oracle abre un rea de memoria en la cual el comando es
analizado y ejecutado. E sta rea es llamada cursor.

Cuando la parte ejecutable de un bloque ejecuta una


sentencia S QL , PL /S QL crea un cursor implcito, el cual
PL /S QL maneja automticamente. E l programador
explcitamente declara y nombra un cursor explcito.
E xisten cuatro atributos vlidos en PL /S QL que pueden ser
aplicados a cursores.
E n resumen:
Un cursor es un rea de trabajo privada de S QL .
E xisten dos tipos de cursores:
Cursores implcitos
Cursores explcitos
E l servidor Oracle utiliza los cursores implcitos para
analizar y ejecutar sus sentencias S QL .
L os cursores explcitos son explcitamente declarados por
el programador.
A tributos de un cursor S QL
Utilizando los atributos de cursor de S QL, usted puede probar el
resultado de sus sentencias.
SQL%ROWCOUNT Nmero de filas afectadas por la sentencia SQL ms
reciente (valor ntegro)
S QL%FOUND A tributo booleano que evala a V ERDA DERO (TRUE)
si la declaracin S QL ms reciente afecta una o varias
filas.
S QL%NOTFOUND A tributo booleano que evala a V ERDA DERO (TRUE)
si la declaracin S QL ms reciente no afecta alguna fila.

S QL%IS OPEN S iempre evala a falso porque PL/S QL cierra los


cursores implcitos inmediatamente despus de su
ejecucin.
L os atributos de los cursores S QL permiten evalar lo que
pas cuando un cursor implcito fue usado. Use estos
atributos en sentencias PL /S QL , pero no en sentencias
S QL .

S e pueden utilizar los atributos S QL %ROWCOUNT,


S QL %FOUND, S QL %NOTFOUND, y S QL %IS OPE N en
la seccin de excepciones de un bloque para unir
informacin acerca de la ejecucin de una sentencia DM L .
PL /S QL no retorna errores si una sentencia DM L no afecta
a alguna fila en la tabla subyacente. S in embargo, si una
sentencia S E L E CT no retorna alguna fila, PL /S QL retorna
una excepcin.
Ejemplo:
B orrar las filas de un empleado especfico de la tabla empleados.
Imprima el nmero de filas borradas.
V A RIA B LE rows_deleted V A RCHA R2(30)
DECLA RE
v_employee_id employees.employee_id%TY PE := 176.
B EGIN
DEL ETE FROM employees
WHERE employee_id = v_employee_id;
:rows_deleted :=(S QL%ROWCOUNT ||row deleted.);
End;
/
Print rows_deleted

Este ejemplo borra las filas de la tabla Empleados para el nmero de


empleado 176. Usando el atributo S QL%ROWCOUNT, se puede
imprimir el nmero de filas borradas.
Sentencias de control de
transacciones
Usted controla la lgica de las transacciones con las sentencias
S QL COM M IT y ROLLB A CK, dando a algunos grupos de la
base de datos cambios permanentes mientras se descartan otros.

Con el servidor Oracle, las transacciones de DM L comienzan con


el primer comando seguido de un COMM IT o ROLLB A CK.
Estas acciones pueden ocurrir dentro de un bloque PL/S QL o
como resultado de algn evento en el entorno de un host (por
ejemplo, en ms casos finalizando una sesin automticamente de
iS QL *Plus se confirman las transacciones pendientes). Para crear
un punto intermedio en el proceso de una transaccin, use
S A V EPOINT.
COM M IT [WORK ];
S A V E POINT savepoint_name;
ROL L B A CK [WORK ]
ROL L B A CK [WORK ] TO [S A V E POINT]
savepoint_name;
E n donde : WORK ies para conformidad con el estndar
A NS I.

NOTA:
L os comandos de control de transacciones son todos vlidos
dentro de PL /S QL , aunque el ambiente del host puede tener
algunas restricciones sobre su uso.
Usted puede incluir comandos de bloqueo explcitos en un
bloque que toman efecto hasta el final de la transaccin.
Tambin, un bloque PL /S QL no necesariamente implica
una transaccin.
Controlando Flujo de Ejecucin de PL/SQL
Utliza la condicin IF para cambiar la ejecucin logica de
las sentencias. L as condiciones de las sentencias IF son:
IF-THE N-E ND IF
IF-THE N-E L S E -E ND IF
IF-THE N-E L S IF-E ND IF
SENTENCIA IF
S INTA X IS :
IF condicion THE N sentencia;
[E L S IF condicion THE N sentencias;]
[E L S E sentencia;]
E ND IF;
SENTENCIAS IF SIMPLES
L as sentencias simples tienen la siguiente sintaxis:
IF condicion THE N sentencia
E ND IF;
SENTENCIAS IF COMPUESTAS
L as sentencias IF compuestas usan operadores logicos como
A ND Y NOT
S INTA X IS :
IF condicin A ND condicion
THE N sentencia;
E ND IF;
FLUJO DE EJECECUCIN DE
SENTENCIAS IF-THEN-ELSEIF
TRUE NOT TRUE

IF
condicion
TRUE NOT TRUE

A ccin condicion
THEN EL S IF

A ccin A ccin
THEN ELS E
Flujo de la ejecucin de Sentencias
IF-THEN-ELSE
TRUE IF NOT TRUE
condicion

A ccin A ccin
THEN ELS E
(incluye una (incluye una
sentencia IF) sentencia IF)
SENTENCIAS IF-THEN-ELSE
Para dar un valor, calcular un porcentaje de el valor basado
en una condicion.
E jemplo.
IF v_start > 100 THE N
v_start = 0.2 v_start;
E L S IF v_start >= 50 THE N
v_start := 0.5 v_start;
ELS E
v_start := 0.1 v_start
E ND IF;
Expresiones CASE
Una expresin CA S E selecciona un resultado y lo retorna.
Para seleccionar el resultado , la expresin CA S E usa una
expresin cuyo valor es usado para seleccionar una o
varias alternativas.
CA S E selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
..
WHEN expressionN THEN resultN
[ELS E resultN+1;]
END;
Expresiones CASE : Ejemplo
S ET S ERV ERPUT ON
DECLA RE
v_grade CHA R(1) := UPPER (& p_grade);
v_appraisal V A RCHA R2(20);
B EGIN
v_appraisal :=
CA S E v_grade
WHEN A THEN Excellent
WHEN B THEN V ery Good
WHEN C THEN Good
ELS E No such grade
END;
DB MS _OUTPUT.PUT_LINE(Grade: ||v_grade ||` A ppraisal ` ||v_appraisal);
END;
/
Manipulando Nulos
Cuando trabajamos con Nulos, puede evitar algunos
errores comunes ,. Teniendo en cuenta las siguentes
reglas:
Comparaciones simples que involucran nulos siempre
producen nulos
A plicando el operador lgico NOT al nulo produce nulo
E n sentencias de control condicional, si la condicin
produce NUL L , se asociacin de secuencias no es
ejecutada.
Tablas Lgicas
Construir una condicin booleana simple con un operador
de comparacin
FALS
AND TRUE FALSE NULL OR TRUE NULL NOT
E

TRUE TRUE FA LS E NULL TRUE TRUE TRUE TRUE TRUE FA L S E

FA L S E FA LS E FA L S E TRUE
FA LS E FA LS E FA LS E TRUE FA LS E NULL

NUL L NUL L
NUL L NULL FA LS E NULL NULL TRUE NULL NULL
Tablas Lgicas
Comparaciones booleanas con operadores lgicos
Ud. Puede construir una condicin simple booleana combinando
nmeros, caracteres i expresiones de tiempo con operadores
lgicos.
Ud. Puede construir una condicin booleana compuesta
componiendo condiciones simples booleanas con operadores
lgicos A ND, OR y NOT. En las tablas lgicas mostradas
anteriormente:
FA L S E toma precedencia en una condicin A ND y TRUE toma
precedencia en una condicin OR
A ND retorna TRUE solo si ambos operandos son TRUE
OR retorna TRUE si ambos operadores son FA LS E
NUL L y TRUE siempre evalan el NULL
Condiciones Booleanas
Cual es el valor de V _FL A G en cada caso ?
v_flag := v_recorder_flag A ND v_available_flag;

V_REORDER_FLAG V_AVAILABLE_FLAG V_FLAG

TRUE TRUE ?

TRUE FA LS E ?

FA LS E TRUE ?

FA LS E FA LS E ?

Respuestas
1. TRUE 2. FA L S E 3. NULL 4. FA L S E
Control Iterativo : Sentencias LOOP
L OOPs repite una sentencia o secuencia de mltiples
sentencias
Hay tres tipos de ciclos
Ciclo bsico ejecuta acciones repetitivas sin condiciones de
conjunto
Ciclo for - ejecuta control iterativo de acciones basadas en
un conteo
Ciclo while ejecuta control iterativo de acciones basadas en
una condicin
Use la sentencia EXIT para terminar el ciclo.
Ciclos Bsicos
L OOP -- delimitado
statement1; -- sentencias

EXIT [WHEN condition] -- Termina sentencia
END LOOP; -- delimitador

Condicion: Es una variable booleana o expresin (TRUE, FALSE, o NULL)

Ciclos Bsicos
L a mas simple forma de las sentencias L OOP es la bsica, la cual encierra una secuencia de
sentencias entre las palabras reservadas L OOP y END L OOP. Un ciclo bsico permite la
ejecucin de al menos una sentencia como mnimo.
LA sentencia EXIT
Usted puede usar EXIT para terminar el ciclo.
Ciclos While
WHILE condition L OOP -- L a condicion es evaluada al comienzo
statement1; -- de cada iteracin
statement2;

END LOOP;
Use el WHIL E para repetir sentencias mientras una condicion es verdadera

En la sintaxis:
Condition es una variable booleana (TRUE, FA L S E, NUL L )
Statement puede ser una o mas sentencias PL/S QL o S QL
S i las variables involucradas en las condiciones no caban
durante el cuerpo del ciclo, luego la condicion continua con TRE
y el ciclo no termina
Nota: S i la condicion produce un NULL, el ciclo es desviado al
control de la prxima sentencia
Ciclos WHILE : Ejemplo
DECLA RE
V _ country_id locations.country_id%TY PE:=CA ;
V _location_id locations.location_id%TY PE;
V _city locations.city%TY PE:=M ontreal;
V _counter NUM B ER := 1;
B EGIN
S ELECT M A X (location_id) INTO v_location_id FROM locations
WHERE country_id = vcountry_id;
WHIL E v_counter <=3 L OOP
INS ERT INTO locations (location_id, city, country_id)
V A L UES ((v_location_id + v_counter), v_city, v_country_id);
v_counter:= v_counter+1;
END L OOP;
END;
/
Ciclos FOR
FOR counter IN [REV ERS E]
lower_bound .. Upper_bound L OOP
statement1; -- de cada iteracin
statement2;

END LOOP;

Use un ciclo FOR para conseguir un atajo para el numero de iteraciones


No declare un contador; este es declarado implcitamente como un entero
lower_bound .. Upper_bound es sintaxis requerida

REV ERS E causa al contador decrementar con cada iteracin desde el salto alto al
bajo
Lower_bound especifica el salto mas bajo del rango de valores del contador
upper_bound especifica el salto mas alto del rango de valores del contador
Ciclo FOR
Inserte tres nuevas location_id para el cdigo de la ciudad
CA y la ciudad de M ontreal
DECL A RE
V _country_id locations.country_id%TY PE := CA ;
V _location_id locations.location_id%TY PE ;
v_city locations.city%TY PE := M ontreal;
B EGIN
S E L ECT M A X (locatio_id) INTO v_location_id
FROM locations
WHERE country_id = V _country_id;
FOR i IN 13 L OOP
INS E RT INTO locations (location_id, city, country_id)
V A L UES ((v_location_id + i ), v_city, v_country_id);
E ND L OOP;
END;
Ciclo FOR
L neas directivas
Referencian al contador solo dentro del ciclo, es
indefinido fuera del ciclo
No referencia al contador como el objetivo de una
asignacin.
Lneas directivas mientras se usan
ciclos
Use el ciclo bsico cuando las sentencias dentro del ciclo
deban ejecutarse al menos una vez
Use el ciclo WHIL E si la condicion debe ser evaluada al
comienzo de cada iteracin,
Use un ciclo F OR si se conoce el numero de iteraciones.
Ciclos Anidados y etiquetas
Ciclos anidados para mltiples etiquetas
Use etiquetas para distinguir entre bloques y ciclos.
S alga del ciclo exterior con la sentencia E X IT que
referencia la etiqueta
Usted puede anidar ciclos a mltiples niveles. Usted puede
anidar ciclos bsicos, FOR, While dentro de otro.
L a finalizacin de un ciclo anidado no determina la
culminacin del ciclo al menos que una excepcin fue
levantada. S in embargo, Usted puede etiquetar ciclos y
salir del ciclo externo con la sentencia E X IT.
Ciclos Anidados y etiquetas

B E GIN
<<outer_loop>>
L OOP
v_counter := v_counter +1;
EX IT WHE N v_counter>10 ;
<<Inner_loop>>
L OOP

EX IT outer_loop WHE N total_done = Y ES ;
-- L eave both loops
EX IT WHE N inner_done = Y ES ;
-- L eave inner loop only

END L OOP Inner_loop;

END L OOP outer_loop:
END
Resumen
E n esta leccin debiste haber aprendido a :
Cambiar el flujo lgico de las sentencias usando
estructuras de control
Condicionales (S entencia IF)
Expresiones CA S E
Ciclos:
Ciclos B asicos
Ciclos FOR
Ciclos While

S entencias de salida E X IT
Capitulo 5
CA PITUL O 5
M arcela Gmez
OBJETIVOS
Despus de completar sta leccin, usted ser capaz de
hacer lo siguiente:
Crear registros PL /S QL definidos por el usuario
Crear un registro con el atributo %ROWTY PE
Crear un ndice por tabla
Crear un ndice por tabla de registros
Describir las diferencias entre registros, tablas, y tablas de
registros
Composicin de tipos de datos
S on de dos tipos :
Registros PL /S QL
Colecciones PL /S QL
Indices por tabla
Tablas anidadas
V array
Contienen componentes internos
S on reusables
Registros PL/SQL
Debe contener uno o mas componentes de cualquier
escalar , archivo o ndice (tipo de tabla de datos), llamados
archivos
S on similares en estructura para registros en lenguaje de
tercera generacin
No son los mismos como filas en una tabla de base de
datos
Tarta una conexin de archivos como una unidad lgica
S on convenientes para ir a buscar una fila de datos desde
una tabla para procesarlos
Creando un archivo PL/SQL
S INTA XIS :
TY PE type_name IS RECORD
(field_declaration [, field_declaration]);
Identifier type_name;

Cuando field_declaration es:

Field_name {field_type |variable%TY PE


|table.column%TY PE |table %ROWTY PE}
[[NOT NUL L ] {:= |DEFA UL T} expr]

Definiendo y declarando un registtro PL /S QL


En la sintaxis:
Type_name es el nombre del tipo de registro
Field_name es el nombre del campo dentro del registro
Field_type es el tipo de dato del campo
Expr es el field_type o un valor inicial
La restriccin NOT NULL previene asignaciones nulas a estos campos. Debe estar seguro de
inicializar campos NOT NUL L
Creando un registro PL/SQL
Declare variables para para almacenar el nombre, trabajo
y salario de un nuevo empleado
E jemplo


TY PE emp_record_type IS RECORD
(last_name V A RCHA R2(25),
job_id V A RCHA R2(10),
salary NUM B ER(8,2));
Emp_record emp_record_type;

Estructura de registros PL/SQL
Field 1 (data type) Field2(data type) Field3 (data type)

Ejemplo:

Field 1 (data type) Field2(data type) Field3 (data type)


Employee_id number(6) last_name varchar2(25) job_id varchar2(10)

100 King A D_PRES


El atributo %ROWTYPE
Declara un variable de acuerdo a una coleccin de
columnas en una tabla de base de datos
E l prefijo %ROWTY PE con la tabla de base de datos
Campos en el registro toma sus nombres y tipos de datos
desde la columna de las tablas o vistas.
Declarando registros con el atributo
%ROWTYPE
S intaxis
DECLA RE
identifier reference%ROWTY PE;
Where: identifier es el nombre escogido por el registro como un todo
reference es el nombre

Asignando valores y registros


Usted puede asignar una lista de valores comunes a un registro usando sentencias S ELECT
o FETCH. A segrese que el nombre de columnas aparezcan en el mismo orden como los
campos en su registro. Usted tambin puede asignar un registroa otro si ellos tienen el
mismo tipo de datos.
Ventajas de usar %ROWTYPE
E l numero de tipo de datos de la columnas de base de
datos subrayada necesita ser conocida
E l numero y tipo de datos de las columnas de la base de
datos subrayada debe cambiarse en tiempo de ejecucin
E l atributo es aprovechable cuando se recupera una fila
con la sentencia S E L E CT.
Los atributos %ROWTYPE
E jemplos:
Declare una variable para guardar la informacin acerca
de un departamento de la tabla departamentos.
Dept_record departtments%ROWTY PE;
Declare una variable para guardar la informacin acerca
de un empleado de la tabla employees.
Emp_record demployees%ROWTY PE;
ndices por tablas
S on compuestos por dos componentes:
L lave primaria o tipo de dato B INA RY _INTEGER
Columna o escalar o tipo de dato registro
Puede incrementan en tamao dinmicamente porque
ellos son sin restriccin
Creando un ndice por tabla
S intaxis:
TY PE type_name IS TA B L E OF
{column_type |variable%TY PE
|table.column%TY PE} [NOT NUL L ]
|table.%ROWTY PE
[INDEX B Y B INA RY _INTEGER];
Identifier type_name;

Declare un ndice por tabla para almacenar nombres


Ejemplo:

TY PE ename_table_type IS TA B L E OF employees.last_name%TY PE INDEX
B Y B INA RY _INTEGER;
Ename_table ename_table_type;
ndice por estructura de la
tabla
Identificador nico Columna


1 Jones
2 S mith
3 M aduro

Binary_Integer Scalar
Creando un ndice por Tabla
DECLA RE
TY PE ename_table_type IS TA B L E OF
employees.las_name%TY PE
INDEX B Y B INA RY _INTEGER;
TY PE hiredate_table_type IS TA B L E OF DA TE
INDEX B Y B INA RY _INTEGER;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
B EGIN
ename_table (1) := CA MERON;
hiredate_table(8) :=S Y S DA TE + 7;
IF ename_table.EXIS T(1) THEN
INS ERT INTO

END;
/
Usando Mtodos de ndice por
tabla
L os siguientes mtodos hacen un ndice por tablas mas
fcil de usar:
E X IS TS . Retorna V erdadero si el elemento en PL /S QL existe
COUNT. Retorna el numero de elementos que la tabla contiene
FIRS T A ND L A S T. Retorna el primer y ultimo ndice
PRIOR. Retorna el numero del ndice que precede al ndice n
NE X T. Retorna el numero del ndice que sucede al ndice n
TRIM . Remueve un elemento del el final de la tabla PL /S QL
DE L E TE . E limina todos los elementos de la tabla PL /S QL
ndices por tablas de registros
Define una tabla variable con un tipo de dato PL /S QL
permitido.
Declara una variable PL /S QL para mantener informacin
del departamento
E jemplo:

DECLA RE
TY PE dept_table_type IS TA B L E OF
departments%ROWTY PE
INDEX B Y B INA RY _INTEGER;
Dept_table dept_table_type;
-- cada elemento de dep_table es un registro
Ejemplo de ndices por tabla de
Registros
S ET S ERV EROUTPUT ON
DECL A RE
TY PE emp_table_type IS TA B L E OF
employees.%ROWTY PE
INDEX B Y B INA RY _INTEGER;
my_emp_table emp_table_type;
v_count NUM B ER(3):= 104;
B E GIN
FOR i IN 100 .. V _count
L OOP
S EL ECT * INTO my_emp_table(I) FROM employees;
WHERE employee_id = i;
END L OOP;
FOR i IN my_emp_table.FIRS T.. M y_emp_table.L A S T
L OOP
DB M S _OUTPUT.PUT_L INE (my_emp_table(i).last_name);
E ND L OOP;
END;
/
Resumen
E n esta leccin, usted debi haber aprendido a :
Definir y referenciar las variables PL/S QL de tipos de datos
compuestos:
Registros PL /S QL
ndices por tablas
ndices por tabla de registros

Definir un registro PL /S QL usando el atributo


%ROWTY PE
CA PITULO 6
ES CRIB IR CURS ORES
EXPLICITOS
Objetivos
Despus de completar esta leccin, usted deber estar en
la capacitad de hacer lo siguiente:
Distinguir entre un cursor implcito y un explicito
Discutir cundo y por qu usar un cursor explicito
Usar una variable de registro PL/S QL
Escribe un cursor de ciclo FOR
Acerca de los Cursores
Cada sentencia S QL ejecutada por el servidor S QL tiene
un cursor individual asociado con este:
Cursores implcitos: Declarados para todas las sentencias
S EL ECT DM L y PL/S QL.
Cursores Explcitos: Declarados y nombrados por el
programador
Funciones de cursores Explcitos
Conjunto Activo 100 King A D_PRES
2Kochar A D_V P
Cursor .
.
140 Patel S T_CL ERK

Cursores explcitos
Use cursores explcitos para procesos individuales, cada fila retornada por
mltiples filas con la sentencia S E L E CT.
E l grupo de filas retornado por las consultas a filas mltiples es llamada el
conjunto activo.
L as funciones de los cursores explcitos son :
Pueden procesar mas all de la primera fila retornada por la consulta, fila por fila
Mantiene el rastro de cuales filas estn siendo procesadas
Permite al programador el control manual de los cursores explcitos el bloque PL /S QL
Controlando cursores explcitos
No
Si
declare open fetch EMPTY? close
Prueba las filas
existente
Crea un Identifica el Carga la fila Retorna a fetch Libera el
rea SQL conjunto actual dentro conjunto
activo de las variable si las filas son
encontradas activo
Controlando cursores explcitos
2. Declare el cursor nombrndolo y definiendo la estructura de la consulta a ser
ejecutada dentro de este.
3. A brir el cursor, la sentencia OPEN ejecuta la consulta y une variables que son
referenciadas. L as filas definidas por la consulta son llamadas grupo activo y ahora
estn habilitadas para el fetching.
4. Los datos Fetch del cursor. En el diagrama de flujo se meuestra enla diapositiva,
despues de cada fetch, ustred prueba el cursor para la existencia de cada fila si hay o
no mas filas para procesar, luego se debe cerrar el cursor.
5. Cerrar el cursor. L a sentencia Close libera los grupos activos de filas, esto es ahora
posible para reabrir el cursor para establecer un grupo activo actual
Controlando cursores explcitos
A brir el cursor
Fetch una fila
Cerrar el cursor

A brir el cursor

Cursor puntero
Controlando cursores explcitos
A brir el cursor
Ir a buscar una fila
Cerrar el cursor

Ir a buscar el cursor

Puntero del cursor

Continua hasta quedarse vacio


Controlando cursores explcitos
A brir el cursor
Ir a buscar la fila
Cerrar el cursor

Cerrar el cursor
.
.

Puntero del cursor


Declarando el cursor
S intaxis:
CURS OR cursor_name IS
Select_statement;

No incluye la clausula INTO en la declaracin del cursor


S i las filas se procesan en una secuencia especifica es
requerido, usar la clausula ORDE R B Y en una consulta
Declarando un cursor
DE CL A RE
CURS OR emp_cursor IS
S E L E CT employee_id, last_name
FROM employees;
CURS OR dept_cursor IS
S E L E CT *
FROM departments
WHE RE locarion_id = 170;
B E GIN

Abriendo el cursor
S intaxis
OPEN cursor_name;

A brir el cursor para ejecutar la consulta e identificar el


conjunto activo
S i la consulta no retorna filas, ninguna excepcin es
levantada
Usar atributos del cursor para probar el resultado despus
de un fetch
Datos fetching de el cursor
S intaxis

FETCH cursor_name INTO [variable1, variable2, ] |record_name];

Recuperar los valores de la fila actual en variables


Incluir el mismo numero de variables
Corresponder cada variable a la columna posicionalmente
Probar y ver si el cursor contiene filas
Buscando datos desde el cursor
E jemplo:

L OOP
FE TCH emp_cursor INTO v_empno, v_ename;
E X IT WHE N ;

--- Process the retrieve data

E ND L OOP;
Cerrando el cursor
S intaxis

CLOS E cursor_name;

Cerrar el cursor despus de completar el procesamiento de


las filas
Reabrir el cursor si se lo requiere
No Intentar ir a buscar los datos desde un cursor despus
de que haya sido cerrado
Atributos explcitos de los cursores
Obtener el estado de informacin acerca del cursor
Atributo Tipo Descripcin
%IS OPEN B oolean Evaluar V ERDA DERO si el cursor el
a abierto
%NOTFOUND B oolean Evaluar V si el mas reciente fetch no retorna
a una fila
%FOUND B oolean Evala V erdadero si el mas reciente fetch
a retorna una fila; complementa
%NOTFOUND
%ROWCOUNT Numeral Evala el numero total de filas retornadas a
distancia
El atributo %ISOPEN
S e va a buscar filas solo si el cursor esta abierto
S e usa el atributo %IS OPE N antes de ejecutar un fetch
para probar si el cursor es abierto.
E jemplo:

IF NOT emp_cursor%IS OPEN THEN


OPEN emp_cursor;
END IF ;
L OOP
FETCH emp_cursor
Controlando fetches mltiples
Procesar varias filas desde un cursor explicito usando un
ciclo cerrado.
Ir a buscar una fila con cada iteracin
Usar atributos de un cursor explicito para probar el acierto
de cada fetch.
Los atributos %NOTFOUND y %
ROWCOUNT
Usar el atributo del cursor %ROWCOUNT para recuperar
un numero exacto de filas
Use el atributo del cursor %NOTF OUND para determinar
cuando existe el ciclo.
Ejemplo:
DECL A RE
v_empno employees.employee_id%TY PE;
v_ename employees.last_name%TYPE;
CURSOR emp_cursor IS
SELECT employee_id last_name
from employees
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor into v_empno, v_ename;
EXIT WHEN emp_cursor %ROWCOUNT >10 OR
emp_cursor %ROWFOUND ;
DBMS_OUTPUT. PUT_LINE(TO_CHAR(vempno)|| || v_ename);
END LOOP;
CLOSE emp_cursor;
END
CURSORES Y REGISTROS
Procesar las filas del conjunto activo buscando valores de un archivo PL /S QL.
DECLA RE
CURS OR emp_cursor IS
S ELECT employee_id last_name
FROM employees;
emp_record emp_cursor %ROWTY PE;
B EGIN
OPEN emp_cusor;
LOOP
FETCH emp_cursor int emp_record;

emp_record
Employee_id last_name

100 King
Ciclos LOOP de Cursores
S intaxis
FOR record_name IN cursor_name L OOP
statement1;
S tatement2;

END LOOP;

El ciclo For es un atajo al proceso explicito de cursores


Implicito Open, fetch, exit, y close ocurre
El registro es declarado implcitamente
Ciclos FOR para cursores
Imprime una lista de empleados los cuales trabajan para el
departamento de ventas

DECLA RE
CURS OR emp_cursor IS
S EL ECT last_name, department_id last_name
FROM employees
B EGIN
FOR emp_record IN emp_cursor L OOP
-- implicit open and implicit fetch occur
IF emp_record.department_id = 80 THEN

END L OOP; -- implicit close occurs
END;
Ciclos FOR para cursores usando
subconsultas
No se necesita declarar el cursor
E jemplo:

B EGIN
FOR emp_record IN (S EL ECT last_name, department_id FROM
employees) L OOP
IF emp_record.department_id = 80 THEN

END L OOP; -- implicit close occurs
END;
Resumen
E n esta leccin, usted debi haber aprendido a:
Distinguir tipos de cursores:
Cursores implcitos: usados por todas las sentencias DM L y
consultas a filas simples
Cursores explcitos: usados por consultas de cero, uno, o mas filas
M anipular cursores explicitos
E valuar estados del cursor usando atributos del cursor
Usar cursores con ciclos FOR
CA PITULO 7
CONCE PTOS A V A NZA DOS DE CURS ORE S
E X PL ICITOS
Objetivos
Despus de completar esta leccin, usted deber ser capaz
de hacer lo siguiente:
Escribir un cursor cuando es requerida una actualizacin FOR
en el cursor .
Determinar cuando una clausura de actualizacin FOR en un
cursor es requerida.
Determinar cuando usar la sentencia WHERE CURRENT OF
Escribir un cursor que usa subconsultas
Cursores con parmetros
S intaxis:
CURS OR cursor_name
[(parameter_name datatype, )]
IS
S elect_statement;

Pasar valores de los parmetros a un cursor cuando el cursor es abierto


y la consulta es ejecutada.
A brir un cursor explicito algunas veces con un diferente conjunto
activo cada vez

OPEN cursor_name (parameter_value, . . .);


Cursores con parametros
Pasar el numero de departamento y titulo de trabajo a la
sentencia where, en el cursor o sentencia S E L E CT
DECLA RE
CURS OR emp_cursor
(p_deptno NUMB ER, p_job V A RCHA R2) IS
S ELECT employee_id, last_name
FROM employees
WHERE department_id = p_deptno
A ND job_id = p_job;
B EGIN
OPEN emp_cursor (80, S A _REP);

CLOS E emp_cursor;
OPEN emp_cursor (60, IT_PROG);

END;
La clausula FOR UPDATE
S intaxis:
S ELECT
FROM
FOR UPDA TE [OF column_reference] [NOWA IT];

Use trabas explicitas para denegar acceso para la duracin de la


transaccin.

Cerrar las filas antes de la actualizacin o eliminacin


La clausula FOR UPDATE
Recuperar los empleados que trabajen en el departamento 80 y actualice sus salario

DECLA RE
CURS OR emp_cursor IS
S EL ECT employees_id, last_name, department_name
FROM employees , departments
WHERE employees, departments_id =
departments.department_id
A ND employees.department_id =80
FOR UPDA TE OF salary NOWA IT;
La clausula WHERE CURRENT OF
S yntaxis:
WHERE CURRENT OF cursor:

Use cursores para actualizar o eliminar la fila actual.


Incluya la sentencia FOR UPDATE en la consulta del
cursor para bloquear primero las filas.
Use la clausula WHERE CURRENT OF para referenciar
la fila actual de un cursor explicito.
La clausula WHERE CURRENT OF
DECL A RE
CURS OR sal_cursor IS
S EL E CT e.department_id, employee_id, last_name,
salary
FROM employees e, departments d
WHERE d.department.id c = e. department_id
A ND d.department id ca =60
FOR UPDA TE OF salary NOWA IT;
B EGIN
FOR emp_record in sal_cursor
L OOP if emprecord.salary <5000 THEN
UPDA TE employees
S ET salary = emp_record.salary * 1.10
WHERE CURRENT OF sal_cursor;
A ND IF
END L OOP;
END
Cursores con SUBCONSULTAS
E jemplo:
DECLA RE
CURS OR my_cursor IS
S EL ECT t1.department_id, t1.department_name, t2.staff
FROM departments t1,(select departmen_id,COUNT(*) A S
S TA FF
FROM employees GROUP B Y department_id) t2

WHERE t1.department_id =t2.department_id


A ND t2.stuff >=3;

RESUMEN
E n esta leccion debiste haber aprendido a:
Retornar diferentes conjuntos activos usando cursores con
parametros.
Definir cursores con subconsultas y subconsultas
correlacionados.
M anipular cursores explicitos con comandos usando las:
- Clausula FOR UPDA TE
- Clausula WHE RE CURRE NT OF
La clausula FOR UPDATE
Recuperar los empleados que trabajen en el departamento 80 y actualice sus salario

DECLA RE
CURS OR emp_cursor IS
S EL ECT employees_id, last_name, department_name
FROM employees , departments
WHERE employees, departments_id =
departments.department_id
A ND employees.department_id =80
FOR UPDA TE OF salary NOWA IT;
CA PITUL O 8
M A NIPUL A NDO E X CE PCIONE S
Objetivos
Despues de completar esta leccion, sera capaza de hacer lo
siguiente:
Definir excepciones PL/S QL
Reconocer excepciones que no son manipulables
L istar diferentes tipos de excepciones manejables PL/S QL
A trapar errores no anticipados
Describir los efectos de la propagacin de excepciones en
cloques anidados
A daptar mensajes de excepciones PL/S QL
Manejando excepciones con
PL/SQL
Una excepcin es un identificador en PL /S QL que es
levantada durante la ejecucin.
Como es levantada?
Un error Oracle ocurre
S e levanta explcitamente
Como se los manipula?
A traparlo con un manipulador
Propagarlo en un entorno de invocacin
Manejando excepciones
Tipos de Excepciones
Implcitamente levantado
Predefinir el servidor Oracle
No predefinir el servidor Oracle

E xplcitamente levantado
Usuario definido
Atrapando excvepciones
S intaxis:

EXCEPTION
WHEN exception1 [OR exception2 . . . ] THEN
statement1;
statement2;

[WHEN exception3 [OR exception4 ] THEN
statement1;
statement2;
]
[WHEN OTHERS THEN
statement1;
statement2;
]
Atrapando excepciones con lneas
de guas

L a palabra reservada E X CE PTION empieza la seccin


exception-handling
A lgunos manejadores de excepciones son permitidas
S olo un manejador es procesado antes de dejar el bloque
WHE N OTHE RS es la ultima clausula
Atrapando errores predefinidos en
el servidor Oracle
Referencia el nombre estndar en la rutina de manejo de
excepciones
Probar excepciones predefinidas:
NO_DA TA _FOUND
TOO_MA NY _ROWS
INV A L ID_CURS ORS
ZERO_DIV IDE
DUP_V A L _ON_INDEX
Excepciones predefinidas
S intaxis:
B EGIN

EXCEPTION
WHEN NO DA TA FOUND THEN
statement1;
statement2;
WHEN TOO_M A NY _ROWS THEN
statement1;
WHEN NO OTHERS THEN
statement1;
statement2;
statement3;
END;
Atrapando errores no predefinidos
del Servidor Oracle

Declare A ssociate reference

S eccin de declaracin S eccion Exception-handling

Nombrar la excepcin Codificar el pragma Manejar el levantamiento de la


EXCEPTION_INIT excepcion
Errores no predefinidos
A trapar los errores del servidor Oracle numero -2292, una violacin de integridad

DEFINE p_deptno = 10
DECLA RE
e_emps_remaining EXCEPTION;
PRA GM A EXCEPTION_INIT
(e_emps_remaining, -2292);
B EGIN
DEL ETE FROM departments
WHERE department_id = & p_deptno;
COM M IT;
EXCEPTION
WHEN e_emps_remaining THEN
DB M S _OUTOPUT.PUT_L INE (no puede eliminmar dept ||)
TO_CHA R (& p_deptno ) ||. Employees existe. );
END;
Funciones para atrapar
excepciones
S QL CODE : regresa el valor numrico por el cdigo de
error

S QL E RRM : regresa el mensaje asociado con el nmero


de error
Funciones para atrapar
excepciones
DECLA RE

v_error_code NUM B ER;


v_error_message V A RCHA R2(255);
B EGIN

EXCEPTION

WHEN OTHERS THEN


ROL L B A CK;
v_error_code := S QLCODE;
v_error_mesage := S QLERRM ;
INS ERT INTO errors
V A L UES (v_error_code , v_error_message);
END;
Atrapando excepciones User-
defined

Declare Raise reference

S eccin de S eccion Exception-


S eccin ejecutable
declaracin handling

Nombre de la L evantar explcitamente


excepcin M anipular la excepcin
L a excepcin usando la De levantamiento
S entencia RA IS E
Excepciones user-defined
DEFINE p_departmente_desc = Information tecnologhy
DEFINE p_departmente_number= 300

DECLA RE
e_invalid_department EXCEPTION;
B EGIN
UPDA TE departments;
S ET department_name = & p_department_desc
WHERE department_id = & p_department_number;
IF S QL%NOTFOUND THEN
RA IS E e_invalid_department;
END IF;
COMM IT;
EXCEPTIO
WHEN e_invalid_department THEN
DB MS _OUTPUT.PUT_LINE (no such department id);
END;
Llamando entornos
iSQL *Plus Despliega el numero de error
y mensaje a la pantalla

Constructor de procedimiento Despliega el numero de error y


mensaje a la pantalla
Formas del desarrollador de A ccesa al numero de error y
Oracle mensaje en un trigger
A plicacin Precompilada A ccesa al numero de error a
traves de la estructura de datos
S QL CA

Un B loque PL /S QL includo A trapa excepciones en routinas


de exeption-handling del
bloque includo
Propagando excepciones
DECLA RE
e_no_rows EXCEPTION;
e_integrity EXCEPTION;
PRA GMA EXCEPTION_INIT (e_integrity, -2292)
B EGIN
FOR c_record IN emp_cursor L OOP
B EGIN
S ELECT
UPDA TE
IF S QL%NOTFOUND THEN
RA IS E e_no_rows;
END IF;
END;
END LOOP;
EXCEPTION
WHEN e_integrity THEN
WHEN e_no_rows THEN
END;
Procedimiento
RAISE_APLICATION_ERROR
S intaxis:
Raise_aplication_error (erroe_number, message [, {TRUE |FA LS E } ]);

Usted puede usar este procedimiento para publicar


mensajes de error de subprogramas almacenados.
Usted puede reportar errores a su aplicacin y permitir el
retorno de excepciones no manejables
Procedimiento
RAISE_APLICATION_ERROR
S e usan en dos diferentes lugares:
S eccin Ejecutable
S eccin de excepcin

Retorna condiciones de error al usuario en manera consistente


con otros errores del servidor Oracle
RAISE_APLICATION_ERROR
S eccin ejecutable:
B EGIN

DELETE FROM EM PL OY EES


WHERE manager_id = v_mgr;
IF S QL%NOTFOUND THEN
RA IS E A PL ICA TION_ERROR (-20202, este no es un manejador valido);
END IF;

S eccin de excepcin:

EXCEPTION
WHEN NO_DA TA _FOUND THEN
RA IS E_APPL ICA TION ERROR(-20201, el administrador no es empleado
valido);
END;
Resumen
E n esta leccin, usted debi haber aprendido que :
Tipos de excepciones:
E rror predefinido por el servidor Oracle
E rror no predefinido por el servidor Oracle
E rror definido por el usuario
A trapar excepciones
Manejar excepciones:
A trapar la excepcin dentro del bloque PL /S QL

Propagar la excepcin
CAPITULO 9
Objetivos
Despus de completar esta leccin, usted ser capaz de
hacer lo siguiente:
Distinguir bloques annimos PL/S QL de bloques PL/S QL
con nombre (subprogramas)
Describir subprogramas
L istar los beneficios de usar subprogramas
L istar los diferentes entornos de donde los subprogramas
pueden ser envocados.
objetivos
Despus de completar esta leccin, usted ser capaz de
hacer lo siguiente:
Ddescribir bloques PL/S QL y subprogramas
Describir los usos de procedimientos
Crear procedimeintos
Diefrenciar entre parametros formales y actuales
Crear procedimientos si parametros
Invocar un procedimeinto
Manejar excepciones en procedimeintos
Eliminar un procedimiento
Vista general de subprogramas
Un subprograma:
Es un bloque con nombre PL/S QL que puede aceptar
parametros y ser invocado desde una llamada del entorno
E s de dos tipos:un procedimiento que ejecuta una accion
Una funcion que calcula un valor
Es basado en estructutras estandar de bloques PL/S QL
Provee modularidad, reusabilidad, extensibilidad y
manetnimeinto.
Provee facil mantenimiento, mejora la seguridad de datos ,
integridad, funcionamiento y claridad del codigo

Das könnte Ihnen auch gefallen