GEDICA TRAINING & CONSULTING C.A.

I TRODUCCIÓ A PL/SQL

09/03/2005

GEDICA TRAINING & CONSULTING C.A.

TABLA DE CONTENIDO
I TRODUCCIO A PL/SQL ...................................................................................................4
OBJETIVOS DEL CURSO: .............................................................................................................................. 4 CONTENIDO PROGRAMÁTICO: .................................................................................................................. 4 ESTRATEGIAS METODOLÓGICAS:............................................................................................................. 5 RECURSOS AUDIOVISUALES Y EVALUACIÓN: ...................................................................................... 5 REQUISITOS DE ADMISIÓN: ........................................................................................................................ 5

Capítulo 1....................................................................................................................................6 I TRODUCCIO A PL/SQL ....................................................................................................6
I TRODUCCIÓ A PL/SQL............................................................................................................ 7 ESTRUCTURA DE LOS BLOQUES DE PL/SQL.......................................................................... 8 TIPOS DE BLOQUE .......................................................................................................................... 9
Bloques Anónimos ........................................................................................................................................... 10 Subprogramas................................................................................................................................................... 10 SINTAXIS DE BLOQUES PL/SQL................................................................................................................ 11

TIPOS DE DATOS E PL/SQL...................................................................................................... 15 VARIABLES E PL/SQL................................................................................................................ 16
TIPOS DE VARIABLE EN PL/SQL............................................................................................................... 16

DECLARACIO DE VARIABLES E PL/SQL .......................................................................... 20 VARIABLES TIPO ATRIBUTO E PL/SQL............................................................................... 23
Variables tipo RECORD .................................................................................................................................. 23 Variables tipo TABLE ..................................................................................................................................... 24

ASIG A DO VALORES A VARIABLES .................................................................................... 26 BLOQUES I TER OS Y ALCA CE DE VARIABLES ............................................................ 28
Alcance ............................................................................................................................................................ 29

OPERADORES ................................................................................................................................. 29
OPERADORES NUMERICOS ....................................................................................................................... 29 OPERADORES LOGICOS O BOOLEANOS ................................................................................................ 29 PRACTICA 1................................................................................................................................................... 31

Capítulo 2..................................................................................................................................32 FU CIO ES E PL/SQL......................................................................................................32
FU CIO ES E PL/SQL................................................................................................................ 33 I TERACTUA DO CO EL ORACLE SERVER...................................................................... 33
COMPARACION DE INSTRUCCIONES SQL y PL/SQL............................................................................ 34 RECUPERANDO DATOS – La cláusula SELECT ........................................................................................ 34 INSERTANDO DATOS – La cláusula INSERT............................................................................................. 36 ACTUALIZANDO DATOS – La cláusula UPDATE ..................................................................................... 36 BORRANDO DATOS – La cláusula DELETE............................................................................................... 37

Lenguaje Procedimental PL/SQL/ 1

GEDICA TRAINING & CONSULTING C.A.

CONTROL DE TRANSACCIONES............................................................................................................... 37 PRACTICA 2................................................................................................................................................... 40

Capítulo 3..................................................................................................................................41 ESTRUCTURAS DE CO TROL ............................................................................................41
ESTRUCTURAS DE CO TROL DE PL/SQL.............................................................................. 42
CONDICIONALES ......................................................................................................................................... 42 La sentencia IF ................................................................................................................................................. 43 ITERACIONES ............................................................................................................................................... 45 ETIQUETAS.................................................................................................................................................... 49

CURSORES ....................................................................................................................................... 51
CURSORES en SQL........................................................................................................................................ 51 CURSORES EN PL/SQL ................................................................................................................................ 53 PRACTICA 3................................................................................................................................................... 62

Capítulo 4..................................................................................................................................63 MA EJO DE ERRORES ........................................................................................................63
MA EJO DE ERRORES E PL/SQL ........................................................................................... 64
EXCEPCIONES PREDEFINIDAS ................................................................................................................. 64 MANEJANDO EXCEPCIONES..................................................................................................................... 65 EL PRAGMA EXCEPTION_INIT.................................................................................................................. 66 EXCEPCIONES DEFINIDAS POR EL USUARIO ....................................................................................... 67 PRACTICA 4................................................................................................................................................... 70

Capítulo 5..................................................................................................................................71 PROGRAMAS ALMACE ADOS E LA BASE DE DATOS...............................................71
I GE IERIA DEL LE GUAJE PL/SQL ..................................................................................... 72
INGENIERIA DE PL/SQL .............................................................................................................................. 72

I GE IERIA DE PL/SQL RESIDE TE E EL RDBMS .......................................................... 73
DIFERENCIA ENTRE PROCEDIMIENTO Y FUNCION ............................................................................ 74 CARACTERISTICAS DE PROCEDIMIENTOS Y FUNCIONES ................................................................ 74 USOS DE PROCEDIMIENTOS Y FUNCIONES .......................................................................................... 75 CREACION Y COMPILACION DE PROCEDIMIENTOS Y FUNCIONES................................................ 75 Instrucciones Válidas en Procedimientos y Funciones .................................................................................... 77 Instrucciones No Validas en Procedimientos y Funciones............................................................................... 78 EJECUCION DE PROCEDIMIENTOS Y FUNCIONES ALMACENADOS ............................................... 78

COMPILACIO DE ERRORES E PL/SQL............................................................................... 80
ERRORES DE PL/SQL ................................................................................................................................... 80 ERRORES DEFINIDOS POR EL USUARIO ................................................................................................ 81 ELIMINACION DE PROCEDIMIENTOS Y FUNCIONES .......................................................................... 82

PAQUETES ....................................................................................................................................... 83
ESTADO PERSISTENTE ............................................................................................................................... 83 ESTRUCTURA DE UN PAQUETE ............................................................................................................... 84 DEPENDENCIAS ENTRE PAQUETES ........................................................................................................ 84 ESPECIFICACIONES PARA LA CREACION DE PAQUETES .................................................................. 85 PRACTICA 5................................................................................................................................................... 88

Lenguaje Procedimental PL/SQL/ 2

.......................................................................................................... Capítulo 6............................................................................................................... 98 PRACTICA 6.............................................................................................. 92 DEFINICION Y CREACION DE TRIGGERS.......................... 93 CREACION DE UN TRIGGER DE BASE DE DATOS ......................................................89 TRIGGERS o DISPARADORES DE EVE TOS.....................89 TRIGGERS DE BASE DE DATOS.................................... 94 Predicados Condicionales .................................................................................................. 96 ELIMINANDO UN TRIGGER DE BASE DE DATOS .........................A........................................ 94 SECUENCIA DE EJECUCION DE UN TRIGGER DE BASE DE DATOS .................................................................................................................. 90 RESTRICCIONES DE LOS TRIGGERS.....................................................................................GEDICA TRAINING & CONSULTING C............................................................................................... 99 Lenguaje Procedimental PL/SQL/ 3 ...........................................................................

I TRODUCCIO A PL/SQL En este taller los participantes aprenderán a escribir programas en PL\SQL. y luego accesarlos desde cualquier otra interfaz. ejecutar y mantener procedimientos. Lenguaje Procedimental PL/SQL/ 4 . OBJETIVOS DEL CURSO: • Crear. triggers de la base de datos y tipos de objetos • • Administrar la construcción de programas PL/SQL Describir los ambientes de desarrollo PL/SQL CO TE IDO PROGRAMÁTICO: • • • • • • • • • • • Introducción a PL\SQL Estructura de los bloques Tipos de Bloques Declaración de variables Operadores Funciones en PL\SQL Estructuras de Control Cursores Manejo de Errores Programas almacenados en la B. paquetes. Triggers de Base de Datos. a almacenarlos en la base de datos.GEDICA TRAINING & CONSULTING C.A. funciones.D.

ESTRATEGIAS METODOLÓGICAS: • • Utilización de laminas audiovisuales las cuales serán transmitidas durante el curso. REQUISITOS DE ADMISIÓ : • Introducción a SQL y SQL Avanzado Lenguaje Procedimental PL/SQL/ 5 . los cuales son asignados por el instructor. RECURSOS AUDIOVISUALES Y EVALUACIÓ : • • diapositivas elaboradas en power point Para la evaluación se realizaran distintas practicas dirigidas por el instructor. Realización de ejercicios prácticos.GEDICA TRAINING & CONSULTING C.A.

Capítulo 1 I TRODUCCIO A PL/SQL Lenguaje Procedimental PL/SQL/ 6 .GEDICA TRAINING & CONSULTING C.A.

(como por ejemplo FORMS. de realizar accesos a la base de datos. para la elaboración de programas de gran envergadura. UD. También puede ser usado para crear reportes. permite visualizar. debido al uso de bucles. y declaración de variables. Pro*C. PL/SQL es clasificado como un lenguaje procedimental. Es muy probable que en sus prácticas de SQL. haya sentido la necesidad de usar condiciones. todas las ventajas de un lenguaje de tercera generación. entre otras).A. como lo son Pascal. C. REPORTS. o borrar múltiples registros con el uso de una simple instrucción. POWER*OBJECTS. Para mayor sorpresa observó que esto no es posible usando solo SQL. pero PL/SQL también es empleado en otras herramientas de ORACLE. modificar. para realizar accesos rápidos a la base de datos. Es así como nace PL/SQL. se pueden escribir en SQL*Plus. Fue por la razón que se hizo necesaria una herramienta que concediera todas las ventajas de SQL y a su vez. Esto nos da la ventaja. I TRODUCCIÓ A PL/SQL El SQL es un lenguaje muy poderoso. su entrada y salida es a través de parámetros o medios intermedios. Los bloques de PL/SQL.GEDICA TRAINING & CONSULTING C. condicionales. empleando para ello muy poco esfuerzo. o declarar variables. bucles. etc. Basic. Cobol. sin la necesidad de utilizar un software especializado. como lo hacía en los lenguajes de tercera generación. sin la necesidad de poseer un software especializado. Lenguaje Procedimental PL/SQL/ 7 .

GEDICA TRAINING & CONSULTING C.Inicio de Bloque -. -. -. La tabla siguiente describe brevemente las tres secciones: Sección Declarativa Descripción Contiene todas las variables. ESTRUCTURA DE LOS BLOQUES DE PL/SQL El lenguaje de programación PL/SQL es un lenguaje estructurado por bloques. constantes. cursores y excepciones BEGIN -.Instrucciones para el manejo de errores END. Cada bloque es independiente y consta de tres secciones: Sección Declarativa (opcional). Ejecutable (Obligatoria) y de Manejo de Excepciones (Opcional).Comando de ejecución del bloque Lenguaje Procedimental PL/SQL/ 8 . cursores y excepciones definidas por el usuario que son referenciadas en la sección Ejecutable y en la misma sección Declarativa Contiene instrucciones SQL para manipular la data en la base de datos e instrucciones PL/SQL que permiten manipular la data en el bloque Inclusión Opcional Ejecutable Obligatoria Manejo de Excepciones Indica las acciones a tomar cuando ocurra una condición Opcional anormal o algún error durante la ejecución de las instrucciones de la sección Ejecutable La estructura básica de un bloque de PL/SQL es la siguiente: DECLARE -. En este. los programas son divididos en bloques lógicos.Declaraciones de variables. -.Instrucciones SQL.A.Instrucciones PL/SQL.Fin de Bloque / -. Solo las palabras reservadas BEGIN y END son obligatorias y al menos una instrucción dentro de ellas. EXCEPTION.

Instrucciones [EXCEPTION] --. debe aparecer el mensaje siguiente: PL/SQL procedure successfully completed En PL/SQL un error es llamado una excepción. Se conocen dos tipos de bloque anónimos y subprogramas (Procedimientos y Funciones). Cuando el bloque se ha ejecutado exitosamente. BEGIN y EXCEPTION son las únicas que no están seguidas de punto y coma.) Para ejecutar un bloque de PL/SQL se debe utilizar un slash (/). Procedimiento PROCEDURE nombre IS BEGIN --.GEDICA TRAINING & CONSULTING C.Instrucciones END. Las palabras reservadas DECLARE. valor. --tipo_dato ---- Lenguaje Procedimental PL/SQL/ 9 .Instrucciones [EXCEPTION] --. estos bloques pueden ser independientes o estar inmersos uno dentro de otro. Cada instrucción de SQL o cada sentencia de control de PL/SQL debe estar terminada en punto y coma (.A. Puede haber cualquier número de sub-bloques internos o anidados. TIPOS DE BLOQUE Cada unidad de programa de PL/SQL se compone de uno o más bloques.Instrucciones END. La siguiente figura ilustra la estructura de los tipos de bloques conocidos: Anónimo [DECLARE] BEGIN --. Función FUNCTION nombre IS RETURN BEGIN Instrucciones RETURN [EXCEPTION] Instrucciones END.

en general se elabora un procedimiento para ejecutar alguna tarea compleja o repetitiva. estos subprogramas pueden ser llamados desde cualquier parte. Puede almacenar subprogramas en la base de datos o declararlos como parte de una aplicación.GEDICA TRAINING & CONSULTING C. Subprogramas Son bloques de PL/SQL con nombre. si están en la base de datos. Se declaran como Procedimientos y Funciones. se declaran en un punto de la aplicación desde el cual se ejecutan.A. como Pro*C o ejecutarse desde SQL*Plus. o desde cualquier parte de la aplicación si solo pertenecen a esta. Se pueden invocar desde diferentes puntos en la aplicación. Se puede insertar un bloque anónimo dentro de otro programa que posea un precompilador. y una función para calcular algún valor. La siguiente tabla muestra los diferentes programas que pueden crearse en PL/SQL: Tipo de Programa Anónimo que Descripción Bloque sin nombre de PL/SQL esta inmerso dentro de Disponibilidad Todos los entornos de una PL/SQL aplicación o que es interactivo Stored Procedure o Función Bloque PL/SQL con nombre Oracle Server almacenado en el Oracle Server. puede aceptar parámetros y ser llamado varias veces usando el nombre Lenguaje Procedimental PL/SQL/ 10 . Estos pueden tomar parámetros de entrada y devolver valores a su vez una vez finalizada la ejecución. El cuerpo de instrucciones de los Triggers lo conforman bloques de este tipo. Bloques Anónimos Son bloques sin nombre.

GEDICA TRAINING & CONSULTING C.A.

Procedimiento Función de Aplicación

o

Bloque con nombre de PL/SQL

Componentes

Oracle

almacenado en una aplicación Developer Developer, por ejemplo Forms o una librería compartida, puede aceptar parámetros y ser invocado repetidas veces usando el nombre

Paquete

Modulo con nombre de PL/SQL

Componentes

Oracle

que agrupa objetos relacionados como Server y Oracle Developer, por procedimientos, identificadores Trigger de base de datos Bloque de PL/SQL que esta asociado a una tabla de la base de datos y se ejecuta automáticamente cuando ocurre el evento para el que fue definido Trigger aplicación de Bloque de PL/SQL que esta Componentes de Oracle Oracle Server funciones e ejemplo Forms

asociado con un evento en la aplicación y Developer, por ejemplo Forms se ejecuta automáticamente cuando el evento ocurre durante la ejecución

SI TAXIS DE BLOQUES PL/SQL
Debido a que PL/SQL es una extensión de SQL, las reglas de sintaxis en general que aplican a SQL también aplican al lenguaje PL/SQL:

Los identificadores y literales, así como otras unidades léxicas, pueden estar separadas por uno o más espacios u otros delimitadores que no puedan ser confundidos como parte de la unidad léxica. No puede insertar espacios dentro de las unidades léxicas excepto en cadenas de caracteres literales y comentarios.

Lenguaje Procedimental PL/SQL/ 11

GEDICA TRAINING & CONSULTING C.A.

Las instrucciones pueden estar en una misma línea, pero las palabras clave deben estar en una única línea.

DELIMITADORES Los delimitadores son símbolos simples o compuestos que adquieren un significado especial al ser interpretados por PL/SQL, la siguiente tabla muestra los símbolos que maneja este lenguaje:

Símbolo + * / = @ ;

Significado Operador de adición Operador de multiplicación Operador de división real Operador “igual a” Indicador de acceso remoto Terminador de instrucción <> || -/* */ := Operador de sustracción/negación !=

Símbolo

Significado Operador “diferente de” Operador “diferente de” Operador de concatenación Comentario de una línea Delimitador “apertura comentario” Delimitador “cierre comentario” Operador de asignación de de

Lenguaje Procedimental PL/SQL/ 12

GEDICA TRAINING & CONSULTING C.A.

IDE TIFICADORES

Los identificadores son usados para nombrar programas PL/SQL, ítems y unidades, entre las cuales pueden incluir variables, constantes, excepciones, cursores, variables de cursores, subprogramas y paquetes. Las reglas para nombrar un identificador en PL/SQL son las mismas que para nombrar variables.

LITERALES Un literal es un valor explícito ya sea numérico, string, caracter o booleano. Es un valor no representado por un identificador.

Los literales incluyen todos los caracteres imprimibles en PL/SQL, estos son letras, números, espacios y caracteres especiales.

Los literales numéricos se pueden representar por un valor simple entero o punto flotante (por ejemplo 5 ó -650.76) o en notación científica (por ejemplo 3.45E-5 lo que representa 3.4x10-5)

COME TARIOS Los comentarios son utilizados para documentar los programas y facilitar el mantenimiento de los mismos. En PL/SQL los comentarios deben estar precedidos por dos guiones de separación (--) sin blanco entre ellos, si el comentario ocupa una línea o encerrado entre los separadores de inicio y fin /* y */, si el comentario ocupa varias líneas.

Lenguaje Procedimental PL/SQL/ 13

Este es el final de la transacción Lenguaje Procedimental PL/SQL/ 14 . El siguiente ejemplo muestra el uso de los comentarios: … v_salario NUMBER(9.2).GEDICA TRAINING & CONSULTING C. BEGIN -. END.A. -.Este es el inicio del bloque /* En este bloque se calcula el salario anual basado en el salario mensual el cual es dado por el usuario como dato de entrada */ v_salario := &p_salario_mensual * 12.

147.647 y 2. este tipo de dato no es interpretado por PL/SQL BOOLEAN Valores lógicos. max” pueden llegar hasta un máximo de 32.767 bytes y no tiene longitud por defecto NUMBER[(posic. max) Descripción Cadena de caracteres de longitud variable con un máximo de “long. generalmente utilizado para imágenes.767 bytes.GEDICA TRAINING & CONSULTING C.483. FALSO o NULL BINARY_INTEGER PLS_INTEGER Valores enteros entre –2.147.max)] Fecha y Hora hasta una precisión de minutos y segundos Caracteres de longitud fija hasta un máximo de 32.647 pero los cuales requieren menor almacenamiento que los demás tipos numéricos RECORD TABLE ROWID Columnas tipo registro Arreglo de una dimensión Dirección de fila en formato hexadecimal Lenguaje Procedimental PL/SQL/ 15 . TIPOS DE DATOS E PL/SQL La siguiente tabla muestra un resumen de los tipos de datos base de PL/SQL: Tipo de Dato VARCHAR2(long.483. Estos datos no pueden ser seleccionados y almacenados en una variable PL/SQL RAW LONG RAW Números enteros hasta 255 Datos en formato binario de hasta 2 Gbytes.647 y 2.647 Valores enteros entre -2.A. por defecto la longitud es 1 LONG Cadenas de caracteres de hasta 2 Gbytes de longitud. pueden almacenar tres posibles valores VERDADERO.483.147.147.483. dec)] Numero de precisión fija o flotante con “posic” posiciones y “dec” posiciones decimales DATE CHAR[(long.

Algunas ventajas del uso de variables son las siguientes: • • • • Almacenamiento temporal de datos Calculo de valores sin nuevos accesos a la base de datos Pueden ser reutilizadas en distintas partes del bloque de instrucciones Son fáciles de mantener y actualizar TIPOS DE VARIABLE E PL/SQL En PL/SQL se pueden declarar distintos tipos de variables: ESCALARES Son variables que contienen valores simples. estas variables pueden ser utilizadas para recibir valores resultantes de la ejecución de consultas SQL. almacenan principalmente valores que corresponden a los mismos tipos básicos de las columnas de una tabla. como los registros. Lenguaje Procedimental PL/SQL/ 16 . También pueden almacenar valores lógicos.GEDICA TRAINING & CONSULTING C. COMPUESTAS Son variables que contienen varios tipos de datos. VARIABLES E PL/SQL Con PL/SQL se pueden declarar variables. o pueden aparecer en cualquier tipo de expresiones que aparezcan dentro del bloque PL para el cual fueron declaradas.A.

en archivos del sistema operativo. Indican la localización de objetos complejos cuyo almacenamiento real esta en archivos fuera de base de datos. existen los siguientes tipos de datos LOB: • CLOB : (Character Large Object) se utilizan para almacenar grandes cantidades de texto en la base de datos. • NCLOB: (National Language Character Large Object) se utiliza para almacenar grandes bloques de datos en la base de datos con formatos de presentación multilenguaje. Además existen variables que no son de PL/SQL: Lenguaje Procedimental PL/SQL/ 17 . • BLOB: (Binary Large Object) se utiliza para almacenar en la base de datos objetos binarios. REFERE CIAS Son variables de tipo puntero referencian posiciones de almacenamiento de otros objetos. vídeo. texto.GEDICA TRAINING & CONSULTING C. • BFILE : (Binary File) se utiliza para almacenar archivos binarios fuera de la base de datos. como por ejemplo imágenes. Estas variables no están cubiertas por este curso.A. Los tipos de dato LOB (Objetos Largos) permiten localización eficiente y acceso aleatorio a los datos. etc de hasta 4 GB de longitud. LOB Variables llamadas localizadores.

son variables que se declaran en una sesión y sirven para almacenar cálculos parciales. El siguiente ejemplo muestra un ejemplo en el cual se hace uso de ambos tipos de variables. Para visualizar el contenido de una variable de tipo bind se utiliza el comando PRINT. Variables Bind (de enlace). a continuación se muestra un ejemplo : VARIABLE valor_de_retorno NUMBER VARIABLE mensaje_devuelto VARCHAR2(60) Tanto SQL como SQL*Plus pueden referenciar las variables bind.GEDICA TRAINING & CONSULTING C. se definen precediendo al identificador por el símbolo ampersand. Para declarar una variable bind durante una sesión de SQL*Plus se utiliza el comando VARIABLE seguido del nombre de la variable y el tipo. SQL> PRINT tot_sueldo Variables Host: son llamadas también variables de sustitución. son las variables utilizadas para el pase de parámetros al runtime durante la ejecución de uno o más programas PL/SQL. El siguiente ejemplo ilustra el uso del comando PRINT: SQL> VARIABLE tot_sueldo NUMBER ...A. contiene comandos de SQL*Plus y un bloque completo de PL/SQL : Lenguaje Procedimental PL/SQL/ 18 . se referencian dentro de los bloques de PL/SQL colocando inclusive el símbolo ampersand y su efecto es el de sustituir completamente la variable por la cadena que recibe como entrada. y SQL*Plus puede visualizar su valor o utilizarla como cualquier variable durante la ejecución de cualquier bloque.

BEGIN salario_auxiliar := salario_auxiliar / 12.A. haciendo uso del paquete DBMS_OUTPUT. END.put_line (‘El salario mensual es ‘ | | TO_CHAR(salario_auxiliar)). desde dentro del mismo bloque. dbms_output. / Lenguaje Procedimental PL/SQL/ 19 .2) := &salario_anual. END.2) := &salario_anual.PUT_LINE que es un paquete proporcionado por ORACLE y PUT_LINE es un procedimiento dentro de ese paquete. VARIABLE salario_mensual NUMBER ACCEPT salario_anual PROMPT ‘Introduzca el Salario Anual : ‘ DECLARE salario_auxiliar NUMBER(12. BEGIN :salario_mensual := salario_auxiliar / 12. El siguiente ejemplo muestra el uso del paquete DBMS_OUTPUT: SET SERVER OUTPUT ON ACCEPT salario_anual PROMPT ‘Introduzca el Salario Anual : ‘ DECLARE salario_auxiliar NUMBER(12.GEDICA TRAINING & CONSULTING C. / PRINT salario_mensual También podemos ver el contenido de las variables bind usadas dentro de un bloque PL/SQL.

puede ser un literal.A. DECLARACIO DE VARIABLES E PL/SQL Es necesario declarar todos los identificadores en la sección declarativa antes de referenciar estos en cualquier bloque PL/SQL. Sintaxis: identificador [CO STA T] tipo_dato [ OT ULL] [:= | DEFAULT expresión]. otra variable o una expresión que involucra operadores y funciones En la declaración debe considerar lo siguiente: Los nombres de variables deben obedecer las mismas reglas que los objetos SQL Es recomendable usar ciertos estándares en los nombres para mayor facilidad de comprensión y mantenimiento del código. o usando la palabra reservada DEFAULT. compuesto. si no hay asignación inicial el valor será NULL hasta que se realice la primera asignación Lenguaje Procedimental PL/SQL/ 20 . se pueden asignar valores iniciales a las variables durante la declaración. las variables que poseen esta cláusula deben ser inicializadas expresión: es cualquier expresión PL/SQL valida. referencia o LOB NOT NULL: indica que la variable no puede contener un valor nulo.GEDICA TRAINING & CONSULTING C. escalar. Donde: identificador: es el nombre de la variable CONSTANT: restringe la variable al único valor de inicialización. no puede ser cambiado tipo_dato: es un tipo de dato valido. Observe que en este ejemplo no se hace uso de ninguna variable host. por ejemplo v_nombre indicara el nombre de una variable y c_nombre indicara el nombre de una constante Se puede inicializar la variable usando el operador de asignación. cada variable debe estar en una línea de declaración separada.

DATE :='17-JAN-94'.2). DATE NOT NULL. El primer carácter debe ser una letra.GEDICA TRAINING & CONSULTING C. Dos objetos pueden tener el mismo nombre. NUMBER(8. el manejador asumirá que se está consultando la columna y puede generar errores Los identificadores no deben tener más de 30 caracteres. solo puede usarse en un bloque el objeto que esta definido en él No se debe asignar nombres de variables con el mismo nombre de una columna referenciada en el bloque. Ejemplos de variable tipo DATE: DECLARE NACIMIENTO FUNDACION NACIMIENTO DATE. CHAR(14) NOT NULL := 'ADMINISTRACIÓN'. CHAR.141592. si están definidos en bloques distintos.4) := 3. los restantes caracteres pueden ser letras.A. Lenguaje Procedimental PL/SQL/ 21 .2) := 0. cuando esto sucede al referenciar el nombre de la variable. NUMBER(8. números o caracteres especiales A continuación se muestran algunos ejemplos de declaración de variables: Ejemplos de variable tipo UMBER: DECLARE EDAD SUELDO SUELDO PI NUMBER(2). CONSTANT NUMBER(5. cuando esto sucede. Ejemplos de variable tipo CHAR: DECLARE NOMBRE DEPARTAMENTO LETRAINICIAL CHAR(20).

Lenguaje Procedimental PL/SQL/ 22 . BOOLEAN NOT NULL := TRUE. BOOLEAN := NULL.GEDICA TRAINING & CONSULTING C. Ejemplos de variable tipo BOOLEA : DECLARE DISPONIBLE DISPONIBLE DISPONIBLE BOOLEAN.A.

Una variable previamente declarada A continuación se muestra un ejemplo de este tipo de declaración: TRABAJADOR EMPLEADO. %TYPE: Este atributo es utilizado para declarar una variable del mismo tipo como: . Sintaxis : TYPE nombre_tipo IS RECORD nombre_campo tipo_campo [ OT ULL] := expresión _pl/sql Lenguaje Procedimental PL/SQL/ 23 . vistas y columnas).GEDICA TRAINING & CONSULTING C. el identificador TRABAJADOR será del mismo tipo que la columna NOMBRE de la tabla EMPLEADO. En la declaración anterior. En este ejemplo. A continuación se muestra un ejemplo: FILA_EMP EMPLEADO%ROWTYPE. la estructura del identificador FILA_EMP será idéntica a la de la fila en la tabla EMPLEADO.A. Variables tipo RECORD Se utilizan para declarar registros con campos especificados por el usuario. VARIABLES TIPO ATRIBUTO E PL/SQL Los objetos de PL/SQL (variables y constantes) y las operaciones efectuadas sobre los objetos de la base de datos (tablas. pueden ser asociados con los siguientes atributos: %ROWTYPE : Este atributo es utilizado para declarar una variable con la estructura idéntica a la de una fila en una tabla o vista.Una columna de una tabla o vista .NOMBRE%TYPE.

. VARCHAR2(10)..A. Variables tipo TABLE Se tiene un nuevo tipo de dato el cual permite ser usado como un arreglo.GEDICA TRAINING & CONSULTING C. VARCHAR2(14).. A continuación se muestra un ejemplo de una declaración de variable de tipo RECORD: DECLARE TYPE emprectyp IS RECORD (empno NUMBER(4) NOT NULL. A continuación se muestra la sintaxis para declarar variables de tipo table. ename job . Lenguaje Procedimental PL/SQL/ 24 . define la variable reg_emp como de tipo registro con la estructura definida en la declaración anterior. deptno NUMBER (4)). NUMBER(2) := 0. emp_rec emprectyp. pueden ser inicializados en la declaración DECLARE TYPE timetyp IS RECORD (second minute hour NUMBER(2) :=0. La siguiente declaración... NUMBER(2) := 0). Los campos de un registro. es el tipo TABLE.

se muestra la forma de insertar en la tabla EMPLEADO los valores del vector filas pasado como parámetro al procedimiento insertar_datos_emp Lenguaje Procedimental PL/SQL/ 25 . En el siguiente ejemplo. se debe utilizar la posición del elemento que se desea manipular o consultar. Para referenciar sus valores.GEDICA TRAINING & CONSULTING C. Al declarar una variable de PL/SQL como de tipo TABLE se deben tener en cuenta las siguientes consideraciones: No puede ser inicializada en la declaración Puede ser pasada como parámetro de procedimientos No pueden ser utilizadas en una cláusula INTO. De la misma manera que cuando se referencian posiciones de un arreglo o vector. DECLARE TYPE enametabty IS TABLE OF emp. TYPE nombre_tipo IS TABLE OF columna_tipo/nombre_tabla.A.ename%TYPE INDEX BY BINARY_INTEGER.nombre_columna%TYPE [ OT ULL] I DEX BY BINARY_INTEGER A continuación se muestra un ejemplo de una declaración de variable tipo TABLE: DECLARE TYPE enametabtyp IS TABLE OF CHAR(10) INDEX BY BINARY_INTEGER.

ename_tab(i). PROCEDURE insertar_datos_emp (filas BINARY_INTEGER. empno_tab empnotabtyp. terminando con punto y coma (.GEDICA TRAINING & CONSULTING C.. el promedio de 5. END. ename_tab enametabtyp) IS BEGIN FOR i IN 1 .. INTO EMPLEADO (EMPNO. Sintaxis: identificador := expresión. un literal o una llamada a función. pero no una columna de base de datos Ejemplo 1: Asignar a la variable PROMEDIO... 10 y 30 Lenguaje Procedimental PL/SQL/ 26 .). deberá escribir una sentencia PL/SQL. a continuación el operador de asignación (:=) y seguidamente el valor o la expresión cuyo resultado se almacenara en la variable. . NOMBRE. En el lado izquierdo estará el nombre de la variable ya declarada. ASIG A DO VALORES A VARIABLES Para asignar un valor a una variable.) (empno_tab(i).A. . Donde: identificador: es el nombre de la variable expresión: puede ser una variable.). filas LOOP INSERT VALUES END LOOP..

GEDICA TRAINING & CONSULTING C.A.

Ejemplo 2: Almacenar en la variable SALARIOMENSUAL el salario del empleado PABLO

SELECT SALARIO I TO SALARIOMENSUAL FROM EMPLEADO WHERE NOMBRE = 'PABLO';

Evaluando Condiciones con el Valor ULL Se puede determinar una condición de NULL con el operador IS NULL Cualquier expresión aritmética que contenga un valor NULL el resultado será NULL El valor NULL en las operaciones de concatenación se tratara como un string vacío

Lenguaje Procedimental PL/SQL/ 27

GEDICA TRAINING & CONSULTING C.A.

BLOQUES I TER OS Y ALCA CE DE VARIABLES
En los bloques PL/SQL una variable declarada en la sección de declaraciones, solo es visible dentro de ese bloque. Un bloque que sea declarado a su vez dentro de otro (bloque interno) puede acceder a las variables que fueron declaradas en el bloque principal que lo contiene y manipular el contenido de estas variables, además de las variables que sean declaradas en su propia sección de declaración. Sin embargo, las variables declaradas en el bloque interno no pueden visualizarse en el bloque externo.

El siguiente cuadro muestra un ejemplo del ámbito de visualización de las variables en un bloque interno:

… DECLARE X BINARY_INTEGER; BEGIN -- Instrucciones X := X + 1; DECLARE Y NUMBER; de X BEGIN … Y := Y + X; … END; … END; En el ejemplo anterior observe que en bloque interno tanto la variable X, que fue declarada en el bloque externo, como la variable Y propia del bloque, son visibles en tanto que en el bloque Alcance de Y

Alcance

Lenguaje Procedimental PL/SQL/ 28

GEDICA TRAINING & CONSULTING C.A.

externo solo es visible la variable X. Esto se debe a que una variable declarada en un bloque, tiene vida solo mientras el bloque se ejecuta, y desaparece al terminar la ejecución de ese bloque.

Alcance
El alcance de un identificador es la zona de una unidad de programa, sea esta un bloque, subprograma o paquete desde donde puede ser referenciado ese identificador.

OPERADORES
Los operadores son símbolos reservados de PL/SQL que permiten la comparación de dos o más expresiones para permitir la obtención de un resultado BOOLEANO. Se conocen varios tipos de operadores, a continuación se muestran los operadores que maneja PL/SQL:

OPERADORES UMERICOS
Operador < > = != ó <> <= >= Significado menor que mayor que igual a diferente de menor o igual a mayor o igual a

OPERADORES LOGICOS O BOOLEA OS
Operador AND Significado Y

Lenguaje Procedimental PL/SQL/ 29

los valores posibles de la comparación para cada tipo de operador se muestran a continuación: Para el operador A D TRUE TRUE FALSE NULL TRUE FALSE NULL FALSE FALSE FALSE FALSE NULL NULL FALSE NULL Para el operador OR TRUE TRUE FALSE NULL TRUE TRUE TRUE FALSE TRUE FALSE NULL NULL TRUE FALSE NULL Para el operador OT TRUE FALSE FALSE TRUE NULL NULL Lenguaje Procedimental PL/SQL/ 30 . Dependiendo de los valores de las dos expresiones que en un momento dado se estén comparando. o en su defecto puede ser NULL o vacío.A.GEDICA TRAINING & CONSULTING C. OR NOT O Negación Los operadores lógicos poseen un valor de verdad que puede ser TRUE o FALSE.

que muestre el costo final de un producto. Lenguaje Procedimental PL/SQL/ 31 . Desarrollar un bloque de programa simple.A. utilice los métodos vistos. Declarar una tabla PL/SQL denominada estudiante con los campos nombre.GEDICA TRAINING & CONSULTING C. PRACTICA 1 1. edad y sexo. El programa deberá mostrar un mensaje indicando que la misma esta vacío. 2. al aplicar el Iva de 15% al precio solicitado como entrada.

GEDICA TRAINING & CONSULTING C. Capítulo 2 PL/SQL FU CIO ES E Lenguaje Procedimental PL/SQL/ 32 .A.

LTRIM. MONTHS_BETWEEN. ROUND. pueden ser utilizadas como parte de una instrucción PL/SQL que no involucra cláusulas de SQL.GEDICA TRAINING & CONSULTING C. TRUNC. INITCAP. SUM I TERACTUA DO CO EL ORACLE SERVER El lenguaje de programación PL/SQL soporta totalmente las sentencias del lenguaje de manipulación de datos de SQL. TO_DATE AVG. SUBSTR Fecha y Hora De Grupo ADD_MONTHS. UPDATE de actualización de datos. POWER. LAST_DAY. desde el lugar en que se encuentra hasta el punto donde se definió el savepoint. La tabla siguiente muestra algunas de las funciones que pueden utilizarse clasificadas por tipo: Tipo de función Numéricas Carácter Funciones pertenecientes al tipo SQRT. Lenguaje Procedimental PL/SQL/ 33 . FU CIO ES E PL/SQL El lenguaje de programación PL/SQL soporta todas las funciones provistas por SQL. para guardar de forma permanente los datos en la base de datos.A. COUNT. UPPER. También soporta las instrucciones que permiten el control de transacciones y el resguardo de la integridad en la base de datos. RPAD. INSERT de inserción de datos y DELETE de eliminación de datos. y LOCK TABLE para el bloqueo de tablas durante las modificaciones críticas de datos. TO_NUMBER LENGTH. LOWER. MAX. Esto significa que puede soportar las instrucciones: SELECT de recuperación de datos. SAVEPOINT para fijar un punto de control que sirve para devolver parcialmente una transacción. como son COMMIT. MIN. TO_CHAR. LPAD. ROLLBACK para anular una transacción que no haya sido guardada previamente con una instrucción commit. Todas las funciones. excepto las de agrupamiento.

ROLLBACK y SAVEPOINT son independientes de los bloques. en caso de no serlo.A. Donde: Lenguaje Procedimental PL/SQL/ 34 . Los identificadores de cada sentencia son primero verificados para comprobar si son columnas de una tabla de la base de datos. con la única variante de que para poder manipular el resultado mediante instrucciones PL/SQL se necesitan variables de almacenamiento propias de PL/SQL. sin embargo pueden usarse dentro de cualquier bloque PL/SQL no soporta instrucciones de definición de datos. tales como CREATE. tales como GRANT y REVOKE RECUPERA DO DATOS – La cláusula SELECT Al igual que en SQL. Las sentencias COMMIT. Sintaxis: SELECT lista_de_columnas I TO {lista_de_variables | nombre_registro} FROM WHERE tabla condición. puesto que las columnas no se pueden manipular directamente. DROP o ALTER PL/SQL no soporta instrucciones de control de lenguaje.GEDICA TRAINING & CONSULTING C. el manejador asumirá que es un identificador de PL/SQL. COMPARACIO DE I STRUCCIO ES SQL y PL/SQL Un bloque PL/SQL no es una unidad de transacción. para recuperar datos de la base de datos se hace uso de la cláusula SELECT.

igual sucede cuando la consulta no retorna ninguna fila. SELECT deptno. debe aparecer entre las opciones SELECT y FROM. con las columnas que se recuperan en la consulta nombre_registro: es el bloque PL/SQL que recibirá los valores Tabla : indica la o las tablas desde las cuales se hace la consulta condición: es la condición de búsqueda. expresiones. La consulta debe retorna una y solo una fila. En el siguiente ejemplo se muestra un ejemplo del uso de la cláusula INTO: DECLARE v_deptno v_loc BEGIN NUMBER(2). VARCHAR2(15). Lenguaje Procedimental PL/SQL/ 35 . lista_de_columnas: es la lista de una o más columnas que se recuperan en la consulta. constantes y operadores de comparación. puede contener nombres de columnas. deben coincidir tanto en posición como en tipo de dato y número.GEDICA TRAINING & CONSULTING C. En PL/SQL los errores pueden capturarse y tratarse de manera diferente para que el programa no se detenga de manera abrupta. Se utiliza para especificar las variables que almacenaran los valores de las columnas que retornara la consulta. a este proceso se le llama manejo de excepciones y será explicado en capítulos posteriores. incluyendo variables PL/SQL La cláusula INTO es obligatoria. loc INTO FROM v_deptno. funciones de fila o funciones de grupo lista_de_variables: es una lista de variables escalares. si retorna mas de una generara un error.A. END. v_loc dept WHERE dname = ‘VENTAS’. puede contener expresiones SQL.

EMPLEADO CHAR(25) := 'MONICA'.50.2) := 5000. INTO EMPLEADO (NOMBRE. CARGO. SUELDO). BEGIN INSERT SALARIO) VALUES (EMPLEADO. A continuación se muestra un ejemplo de la inserción de datos desde un bloque PL/SQL: DECLARE SUELDO NUMBER(6.GEDICA TRAINING & CONSULTING C.2) := 5000. END.50. I SERTA DO DATOS – La cláusula I SERT La inserción de datos desde PL/SQL cumple las mismas especificaciones de la inserción hecha desde SQL. EMPLEADO CHAR(25) := 'MONICA'. 'SECRETARIA'.A. ACTUALIZA DO DATOS – La cláusula UPDATE En el siguiente ejemplo se muestra un caso de una posible inserción desde un bloque PL/SQL: DECLARE SUELDO NUMBER(6. BEGIN Lenguaje Procedimental PL/SQL/ 36 .

END. BEGIN DELETE FROM EMPLEADO WHERE NOMBRE = EMPLEADO AND CODIGO = 1050. UPDATE EMPLEADO SET SALARIO = SALARIO * 1. Una transacción comienza con la primera instrucción SQL que Lenguaje Procedimental PL/SQL/ 37 .GEDICA TRAINING & CONSULTING C. END.A. Esto permite que el usuario pueda controlar totalmente los cambios que se efectúan en la base de datos. la eliminación de datos desde un bloque PL/SQL es idéntica a la eliminación de datos hecha desde SQL. guardando algunos grupos de datos y descartando otros si la situación así lo requiere.5 WHERE EMPNO = 500. tomando como transacción el mismo criterio que en SQL. A continuación se muestra un ejemplo: DECLARE EMPLEADO EMPLEADO. CO TROL DE TRA SACCIO ES El lenguaje PL/SQL permite un control total de la lógica de las transacciones. BORRA DO DATOS – La cláusula DELETE Igual que en las operaciones anteriores. COMMIT.NOMBRE%TYPE := 'MONICA'.

Para marcar un punto intermedio en el procesamiento de la transacción se utiliza el comando SAVEPOINT.2) := 5000. Sintaxis : Donde: SAVEPOINT punto_intermedio. por una instrucción dentro de un bloque PL/SQL o de manera implícita. por ejemplo la culminación de una sesión SQL*Plus termina automáticamente la transacción pendiente. 'SECRETARIA'. (EMPLEADO. punto_intermedio: es el nombre de punto de control hasta donde se reversará la transacción en caso de usar una sentencia ROLLBACK. CARGO. SAVEPOINT A.50. Los comandos de control de transacciones son completamente soportados por PL/SQL. sin embargo algunas instalaciones pueden imponer algunas restricciones al uso de estos. EMPLEADO CHAR(25) := 'MONICA'. el final de una transacción puede ocurrir de manera explícita. por algún evento en el entorno de SQL donde se está ejecutando el bloque de instrucciones. A continuación se muestra un ejemplo de la aplicación de las cláusulas de control de transacciones: DECLARE SUELDO NUMBER(6. INTO EMPLEADO (NOMBRE.A. BEGIN INSERT SALARIO) VALUES SUELDO).GEDICA TRAINING & CONSULTING C. Lenguaje Procedimental PL/SQL/ 38 . se ejecuta y finaliza con el próximo COMMIT o ROLLBACK exitoso.

SAVEPOINT B. END. DELETE FROM EMPLEADO WHERE NOMBRE = 'LUIS' AND CODIGO = 2350. ROLLBACK TO SAVEPOINT B. COMMIT.A. / Lenguaje Procedimental PL/SQL/ 39 . UPDATE EMPLEADO SET SALARIO = SUELDO WHERE NOMBRE = EMPLEADO OR NUMDEPT = 01.GEDICA TRAINING & CONSULTING C.

Crear un bloque PL/SQL que muestre por pantalla cuantos registros tiene la tabla Empleados. 2. 3. PRACTICA 2 1. Crear un bloque PL/SQL que inserte una fila a la tabla empleados. 4. Crear un bloque PL/SQL que actualice el nombre del registro insertado en el ejercicio anterior.A.GEDICA TRAINING & CONSULTING C. Crear un bloque PL/SQL que elimine el registro insertado en el ejercicio anterior Lenguaje Procedimental PL/SQL/ 40 . Todos los datos debe ser solicitados por pantalla.

Capítulo 3 ESTRUCTURAS DE CO TROL Lenguaje Procedimental PL/SQL/ 41 .GEDICA TRAINING & CONSULTING C.A.

• Cuando se realiza un cálculo (suma. se debe tomar en cuenta lo siguiente: • Cuando se realiza una comparación entre un valor NO NULO y un valor NULO. etc. CO DICIO ALES El condicional es una sentencia que controla la ejecución de sus bloques de instrucciones dependiendo del valor de verdad que retorna una o más comparaciones que gobiernan a la instrucción. resta.) de un valor NO NULO y un valor NULO el resultado siempre será NULO. el resultado siempre será NULO.GEDICA TRAINING & CONSULTING C. ESTRUCTURAS DE CO TROL DE PL/SQL En PL/SQL se puede controlar el flujo de control de las operaciones mediante el uso de dos tipos de estructuras de control básicas: CONDICIONALES con la sentencia IF e ITERACIONES con la sentencia LOOP. En PL/SQL el resultado de una comparación puede arrojar como resultado: TRUE. FALSE o NULL. Lenguaje Procedimental PL/SQL/ 42 . Cuando es posible la aparición de un valor NULL. exceptuando la concatenación. 'ANA' || NULL || 'LISIS' ------> el resultado será ANALISIS.A. A continuación se muestran algunos ejemplos: 10 + NULL --------------------> el resultado será NULO.

A. . en este caso cada una gobernará la ejecución de un grupo de instrucciones y todas las condiciones deben ser excluyentes entre sí. no se ejecutan. . Ejemplo de IF: Construya un programa que permita obtener como parámetro de entrada desde teclado un código de empleado. . . . buscará el salario del mismo y aumentar el sueldo según la tabla siguiente: Lenguaje Procedimental PL/SQL/ 43 . . sentencias o grupo de sentencias: son el conjunto de instrucciones que formarán el algoritmo que se ejecutará cuando la condición se cumpla. . Sintaxis: IF condición THE sentencia o grupo de sentencias [ELSIF condición THE sentencia o grupo de sentencias] . Si la condición es verdadera las sentencias asociadas al IF se ejecutan. La sentencia IF Permite la ejecución de una o varias sentencias dependiendo de que el valor de verdad que retorna una condición resulte verdadero. . (grupo de ELSIF) . . . [ELSE sentencia o grupo de sentencias por defecto] END IF. el parámetro que permitirá la ejecución o no de las instrucciones que están dentro del IF. En la instrucción condicional puede haber una o más condiciones en la misma instrucción. . . .GEDICA TRAINING & CONSULTING C. . . Donde: condición: es como su nombre lo indica. . . . . . . en el caso contrario (FALSE o NULL). .

000 4.000 y <= 5.000 > 20.A. / (SUELDO > 20000) AND (SUELDO < 30000) OTA: El ampersand (&) es usado en los bloques de PL/SQL. IF (SUELDO => 10000) AND (SUELDO <= 20000) THEN UPDATE EMPLEADO SET SALARIO = SUELDO + 5000. código es igual a &IDENTIFICA.000 a 20. Rango de sueldos Monto aumento de De 10.000 30. para facilitar el ingreso de parámetros. WHERE CODIGO = &IDENTIFICA. Los parámetros serán recibidos e interpretados al momento de la ejecución del bloque. Lenguaje Procedimental PL/SQL/ 44 .GEDICA TRAINING & CONSULTING C. END IF.000 DECLARE SUELDO NUMBER. WHERE CODIGO = &IDENTIFICA. BEGIN SELECT SALARIO INTO SUELDO FROM EMPLEADO WHERE CODIGO = &IDENTIFICA. ELSIF THEN UPDATE EMPLEADO SET SALARIO = SUELDO + 4000. (cuando se trabaja con SQL*PLUS). COMMIT. Como se puede observar en el ejemplo anterior. donde &IDENTIFICA va a ser sustituido por el valor introducido por el usuario al momento de ejecutar el bloque de PL/SQL. END.

GEDICA TRAINING & CONSULTING C. Existen dos formas de realizar una iteración: Por medio de bucles Por medio de la sentencia GOTO Existen cuatro tipos de bucles: Bucle simple Bucle numérico (FOR) Bucle condicional (WHILE) BUCLE SIMPLE Repite una o más sentencias múltiples veces. que permite la finalización del ciclo. Sintaxis: LOOP sentencia o grupo de sentencias condición de salida del bucle E D LOOP. múltiples veces hasta que se cumpla una condición. Donde: LOOP: indica el inicio del bucle sentencia o grupo de sentencias: conjunto de instrucciones a ejecutar condición: requisito de salida del bucle. ITERACIO ES Una iteración es la ejecución repetida de un conjunto de instrucciones. La condición de salida posee la siguiente estructura: EXIT [nombre_de_etiqueta] [WHE condición]. Lenguaje Procedimental PL/SQL/ 45 . Si a un bucle no se le coloca una condición de salida.A. este permanecerá ejecutándose indefinidamente.

pero no podrá asignársele valor Lenguaje Procedimental PL/SQL/ 46 . sino también de uno más externo a este. el cual podrá ser referenciado dentro del bucle. CONTADOR := CONTADOR + 1. Donde: índice: es la variable de conteo y control del bucle. Esta variable es implícitamente de tipo numérico. no solamente del bucle en curso.A. . A continuación se muestra un ejemplo de bucle simple: Ejemplo 2: Construya un programa que permita insertar en una tabla temporal diez veces la cadena de caracteres “HOLA”: DECLARE CONTADOR NUMBER(3) := 0. / BUCLE UMÉRICO (FOR) Repite una o más sentencias un número fijo de veces. entero_2 LOOP sentencia o grupo de sentencias E D LOOP. TEXTO) VALUES (CONTADOR. END. El "nombre_de_etiqueta" se utiliza cuando se desea salir. Sintaxis: FOR índice I [ REVERSE ] entero_1 . BEGIN LOOP INSERT INTO TEMPORAL (NUMERO1.GEDICA TRAINING & CONSULTING C. 'HOLA'). END LOOP. EXIT WHEN CONTADOR = 10.

END LOOP. REVERSE: realiza el conteo de mayor a menor. TEXTO) VALUES (I. BEGIN Lenguaje Procedimental PL/SQL/ 47 .10 LOOP INSERT INTO TEMPORAL (NUMERO1. Ejemplo 3: Elabore el mismo programa del ejemplo2. 'HOLA').A. (si no se coloca este parámetro el conteo se realizará de menor a mayor). usando el bucle while: DECLARE CONTADOR NUMBER(3) := 0. / BUCLE CO DICIO AL (WHILE) Repite una o más sentencias mientras la condición de control de la iteración sea verdadera Sintaxis: WHILE condición LOOP sentencia o grupo de sentencias E D LOOP. usando un bucle numérico: BEGIN FOR I IN 1.. Donde: condición: es la condición que gobierna la ejecución Ejemplo 3: Elabore el mismo programa del ejemplo2. END.GEDICA TRAINING & CONSULTING C. entero_1 y entero_2: rango en el que se va a realizar el conteo.

. . . . . TEXTO) VALUES (CONTADOR. . . . . . . . La etiqueta debe ir encerrada entre dobles símbolos de “menor que” y “mayor que” Sintaxis: . GOTO ETIQUETA sentencia o grupo de sentencias <<ETIQUETA>> sentencia o grupo de sentencias . . . . como en otros lenguajes de programación. CONTADOR := CONTADOR + 1. . . . . .Se cierra una secuencia de sentencias No está permitido utilizar la sentencia GOTO: . END. . / SE TE CIA GOTO La sentencia GOTO. . permite saltar incondicionalmente hacia una línea específica de un bloque PL/SQL identificada mediante una etiqueta. END LOOP. . . ‘HOLA’). pudiendo así alterar la secuencia normal de la ejecución del programa.Para ir a una etiqueta que se encuentre dentro de un bucle o estructura condicional. .GEDICA TRAINING & CONSULTING C. .A. Está permitido el uso de la sentencia GOTO cuando: .Se ejecute dentro de una misma secuencia de instrucciones . . . Lenguaje Procedimental PL/SQL/ 48 . . WHILE CONTADOR < 10 LOOP INSERT INTO TEMPORAL (NUMERO2. .

En el siguiente ejemplo se muestra el uso de las etiquetas para referenciar bloques: BEGIN <<BLOQUEEXTERNO>> DECLARE N NUMBER. BEGIN N := 5.GEDICA TRAINING & CONSULTING C. X. Las etiquetas tienen que ser especificadas previa a sentencias ejecutables. NUMBER := 10. que de otra manera no podrían ser visibles a causa de las reglas de alcance. CHAR(10) := 'DOS'. <<BLOQUEINTERNO>> DECLARE X N BEGIN INSERT INTO TEMPORAL VALUES (BLOQUEEXTERNO.A. N).N. Sintaxis : <<Nombre_etiqueta>> DECLARE declaraciones BEGIN sentencias a ejecutar [EXCEPTION excepciones manejadas en el bloque] E D Nombre_etiqueta. ETIQUETAS Las etiquetas se pueden usar para referenciar valores en bloques y bucles. Lenguaje Procedimental PL/SQL/ 49 .

referenciado por la etiqueta. que el valor "N" que deberá ser procesado. COMMIT. / NUMBER := 10. Lenguaje Procedimental PL/SQL/ 50 . END. END LOOP ETIQUETA.A.I.10 LOOP -. En el siguiente ejemplo se muestra el uso de las etiquetas para referenciar bucles: BEGIN <<ETIQUETA>> FOR I IN 1. END BLOQUEINTERNO. En el ejemplo anterior. 'COMPLETO').sentencias a ejecutar DECLARE I BEGIN INSERT INTO TEMPORAL VALUES (I. / En el ejemplo anterior. END BLOQUEEXTERNO.. ETIQUETA. se está utilizando el nombre del bloque para decirle a PL/SQL. al momento de realizar la inserción. es el que se declaró en el bloque externo y no el que se declaró en el bloque interno. END.GEDICA TRAINING & CONSULTING C. se toma el valor "I" del bloque interno y el valor "I" del bucle FOR. END.

en caso de ser correcto.A. sin embargo el programador puede declarar explícitamente cursores para el tratamiento secuencial de filas de datos. el manejador Oracle Server abre un área en memoria en la cual el comando es interpretado y. Hay cuatro atributos asociados a los cursores que nos permiten controlar y verificar el resultado de su ejecución. estos atributos son: SQL%ROWCOUNT Retorna el número de filas que fueron afectadas por la mas reciente instrucción de SQL. Se puede utilizar estos atributos en la sección de excepciones de un bloque para conocer el resultado de la ejecución de una instrucción de manipulación de datos y tomar las acciones necesarias como emitir mensajes de número de registros afectados. A esta área de memoria se le llama CURSOR. CURSORES CURSORES en SQL Cuando se manda a ejecutar una instrucción SQL. Lenguaje Procedimental PL/SQL/ 51 . PL/SQL crea un cursor implícito que posee el identificador de SQL. Cuando comienza la ejecución de la instrucción. es un valor entero SQL%FOUND Valor lógico BOOLEANO que retorna VERDADERO si la más reciente instrucción SQL afectó una o más filas de datos SQL%NOTFOUND Valor BOOLEANO que retorna FALSO si la mas reciente instrucción SQL no afectó ninguna fila de datos SQL%HISOPEEN Siempre evalúa en FALSO debido a que PL/SQL cierra implícitamente los cursores inmediatamente después que son ejecutados Los atributos de cursores permiten evaluar que pasó en el último cursor implícito utilizado. la forma de hacer esto se explicará en secciones subsiguientes.GEDICA TRAINING & CONSULTING C. el comando es ejecutado. estos atributos pueden utilizarse en instrucciones PL/SQL pero no pueden ser utilizados en instrucciones SQL. PL/SQL maneja este cursor automáticamente.

estas son SELECT. BEGIN DELETE FROM item WHERE num_orden = v_orden. existen dos tipos de cursores: CURSORES IMPLÍCITOS Creados y controlados totalmente por el manejador. Los cursores creados explícitamente. :filas_borradas := ‘ Se eliminaron : ‘|| to_char(SQL%ROWCOUNT)|| ‘ filas’. Lenguaje Procedimental PL/SQL/ 52 . / PRINT filas_borradas Los cursores como se indicó anteriormente son áreas de memoria que contienen filas de datos de una sentencia SQL durante la ejecución. INSERT. se crean utilizando la sentencia SELECT para leer múltiples registros y dejarlos en un área de memoria identificada con el nombre del cursor. Se crean cursores implícitos al ejecutar cualquier sentencia de manipulación de datos. El siguiente ejemplo muestra un uso posible de los atributos de cursores: VARIABLE filas_borradas VARCHAR2(20) DECLARE v_orden NUMBER := 605. Usando el identificador del cursor los registros pueden ser recuperados y procesados secuencialmente.GEDICA TRAINING & CONSULTING C.A. UPDATE y DELETE Cursores explícitos Creados y manejados totalmente por el programador. END.

variable2. para esto se utiliza la cláusula FETCH. DIFERE CIAS E TRE CURSORES EXPLÍCITOS E IMPLÍCITOS Cursor explícito Requieren ser declarados Requieren ser abiertos y cerrados Cursor implícito No requieren ser declarados El cursor se abre y se cierra automáticamente CURSORES E PL/SQL Los cursores en PL/SQL son cursores explícitos. La primera columna obtenida será asignada a la variable1. . la segunda Lenguaje Procedimental PL/SQL/ 53 ..A. para crear y manipular este tipo de cursores se deben tener en cuenta varios aspectos. Para poder utilizar correctamente un cursor explícito. Esta cláusula permite la recuperación de los registros uno a uno en secuencia FETCH nombre_del_cursor I TO variable1. debe seguir los siguientes pasos: Paso 1: Declarar el cursor Paso 2: Abrir el cursor. En este caso la cláusula INTO funciona igual que cuando se utiliza para recuperar datos en cualquier instrucción de SQL. tomando en cuenta que el control de estos es responsabilidad del programador: Sintaxis: DECLARE CURSOR nombre_del_cursor IS sentencia select. para ello se utiliza la instrucción OPEN seguida del nombre del cursor OPEN nombre_del_cursor Paso 3: Recuperar los datos en secuencia.GEDICA TRAINING & CONSULTING C..

BEGIN OPEN MICURSOR. El orden de estas columnas está fijado por la sentencia SELECT. a la variable2. al momento de la creación del cursor.GEDICA TRAINING & CONSULTING C.Declaración del cursor Paso 1 SELECT NOMBRE. CLOSE MICURSOR. El siguiente ejemplo muestra la declaración y utilización de un cursor explícito llamado MICURSOR.Cierre del cursor COMMIT.NOMBRE%TYPE. MISALARIO EMPLEADO.A. CURSOR MICURSOR IS -. para ello se utiliza la cláusula CLOSE seguida del nombre del cursor CLOSE nombre_de_cursor.SALARIO%TYPE. SALARIO FROM EMPLEADO WHERE SALARIO > SALARIOLIMITE. MISALARIO. INSERT INTO TABLANUEVA VALUES (MINOMBRE. / Lenguaje Procedimental PL/SQL/ 54 . y así sucesivamente. -.Recuperación de los datos Paso 3 FETCH MICURSOR INTO MINOMBRE. MISALARIO). MINOMBRE EMPLEADO.000. EXIT WHEN MICURSOR%NOTFOUND. e insertar estos en otra tabla llamada TABLANUEVA DECLARE SALARIOLIMITE NUMBER(4) := 12000. END. Paso 4: Cerrar el cursor.Apertura del cursor Paso 2 LOOP -. END LOOP. -. Ejemplo 3: Elabore un programa que permita obtener el nombre y el salario de todos aquellos empleados que ganan mas de $12.

BUCLES FOR DE TIPO CURSOR También se puede utilizar la instrucción FOR para declarar y utilizar un cursor sin que se tenga que utilizar explícitamente las instrucciones de APERTURA.GEDICA TRAINING & CONSULTING C. Lenguaje Procedimental PL/SQL/ 55 . sino que la misma estructura se encarga de estas operaciones al momento de su ejecución.. ATRIBUTOS DE CURSORES EXPLICITOS Atributo %ISOPEN %NOTFOUND Tipo Booleano Booleano Descripción Evalúa TRUE si el cursor está abierto Evalúa TRUE si el FETCH mas reciente no retornó ninguna fila Evalúa TRUE si el FETCH mas reciente retornó una fila Contiene el total de filas recuperadas por el cursor %FOUND Booleano %ROWCOUNT Numérico CURSORES Y REGISTROS Es posible manejar la recuperación de las filas de datos de un cursor usando un registro PL/SQL como variable de salida.. Ejemplo: DECLARE CURSOR empleados IS SELECT empno. RECUPERACION DE DATOS ni CIERRE del cursor.A. FETCH empleados I TO reg_empleado. . reg_empleado empleados%ROWTYPE. nombre FROM empleado.

000. implícitamente se abre el cursor (OPE ). ombre_del_registro. CURSOR MICURSOR IS SELECT NOMBRE. Donde: Nombre del registro: contendrá cada fila de datos que sea recuperada. en este ejemplo FILACURSOR es el registro de datos del cursor MICURSOR DECLARE SALARIOLIMITE NUMBER(5) := 12. A continuación se muestra el mismo ejemplo XX para ilustrar el manejo de un cursor utilizando el bucle FOR.2) := 0. BEGIN FOR FILACURSOR IN MICURSOR LOOP Lenguaje Procedimental PL/SQL/ 56 .A. implícitamente el cursor es cerrado (CLOSE). Cuando no hay más filas que satisfagan la búsqueda.GEDICA TRAINING & CONSULTING C. SALARIO FROM EMPLEADO WHERE SALARIO > SALARIOLIMITE. TOTALSALARIO NUMBER(9. ombre_de_la_columna El funcionamiento de un bucle FOR de tipo cursor es el siguiente: Cuando el cursor de bucle es ejecutado. Cuando una fila satisface la consulta o query asociado al cursor. Sintaxis : FOR nombre_del_registro I nombre_del_cursor LOOP sentencias que serán ejecutadas para cada fila retornada END LOOP. las columnas de datos en el registro se pueden referenciar utilizando el nombre del registro seguido del nombre o alias de la columna separados por un punto. implícitamente se ejecuta una búsqueda (FETCH).

SALARIO%TYPE. / + REAPERTURA DE U CURSOR Esta técnica se utiliza para reabrir un cursor con otros valores de inicialización. BONOTOTAL := BONOTOTAL + BONOAUMENTO.NOMBRE. pero con un nuevo -.valor de SALARIOMIN OPEN BONO. TOTALSALARIO := TOTALSALARIO FILACURSOR.2) := 0. FILACURSOR.SALARIO). CURSOR BONO IS SELECT SALARIO * . SALARIOMIN := SALARIOMIN + 500.A.Reapertura del cursor. El siguiente ejemplo muestra la reapertura de un cursor con un nuevo valor de la variable SALARIOMIN DECLARE BONOTOTAL NUMBER(8. COMMIT. IF BONOTOTAL > 2000 THEN CLOSE BONO. -.GEDICA TRAINING & CONSULTING C.SALARIO%TYPE 1000. EXIT WHEN BONO%NOTFOUND. SALARIOMIN EMPLEADO. BEGIN OPEN BONO.SALARIO.10 FROM EMPLEADO WHERE SALARIO > SALARIOMIN. END. INSERT INTO TABLANUEVA VALUES (FILACURSOR. END LOOP. LOOP FETCH BONO INTO BONOAUMENTO. Lenguaje Procedimental PL/SQL/ 57 . := BONOAUMENTO EMPLEADO. BONOTOTAL := 0.

con distintos valores que permiten variar la condición de recuperación de los datos. END IF. . . E D. DECLARACIÓ DE U CURSOR CO PARÁMETROS Los cursores pueden parametrizarse de manera que puedan ser abiertos y cerrados en diferentes instantes de tiempo. el cursor MICURSOR es abierto 2 veces. END LOOP. . . . Ejemplo: BEGI FOR reg_empleado I (SELECT empno. . . . END.A. Sintaxis: DECLARE CURSOR nombre_del_cursor [(nombre_del_parámetro tipo_del_parámetro)] IS sentencia_select_realizando_la_consulta. El siguiente ejemplo muestra la utilización de un cursor parametrizado. . .GEDICA TRAINING & CONSULTING C. / CURSOR FOR USADO COMO SUB-QUERIES En este caso no es necesario declarar el cursor. . nombre FROM empleado) LOOP instrucciones. . la primera con sueldo 2000 y la segunda con sueldo 3000 DECLARE CURSOR MICURSOR (SUELDO NUMBER) IS SELECT NOMBRE FROM EMPLEADO Lenguaje Procedimental PL/SQL/ 58 . . . . . E D LOOP.

A. se muestra la utilización del atributo de cursor SQL%NOTFOUND. . . . CURSORES SELECT FOR UPDATE A menudo.0 WHERE NOMBRE = 'JOSE'. . . . . . . NOMBRE. . . BEGIN OPEN MICURSOR (2000). . El método consta de dos partes: la cláusula FOR UPDATE en la declaración del cursos. SALARIO) VALUES (4332. . Se intenta modificar un registro en la tabla EMPLEADO y al no encontrarlo se inserta la información en la tabla. el procesamiento que se lleva a cabo en un bucle de extracción modifica las filas extraídas por el cursor. END IF. . . UPDATE EMPLEADO SET SALARIO = SALARIO*10. 10000). INSERT INTO EMPLEADO(CODIGO. 'JOSÉ'. . . (otras sentencias) . . . . . . . y la cláusula WHERE CURRENT OF en una orden UPDATE o DELETE. .GEDICA TRAINING & CONSULTING C. END. . . / En el siguiente ejemplo. WHERE SALARIO > SUELDO. . . FOR UPDATE Lenguaje Procedimental PL/SQL/ 59 . . . . . . . . . IF SQL%NOTFOUND THEN --Si no existe el empleado se inserta. . PL/SQL proporciona una sintaxis conveniente para estas situaciones. . OPEN MICURSOR (3000). .

por otra sesión. Es la última cláusula de la orden.GEDICA TRAINING & CONSULTING C. de la tabla sobre la que se realiza la consulta. o lista de columnas. Estos bloqueos evitan que otras sesiones cambien las filas del conjunto activo antes de que la transacción se confirme. WHERE CURRE T OF Si se declare el cursor con la cláusula FOR UPDATE. Por ejemplo. puede emplearse la cláusula WHERE CURRENT OF en una orden UPDATE o DELETE. La sintaxis es: SELECT … FROM … FOR UPDATE [OF referencia_columna ] [NOWAIT] Donde referencia_columna es una columna. salario FROM empleado WHERE numdept = 01 FOR UPDATE NOWAIT. se ejecutan bloqueos exclusivos sobre las filas del conjunto activo antes de que termine la ejecución de la orden OPEN del cursor. si las filas están bloqueadas.A. Al estar presente la cláusula FOR UPDATE en la sentencia SELECT . La orden NOWAIT hace que. La cláusula FOR UPDATE es parte de una orden SELECT. DECLARE CURSOR empleados IS SELECT empno. la orden OPEN termina inmediatamente devolviendo el error: ORA-54: resource busy and acquire with NOWAIT specified. La sintaxis de esta cláusula es la siguiente: WHERE CURRENT OF cursor Lenguaje Procedimental PL/SQL/ 60 . después de la cláusula ORDER BY (si existe). con anterioridad. nombre.

GEDICA TRAINING & CONSULTING C. La cláusula WHERE CURRENT OF hace referencia a la fila recién extraída por el cursor. Donde cursor es el nombre de un cursor declarado con una cláusula FOR UPDATE.A. Lenguaje Procedimental PL/SQL/ 61 .

GEDICA TRAINING & CONSULTING C. actualice las comisiones para todos los vendedores 2. 10 1 2 … Lenguaje Procedimental PL/SQL/ 62 . el resultado del programa debe ser como sigue: GRUPO 1 1 1 …. 1 2 2 … NUMERO 1 2 3 …. Elaborar un programa que consulte todos los registros de la tabla VENDEDOR y calcule las comisiones en base al 8% de las ventas. Elabore un programa que llene la tabla GRUPO_NUMERO con diez grupos de números del 1 al 10.A. PRACTICA 3 1.

GEDICA TRAINING & CONSULTING C.A. Capítulo 4 MA EJO DE ERRORES Lenguaje Procedimental PL/SQL/ 63 .

Existen dos tipos de excepciones: Excepciones predefinidas Excepciones definidas por el usuario EXCEPCIO ES PREDEFI IDAS Las excepciones predefinidas son un grupo de errores posibles totalmente reconocidos por el manejador. Cuando ocurre un error. INTO no recupero ninguna fila Error en la conversión de un valor.GEDICA TRAINING & CONSULTING C. La tabla siguiente muestra algunas de las excepciones predefinidas más comunes: Nombre de excepción TOO_MANY_ROWS NO_DATA_FOUND VALUE_ERROR DUP_VAL_ON_INDEX INVALID_CURSOR ZERO_DIVIDE Causa del error La cláusula SELECT. si no existe el manejo de la excepción el manejador suspenderá la ejecución y arrojará un mensaje indicando cual fue la condición que no fue tratada apropiadamente. MA EJO DE ERRORES E PL/SQL Los errores en PL/SQL son llamados excepciones.. Cuando el manejo de la excepción es completado. u ocurrió un error de restricción Existe un valor duplicado en la columna de indexación Especificación de cursor invalida Ocurrió una división por cero Lenguaje Procedimental PL/SQL/ 64 .A.... INTO recuperó más de una fila La cláusula SELECT . el procesamiento del bloque termina. el procesamiento salta a la sección de EXCEPCIONES donde deben estar las instrucciones a ejecutarse en caso de detectarse el error.

WHE OTHERS THE secuencia_de_sentencias. MA EJA DO EXCEPCIO ES Como se indicó anteriormente. Sintaxis: . BEGIN SELECT SALARIO INTO SUELDO FROM EMPLEADO WHERE CODIGO = 2000.'No retorna filas o demasiadas filas retornadas'). WHEN OTHERS: es el conjunto de acciones que se ejecutaran en caso de ocurrir alguna excepción no considerada en las declaraciones que la preceden El siguiente ejemplo ilustra el manejo de la excepción predefinida TOO_MA Y_ROWS y O_DATA_FOU D DECLARE SUELDO NUMBER. . EXCEPTIO WHE nombre_de_la_excepción [OR nombre_de_la_excepción ..GEDICA TRAINING & CONSULTING C. . ] THE instrucciones_de_manejo_de_excepcion. . WHEN: indica que a continuación se indicará el nombre de la excepción. además se especificarán las acciones a tomar cuando ocurra esta condición. . END. . . . / Lenguaje Procedimental PL/SQL/ 65 .. cuando ocurre una excepción el control de la ejecución salta hasta la sección de excepciones.A. EXCEPTION WHEN TOO_MANY_ROWS OR NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20100. Donde: EXCEPTION: indica el comienzo de la sección de manejo de excepciones. . donde estarán las instrucciones de manejo de la condición de error apropiadas. .

DECLARE E_EMPLEADOS EXCEPTION. en lugar de a través de un gestor OTHERS. Este pragma debe incluirse en la sección declarativa.-2292). y número_error_Oracle es el código de error que se desea asociar con esta excepción nominada.NUMDEPT%TYPE = 1. END. V_NUMDEP DEPARTAMENTO. El pragma EXCEPTION_INIT se emplea de la forma siguiente: PRAGMA EXCEPTION_INIT (nombre_excepción. lo que permite interceptar de forma específica dicho error. EXCEPTION WHEN E_EMPLEADOS THEN DBMS_OUTPUT. BEGIN DELETE FROM DEPARTAMENTO WHERE NUMDEPT = V_NUMDEPT. PRAGMA EXCEPTION_INIT(E_EMPLEADOS. COMMIT.PUT_LINE(‘NO SE PUEDE ‘|| ‘BORRAR DEPARTAMENTO|| TO_CHAR(V_NUMDEP)). EL PRAGMA EXCEPTIO _I IT Este pragma permite asociar una excepción nominada con un error ORACLE determinado.GEDICA TRAINING & CONSULTING C.A. Lenguaje Procedimental PL/SQL/ 66 . número_error_Oracle). Donde nombre_excepción es el nombre de una excepción declarada con anterioridad al pragma.

Al activarse la excepción el control va al manejo de la excepción y actualiza la tabla EMPLEADO colocando el salario en 5000. IF SUELDO < 3000 THEN RAISE AUMENTO. La cláusula RAISE se puede utilizar para activar (levantar) una excepción tanto de usuario como predefinida. El siguiente ejemplo ilustra la forma de declarar y activar una excepción de usuario. en este se define la excepción AUMENTO y se activa la misma en caso de que el sueldo sea menor a 3000. EXCEPCIO ES DEFI IDAS POR EL USUARIO Además de las excepciones predefinidas el usuario puede definir sus propias excepciones. BEGIN SELECT SALARIO INTO SUELDO FROM EMPLEADO WHERE CODIGO = 2000. sencillamente colocando el nombre de la excepción que se desea activar a continuación de la cláusula RAISE.GEDICA TRAINING & CONSULTING C. Sintaxis: RAISE nombre_excepcion. y obligar la ocurrencia de esa excepción. utilizando la cláusula RAISE. Para definir una excepción propia se debe declarar previamente la excepción de la siguiente manera: Sintaxis: DECLARE nombre_excepcion_propia EXCEPTIO . Una vez definida la excepción puede activarse. esto es hacer que el control salte hasta la sección de excepciones en el punto donde la excepción aparece. o de una predeterminada. Lenguaje Procedimental PL/SQL/ 67 .A. DECLARE SUELDO NUMBER. AUMENTO EXCEPTION.

código_de_la_excepción). / La cláusula RAISE también puede usarse sin el nombre de la excepción. Sintaxis para definir excepciones PRAGMA EXCEPTION_INIT(definición_del_usuario. PRAGMA EXCEPTION_INIT(FORMATOFECHA. DECLARE CODIGOERROR NUMBER. MENSAJEERROR CHAR(70). con la condición que se utilice dentro del manejador de excepciones. EXCEPTION WHEN AUMENTO THEN UPDATE EMPLEADO SET SALARIO = 5000 WHERE CODIGO = 2000. En algunos casos se hace necesario tener el control sobre excepciones. FORMATOFECHA EXCEPTION. que no han sido predefinidas por ORACLE. COMMIT. La finalidad de realizar esto. Cuando una excepción ocurre. esta. BEGIN UPDATE EMPLEADO SET FECHACONTRATO = 'JAN-10-93' -.GEDICA TRAINING & CONSULTING C. en caso de no encontrarse. -1858).A. Si no es encontrado un manejador para la excepción ocurrida. END. se busca en el manejador de excepciones del próximo bloque. y así sucesivamente hasta encontrarse.error en el formato de fecha Lenguaje Procedimental PL/SQL/ 68 . esta inmediatamente es buscada en el manejador de excepciones del bloque en curso. es pasada al ambiente que invoco a PL/SQL. es para reactivar la excepción en curso.

EXCEPTION WHEN FORMATOFECHA THEN ROLLBACK. INSERT INTO TABLAERRORES VALUES(CODIGOERROR. WHEN OTHERS THEN CODIGOERROR := SQLCODE. MENSAJEERROR := SQLERRM. UPDATE EMP SET FECHACONTRATO = '10-JAN-93' WHERE NUMEMP = 6659. COMMIT. / La sentencia SQLCODE retorna el código de la excepción ocurrida y la sentencia SQLERRM retorna el mensaje asociado a la excepción en curso. WHERE NUMEMP = 6659.A.MENSAJEERROR). La instrucción Lenguaje Procedimental PL/SQL/ 69 .GEDICA TRAINING & CONSULTING C. RAISE_APPLICATIO _ERROR permite enviar códigos y mensajes de error. RAISE_APPLICATION_ERROR(CODIGOERROR. MENSAJEERROR). END.

de lo contrario arroje un error que indica que no puede disminuir el salario del empleado. 3. Elaborar un programa que consulte los datos de un empleado. mostrar un mensaje que indique “El código de empleado X no Existe. 2. Elaborar un programa que ingrese un nuevo empleado.A. Ingrese un código valido”. si el empleado no existe. si existe mostrar un error que indique.GEDICA TRAINING & CONSULTING C. Lenguaje Procedimental PL/SQL/ 70 . antes de insertar el registro debe validad que el código de empleado no existe. “El código X ya esta asignado. PRACTICA 4 1. antes de actualizar valide que el salario nuevo sea mayor al salario actual. Por favor utilice un nuevo código”. Elaborar un programa para actualizar el salario de un empleado que el usuario introduzca.

A. Capítulo 5 PROGRAMAS ALMACE ADOS E LA BASE DE DATOS Lenguaje Procedimental PL/SQL/ 71 .GEDICA TRAINING & CONSULTING C.

I GE IERIA DEL LE GUAJE PL/SQL I GE IERIA DE PL/SQL Ingeniería de PL/SQL Bloque de PL/SQL DECLARE Procedimiento Procedimiento BEGIN Procedimiento SQL Procedimiento SQL END. Bloque de PL/SQL DECLARE Procedimiento Procedimiento BEGIN Procedimiento SQL Procedimiento SQL END.A.GEDICA TRAINING & CONSULTING C. Ejecutor de sentencias Procedimental Ejecutor de sentencias SQL en el RDBMS de ORACLE Lenguaje Procedimental PL/SQL/ 72 .

I GE IERIA DE PL/SQL RESIDE TE E EL RDBMS ORACLE RDBMS Programa anfitrión Lenguaje anfitrión Lenguaje anfitrión Ingeniería de PL/SQL Bloque de PL/SQL DECLARE Procedimiento Procedimiento BEGIN Procedimiento SQL Procedimiento SQL END. Bloque de PL/SQL DECLARE Procedimiento Procedimiento BEGIN Procedimiento SQL Procedimiento SQL END.GEDICA TRAINING & CONSULTING C.A. Ejecutor de sentencias Procedimental Lenguaje anfitrión Lenguaje anfitrión Lenguaje anfitrión Ejecutor de sentencias SQL Lenguaje Procedimental PL/SQL/ 73 .

A.GEDICA TRAINING & CONSULTING C. DIFERE CIA E TRE PROCEDIMIE TO Y FU CIO Procedimiento Solo puede retornar valores mediante el uso de parámetros Se invocan solo con el nombre y operan Función Retorna siempre un valor en el nombre de la función Deben aparecer en algún lugar donde se como si el código estuviera en el lugar donde se pueda almacenar el valor que retorna llaman CARACTERISTICAS DE PROCEDIMIE TOS Y FU CIO ES Almacenamiento en forma compilada en la Base de Datos Pueden llamar a otros procedimientos/funciones o a sí mismo Pueden ser llamados desde todos los clientes del ambiente Lenguaje Procedimental PL/SQL/ 74 . PROCEDIMIE TOS Y FU CIO ES ALMACE ADAS Un procedimiento almacenado o una función almacenada es un conjunto de instrucciones de SQL y PL/SQL que se crean con la finalidad de realizar una tarea específica. Se almacenan en la base de datos como un objeto y pueden ser invocados desde allí por cualquier programa que tenga permisología de acceso sobre estos.

USOS DE PROCEDIMIE TOS Y FU CIO ES • Permiten definir las reglas o funciones del negocio. por ejemplo. Debido a que los procedimientos y funciones son tratados como objetos de la base de datos. Eliminar un cliente. se utiliza la instrucción CREATE PROCEDURE para que el nuevo código sea almacenarlo en la base de datos. Calculo del impuesto sobre la renta • Los procedimientos y funciones son compilados en la Base de Datos al momento de su creación.GEDICA TRAINING & CONSULTING C. se puede utilizar la cláusula REPLACE PROCEDURE para cambiar un procedimiento o función ya existente. por ejemplo. Crear una orden. por ejemplo. • Encapsula una transacción. CREACIO Y COMPILACIO DE PROCEDIMIE TOS Y FU CIO ES Para crear un procedimiento o función almacenado.A. ombre_Procedimiento [( Argumento [IN] [OUT] [IN OUT] Tipo Dato )] IS Cuerpo de Programa PL/SQL AS / Lenguaje Procedimental PL/SQL/ 75 . Sintaxis: CREATE OR REPLACE PROCEDURE esquema. La forma y el texto compilado de un procedimiento o función son almacenados en el diccionario de datos. recolecta y procesa información desde nodos remotos • Permiten crear programas con código genérico (compartido o común).

Los argumentos pueden operar en tres modos. END. La siguiente tabla muestra el tipo de argumento posible para los parámetros en PL/SQL: Modo IN Descripción Parámetro por valor. Crear un procedimiento que acepte un código de empleado como entrada y elimine el empleado de la tabla EMPLEADO. puede contener valores de entrada al procedimiento y cualquier modificación del parámetro dentro del procedimiento o función se reflejara en el correspondiente parámetro externo El siguiente ejemplo ilustra la forma de crear un procedimiento. no modifica los valores que recibe como parámetro. dependiendo del modo. Es el modo por defecto OUT Parámetro de solo salida. no puede contener un valor de entrada al momento de llamar al procedimiento o función IN OUT Parámetro por referencia. / Lenguaje Procedimental PL/SQL/ 76 . CREATE PROCEDURE borra_empleado ( empid NUMBER) IS BEGIN DELETE FROM empleado WHERE empno = empid.GEDICA TRAINING & CONSULTING C.A. el argumento se tratará como un parámetro por valor o por referencia.

GEDICA TRAINING & CONSULTING C. DML o PL/SQL Llamadas a procedimientos y funciones almacenadas en la Base de Datos (incluyendo posibles llamadas recursivas) Llamadas a otros procedimientos y funciones en una Base de Datos remota. Lenguaje Procedimental PL/SQL/ 77 . Crear una función que acepte como entrada un número de cuenta contable y retorne el saldo del balance de la cuenta CREATE FUNCTION obtener_saldo_bal ( cuenta RETURN IS saldo_cuenta NUMBER := 0. BEGIN SELECT INTO FROM WHERE RETURN END. El siguiente ejemplo ilustra la forma de crear una función. Instrucciones Válidas en Procedimientos y Funciones Instrucciones SQL. que no aparece en el procedimiento anterior. esta cláusula es la que permite retornar el valor de la función.A. (saldo_cuenta). NUMBER) NUMBER Nótese que en el ejemplo anterior existe la cláusula RETURN. / balance saldo_cuenta cuentas ncuenta = cuenta.

cuando el EXECUTE no esta disponible BEGIN nombre_procedimiento(parámetros). END. ROLLBACK y SAVEPOINT en procedimientos llamados remotamente EJECUCIO DE PROCEDIMIE TOS Y FU CIO ES ALMACE ADOS Dependiendo del lugar desde el cual se realiza la llamada al procedimiento.GEDICA TRAINING & CONSULTING C.nombre_procedimiento(parámetros). Lenguaje Procedimental PL/SQL/ 78 . Procedimiento almacenado en una base de datos remota: usuario. Desde otro esquema de usuario: usuario. En bloques anónimos de PL/SQL. Desde alguna herramienta Oracle: EXECUTE nombre_procedimiento(parámetros).nombre_procedimiento@enlace_remoto(parámetros). existen diferentes formas de ejecutar un procedimiento almacenado. Instrucciones o Validas en Procedimientos y Funciones Instrucciones DDL Instrucciones dinámicas de SQL Las instrucciones COMMIT. Desde una aplicación precompilada: EXEC SQL nombre_procedimiento(parámetros). A continuación se listan las formas de invocar un procedimiento almacenado: Desde un bloque PL/SQL sin el esquema de usuario propietario nombre_procedimiento(parámetros).A.

Desde OCI CALL OSQL3 (cursor.). Lenguaje Procedimental PL/SQL/ 79 .. CALL OEXEC (.). END.A." CALL OBNDRV (. /*interpretador*/ "BEGIN nombre_procedimiento(parámetros)..GEDICA TRAINING & CONSULTING C.

se hace uso del comando SHOW ERRORS o bien se pueden consultar las vistas USER_ERRORS. esto se debe a que ORACLE puede recompilar un procedimiento automáticamente. Los errores de sintaxis en la compilación se almacenan en el diccionario de datos. A continuación muestre los errores de compilación.A. is with as compress compiled wrapped Lenguaje Procedimental PL/SQL/ 80 . y en consecuencia debe tener algún lugar para colocar los posibles errores.----------------------------------------------------------------1/17 PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: ( . COMPILACIO DE ERRORES E PL/SQL ERRORES DE PL/SQL La compilación de PL/SQL es ejecutada por la ingeniería de PL/SQL en ORACLE. Para visualizar los errores generados por la compilación de un procedimiento o función almacenada.GEDICA TRAINING & CONSULTING C. ALL_ERRORS o DBA_ERRORS Para ilustrar el manejo de errores en PL/SQL trate de crear un procedimiento llamado TEST1 usando el código siguiente: SQL> CREATE PROCEDURE test1 IS BEGIN test2. END. para ello use la instrucción SHOW ERRORS SQL> SHOW ERRORS El resultado debe ser similar al siguiente: LINE/COL ERROR ------------------------------.

usando las sentencias DROP y CREATE. se debe borrar el objeto y luego recrearlo. 'Texto del mensaje') • El rango numérico entre -20000 a -20999. o simplemente reemplazar el código existente mediante el uso de la cláusula CREATE OR REPLACE. ERRORES DEFI IDOS POR EL USUARIO El usuario puede definir errores y puede hacer que al activarse el error se retorne el número y el mensaje del error. suponiendo.A. esta reservado en ORACLE para los errores definidos por el usuario • ORACLE no verifica que los errores definidos por el usuario sean únicos Para ilustrar lo dicho anteriormente. que el procedimiento existe. y ejecutar un SELECT … INTO antes de llamar al procedimiento Sintaxis: RAISE_APPLICATIO _ERROR (error_number. los cuales previamente deben haber sido definidos por el usuario. Lenguaje Procedimental PL/SQL/ 81 . consideremos el siguiente ejemplo. Para recompilar un procedimiento o función. para esto: • • Se debe definir el grupo de errores de aplicación Se sugiere estandarizar los números y mensajes de error a través de la creación de una tabla en la Base de Datos. claro está.GEDICA TRAINING & CONSULTING C. También puede recompilarse un procedimiento mediante la instrucción ALTER PROCEDURE. The symbol "is" was substituted for "BEGIN" to continue. Crear un procedimiento que active un mensaje de error definido por el usuario si la condición que se indica no es encontrada. para mantener los errores y mensajes.

A. END IF. / ELIMI ACIO DE PROCEDIMIE TOS Y FU CIO ES Al igual que las tablas. La sintaxis para eliminar un procedimiento es: DROP PROCEDURE nombre_procedimiento. END. los procedimientos y funciones también pueden ser eliminados. Lenguaje Procedimental PL/SQL/ 82 .GEDICA TRAINING & CONSULTING C. La sintaxis para eliminar una función es: DROP FUNCTION nombre_funcion. ELSE DELETE FROM empleado WHERE empno = empid. CREATE PROCEDURE analiza_num_emp (empid NUMBER) AS BEGIN IF empid <= 0 THEN raise_application_error(-20100. 'Numero de empleado debe ser > 0').

A. mientras esté activa la sesión del usuario que invoca al paquete o un objeto contenido en él. Los paquetes pueden contener objetos. los cuales están disponibles para el usuario en cualquier instante. PAQUETES Un paquete es un objeto de la base de datos que agrupa construcciones de programas relacionados en una sola unidad lógica. tales como: • Procedimientos • Funciones • Definiciones de Cursores • Definiciones de Variables y Constantes • Definiciones de Excepciones ESTADO PERSISTE TE Los paquetes retienen el último estado válido de los objetos que contienen. El cuerpo del paquete puede ser reemplazado sin afectar las especificaciones. Un paquete contiene uno o más objetos almacenados en la base de datos.GEDICA TRAINING & CONSULTING C. esto significa que: Las variables retienen los valores asignados y los cursores retienen las áreas de contexto y posicionamiento de datos El estado persistirá a través de las llamadas que realice el usuario dentro de una sesión Cada sesión tiene su propio control de versiones del estado del paquete Lenguaje Procedimental PL/SQL/ 83 .

Cuerpo Lenguaje Procedimental PL/SQL/ 84 . ESTRUCTURA DE U PAQUETE • Especificaciones del Paquete : Es el área declarativa de la construcción del paquete.A. así como los nombres de las variables y cursores públicos • Cuerpo del Paquete : Es el área de texto donde se coloca el código de los procedimientos y funciones que el paquete contiene Dentro del Cuerpo de un paquete se pueden especificar otros procedimientos y funciones privadas. j := C. x := PK.C. en la cual se indican los nombres y parámetros de los procedimientos y funciones públicas disponibles.A.GEDICA TRAINING & CONSULTING C. i := D. solo disponibles para las construcciones que están dentro del mismo paquete • Definición del Código de todas las construcciones que integran el paquete DEPE DE CIAS E TRE PAQUETES Package PK Procedure A variable C variable D procedure A procedure B Especificaciones PK.

la sintaxis es la siguiente: CREATE OR REPLACE PACKAGE BODY esquema. entonces cualquier cambio que afecte al código del procedimiento B provocará que el procedimiento A se marque automáticamente para ser recompilado • Si un procedimiento individual A. • Si un procedimiento A llama a otro procedimiento B. Para la definición de la cabecera la sintaxis es la siguiente: Sintaxis: CREATE OR REPLACE PACKAGE esquema. tanto la cabecera como el cuerpo del paquete.GEDICA TRAINING & CONSULTING C.A. / Lenguaje Procedimental PL/SQL/ 85 .Nombre_del_Paquete [IS] [AS] Especificaciones del Paquete. y ninguno de los dos pertenece a un paquete. llama a un Procedimiento B de otro paquete. / Para la definición del cuerpo del paquete. llama a un procedimiento B que se encuentra dentro de un paquete. Variables y Constantes. ningún cambio que tenga lugar en el código de cualquiera de los procedimientos generará dependencia de recompilación en el otro ESPECIFICACIO ES PARA LA CREACIO DE PAQUETES Se deben especificar por separado.Nombre_del_Paquete [IS] [AS] Cuerpo de las Construcciones del Paquete. entonces ningún cambio en el código del procedimiento B afectara al procedimiento A • Si un procedimiento A de un paquete.

comm NUMBER. ename. END. mgr NUMBER. /* si el empleado no existe se podrá incluir */ IF valid = 'T' THEN INSERT INTO empleado (empno. deptno). PROCEDURE borrar_empleado ( empid NUMBER ). ename VARCHAR2. / El siguiente ejemplo ilustra la forma de crear el cuerpo del paquete definido anteriormente: CREATE PACKAGE BODY paq_empleado AS /* Procedimiento de registro de empleados */ PROCEDURE insertar_empleado ( empno NUMBER. A continuación se muestra un ejemplo que ilustra la forma de crear la cabecera de un paquete. comm NUMBER. sal. comm. /* Función para chequear que el número de empleado es válido */ Lenguaje Procedimental PL/SQL/ 86 .GEDICA TRAINING & CONSULTING C. END IF. sal. deptno) VALUES (empno. /* Procedimiento de despido de empleado */ PROCEDURE borrar_empleado (empid NUMBER) IS BEGIN DELETE FROM empleado WHERE empno = empid. mgr NUMBER. END paq_empleado. sal NUMBER. /* variables globales */ valid VARCHAR2(1). END. deptno NUMBER) IS BEGIN Valid := chequea_num (empno). ename. CREATE PACKAGE paq_empleado AS /* declaraciones publicas */ PROCEDURE insertar_empleado( Empno NUMBER. deptno NUMBER). mgr.A. comm. sal NUMBER. Ename VARCHAR2. mgr.

BEGIN answer := 'T'. sin embargo se puede realizar. FUNCTION chequea_num (empno NUMBER) RETURN VARCHAR2 IS answer VARCHAR2.A. también de manera manual haciendo uso de la cláusula ALTER: Sintaxis: ALTER PACKAGE [esquema. la compilación de un paquete se realiza al momento de crearlo.GEDICA TRAINING & CONSULTING C. RETURN (answer). se utiliza la cláusula DROP. END IF.]Nombre_del_Paquete. END.]Nombre_del_Paquete COMPILE [BODY] [PACKAGE] Para eliminar un paquete. Lenguaje Procedimental PL/SQL/ 87 . /* fin del cuerpo del paquete */ / Como se dijo anteriormente. IF empno < 0 THEN answer := 'F'. END paq_empleado. recuerde que un paquete es también un objeto de la base de datos: Sintaxis: DROP PACKAGE [esquema.

Crear un procedimiento llamado maneja_error que le permita controlar los errores que ocurren en el sistema. el procedimiento debe recibir el código del error. para esto utilice el procedimiento creado en el ejercicio 1. donde el empleado debe recibir el código del cliente y consultar si existe. Lenguaje Procedimental PL/SQL/ 88 . y antes de ejecutar el insert debe validar que el cliente no exista. Crear un procedimiento para insertar un nuevo cliente. el mensaje y el nombre del programa que lo origina. PRACTICA 5 1. ejecuten el procedimiento 5. Crear una función llamada busca_direccion_cliente. 6.A. 4. Modifique los programas de los ejercicios 1 y 4 para que cuando ocurre un error cualquiera que este sea. retornar un error con el mensaje “El código del cliente ya existe” 2. debe insertar estos valores en la tabla errores_sistema junto con la fecha y hora en la que ocurrió el error. que reciba el código del cliente y retorne la dirección del mismo. debe recibir los valores a insertar.GEDICA TRAINING & CONSULTING C. 3. Crear una función llamada busca_descripcion_producto que reciba el código del producto y retorne el nombre del mismo. luego propagar el error. Crear un procedimiento con el nombre valida_no_existe_cliente. de ser así. 5.

A. Capítulo 6 TRIGGERS DE BASE DE DATOS Lenguaje Procedimental PL/SQL/ 89 .GEDICA TRAINING & CONSULTING C.

Según el tipo de operación. auditoria o manejo de posibles errores durante la manipulación de datos almacenados en la base de datos. los cuales se disparan al borrar filas Lenguaje Procedimental PL/SQL/ 90 . fecha. para llevar controles sobre la data. es decir copias de tablas grandes a tablas más pequeñas. técnica que se utiliza con la finalidad de aumentar la velocidad de ejecución. y se dispara cuando ocurre un cambio en el contenido de ese objeto. pues le permiten realizar múltiples labores de verificación de integridad. columna. Los triggers ayudan a lograr la integridad en aquellas bases de datos que requieren tablas desnormalizadas. El uso de triggers confiere amplios beneficios al programador. Los triggers permiten la creación de tablas de auditoria.A. hora y datos fueron modificados durante una transacción. los cuales se disparan al insertar filas Triggers tipo Update. los cuales se disparan al actualizar filas Triggers tipo Delete. De esta manera se podrá preservar tanto el dato antiguo como el dato nuevo en aquellos valores que son críticos. usuario. esto es una tabla o una vista. así como también llevar un control de las reglas del negocio.GEDICA TRAINING & CONSULTING C. con el fin de saber que registro. Un trigger se asocia a un objeto que contiene datos modificables en la base de datos. Los triggers también son utilizados ampliamente en bases de datos distribuidas. TRIGGERS o DISPARADORES DE EVE TOS Los triggers son eventos que se activan automáticamente cuando en la base de datos ocurre el evento al cual están asociados. asociados internamente a la base de datos existen tres tipos de triggers: Triggers tipo Insert.

se disparan cuando la transacción se ha completado Por fila.GEDICA TRAINING & CONSULTING C. se disparan inmediatamente después de procesar una fila de datos Un evento en la base de datos dispara uno o varios de los triggers definidos en la tabla anterior. De acuerdo al momento en que se disparan en relación con el evento al cual están asociados. los triggers pueden ser: Before. se disparan antes de que la acción se ejecute After.A. Lenguaje Procedimental PL/SQL/ 91 . los triggers pueden ser: Por transacción. y cada una de estas combinaciones puede estar asociada a una transacción o a una fila. Esto significa que existen un total de doce triggers asociados a las tablas o vistas de la base de datos. de manera excluyente. se disparan después que la acción se ha ejecutado La siguiente tabla muestra las posibles combinaciones de activación de los triggers según el tipo de trigger de que se trate y al instante de activación: Instante de activación Acción Insert Update Delete Before Before Insert Before Update Before Delete After After Insert After Update After Delete De acuerdo a la acción que genera su activación.

a continuación se listan algunas: • No se pueden usar cláusulas de control de operación. Esto significa que desde un trigger de base de datos no se puede realizar COMMIT.GEDICA TRAINING & CONSULTING C. Por lo tanto las transacciones deben ser terminadas por quien disparó un trigger y no por el trigger en sí • Los triggers de base de datos no pueden crearse sobre una instrucción SELECT. esto quiere decir que su activación no puede ser forzada por el usuario Lenguaje Procedimental PL/SQL/ 92 . ni pueden asociarse a instrucciones DDL. pero el control de las operaciones internas y de la modificación de los datos es responsabilidad única del manejador. tales como son CREATE. los triggers tienen ciertas restricciones. RESTRICCIO ES DE LOS TRIGGERS Debido a que los triggers de base de datos pueden ser manejados por el usuario. ni ROLLBACK ni tampoco SAVEPOINT. ALTER o DROP • Los triggers de base de datos no pueden asociarse a las tablas del Diccionario de Datos • Los triggers de base de datos solo se activan cuando ocurre el evento al cual están asociados.A.

. DEFI ICIO Y CREACIO DE TRIGGERS Un trigger de Base de Datos definido por el usuario está formado por un bloque de PL/SQL asociado a una tabla específica.... INSERT INTO t...GEDICA TRAINING & CONSULTING C.. Applicación UPDATE t SET. Se dispara de manera implícita cuando se ejecuta la instrucción asociada a la tabla. DELETE triger Base de Datos UPDATE triger tabla T INSERT triger A continuación se muestra un ejemplo de la secuencia de ejecución de un trigger de base de datos Antes del comando trigger EMPLEADO 100 120 240 260 280 300 301 DEPARTAMENTO Antes del trigger de fila 10 Despues del trigger de fila 50 Antes del trigger de fila 10 Despues del trigger de fila 40 20 Antes del trigger de fila 30 Despues del trigger de fila 10 Despues del comando trigger Lenguaje Procedimental PL/SQL/ 93 .. DELETE FROM t..A..

SECUE CIA DE EJECUCIO DE U TRIGGER DE BASE DE DATOS 1. La instrucción INSERT. de manera que un trigger de Base de Datos y una tabla pueden tener el mismo nombre. / Donde: esquema: indica el entorno de usuario nombre_de_trigger: indica el nombre con el cual se va a crear el trigger columnas: indica las columnas de la tabla a las cuales va a estar asociado el trigger tabla: indica el nombre de la tabla a la cual va a estar asociado el trigger condición: restringe la activación del trigger a las filas que cumplen esta condición bloque_pl/sql: contiene el bloque de instrucciones que conforman el cuerpo del trigger Los triggers de Base de Datos son almacenados separados de otros objetos.A. sin embargo es recomendable la utilización de nombres únicos. UPDATE o DELETE pasa al manejador ORACLE Lenguaje Procedimental PL/SQL/ 94 . Sintaxis: CREATE TRIGGER [esquema.]tabla REFERENCING [OLD | NEW] AS viejo | nuevo [FOR EACH ROW WHEN condición bloque_pl/sql ].GEDICA TRAINING & CONSULTING C. para ello se hace uso de la cláusula CREATE TRIGGER. CREACIO DE U TRIGGER DE BASE DE DATOS Un trigger de base de datos puede ser creado de manera similar a la creación de cualquier otro objeto de la base de datos.]nombre_de _trigger [BEFORE | AFTER] [DELETE | INSERT | UPDATE] [OR ] [OF] (columnas) ON [esquema.

Para referenciar los valores nuevos o viejos de una columna en expresiones de trigger de fila se utilizan los prefijos: :OLD contiene el valor de la columna antes de efectuar el cambio :NEW contiene el valor que afectará a la columna después de efectuar el cambio Ejemplo IF :NEW. El manejador chequea y ejecuta el trigger de comando BEFORE 3. siempre y cuando estos no hagan COMMIT ni violen las restricciones expresas para los triggers.salario contiene el valor antiguo de la columna salario. Se modifica la fila y se chequean las restricciones de integridad 6.salario < :OLD. 2.. Por cada fila afectada por el comando SQL : 4.salario . Se ejecuta el trigger de comando AFTER 9.. Se pueden tener procedimientos almacenados referenciados en el texto del trigger. El control regresa a la aplicación.. los cambios hechos por el trigger de comando se reversan.. Se complementa la validación de las restricciones de integridad chequeando las posibles violaciones 8. Se ejecuta el trigger de fila BEFORE 5. Al tratar de referenciar los valores :NEW y :OLD se deben tener en cuenta las siguientes consideraciones: Lenguaje Procedimental PL/SQL/ 95 .A.. Se ejecuta el trigger de fila AFTER 7.salario contiene el nuevo valor de la columna salario antes de efectuarse el cambio y la expresión :OLD. Si un trigger de comando de Base de Datos falla. La expresión :NEW.GEDICA TRAINING & CONSULTING C.

Lenguaje Procedimental PL/SQL/ 96 .. Esto resulta más fácil que mantener tres triggers por separados. • • • • Los valores NEW y OLD están disponibles únicamente en los triggers de fila Los valores NEW y OLD están disponibles en el UPDATE El valor OLD en un INSERT es nulo El trigger de fila BEFORE puede asignar valores a :NEW si no es asignado el valor por la cláusula UPDATE SET o lista INSERT VALUES • Se puede usar la cláusula REFERENCING para remplazar :NEW y :OLD con otros nombres relacionados • Los dos puntos no son necesarios al referenciar en la cláusula WHEN Si el trigger de Base de Datos se puede disparar sobre más de un tipo de operaciones DML. haciendo uso de los valores NEW..... Predicados Condicionales • • • IF INSERT .. Esto siempre y cuando los procedimientos no contengan cláusulas de control de operaciones. OLD y de los predicados condicionales. IF DELETING . se puede usar el predicado condicional para determinar la operación del DML que ocasiona el disparo del trigger de Base de Datos..A.. El siguiente ejemplo muestra la forma de crear un trigger. y usar el predicado condicional para determinar qué ocasionó que se disparase el trigger de Base de Datos. Se puede tener el mismo trigger en la Base de Datos para un DELETE..GEDICA TRAINING & CONSULTING C. tales como COMMIT. IF UPDATING . INSERT y UPDATE.

salario) WHERE departamento = :OLD.departamento) AND (:OLD.departamento.A. END. END IF.salario WHERE departamento = :OLD. CREATE TRIGGER salario_total AFTER DELETE OR INSERT OR UPDATE OF departamento.departamento = :NEW. IF INSERTING OR UPDATING AND (:OLD.salario como no nulos */ IF DELETING OR (UPDATING AND :OLD.salario) THEN UPDATE departamento_compras SET total_salario = total_salario + (:NEW.departamento <> :NEW.departamento) THEN UPDATE departamento_renta /* separa las tablas que referencian a departamento */ SET total_salario =total_salario .GEDICA TRAINING & CONSULTING C.:OLD.salario :OLD. salario ON empleado FOR EACH ROW BEGIN /* se asume departamento.departamento.salario <> :NEW. END IF. / Lenguaje Procedimental PL/SQL/ 97 .

En el caso anterior la opción AFTER DELETE OR INSERT OR UPDATE.nombre_trigger. La opción FOR EACH ROW indica que el trigger se activará una vez por cada fila de datos que sea procesada. los triggers definidos sobre ella también serán eliminados Lenguaje Procedimental PL/SQL/ 98 .A. ELIMI A DO U TRIGGER DE BASE DE DATOS Debido a que un trigger es también un objeto de Base de Datos.GEDICA TRAINING & CONSULTING C. para borrar un trigger se utiliza la cláusula DROP. provocará que el trigger definido anteriormente se active. Antes de la ejecución de cualquier instrucción de actualización sobre la columna SALARIOS de la tabla NOMINA o la inserción de un nuevo registro. para modificar un trigger este debe ser eliminado y recreado La eliminación de un trigger no afecta los privilegios de seguridad existente asociados a una tabla Si una tabla es eliminada. La siguiente instrucción permite la eliminación del trigger creado anteriormente: DROP TRIGGER tr_upd_salario. ejecutando las instrucciones del bloque PL/SQL que conforman el cuerpo del trigger. indica que el trigger se disparará después de culminar la acción de inserción o actualización. Sintaxis: DROP TRIGGER esquema. Para la creación y manipulación de triggers se deben tener en cuenta las siguientes consideraciones: Los triggers de Base de Datos no pueden ser alterados.

pero no debe ser mayor a 1. 3.A.000.GEDICA TRAINING & CONSULTING C. Y controlar estos a través del procedimiento mensaje_error. si lo que ocurre es una eliminación guardar el campo clave del registro eliminado. En dicha tabla debe guardarse la fecha en que ocurrió el evento. Elabore un trigger sobre la tabla empleado que le permita guardar en la tabla control_registros si ocurre un evento de actualización o eliminación. Elabore un trigger sobre la tabla empleado. es decir. además del campo clave del registro que se actualizo. y si se trata de una actualización el valor viejo del campo modificado y el valor nuevo. Lenguaje Procedimental PL/SQL/ 99 . el salario nuevo sea siempre mayor al salario actual. el código del empleado. Adicionalmente si el nuevo empleado pertenece al departamento de investigación u operaciones insertar los registros en las tablas emp_investigacion y emp_operaciones. 2. PRACTICA 6 1. Elabore un trigger sobre la tabla empleado para controlar que cuando si inserte un nuevo empleado. el nombre se inserte en mayúscula. para controlar que cuando se ejecute una actualización de los salarios. el usuario que lo ejecuto.000 de lo contrario arroja mensajes de error por cada caso. y si la fecha de ingreso no es colocada entonces se asigne la fecha actual.

Sign up to vote on this title
UsefulNot useful