Introducción al lenguaje PL/SQL

Joaquín Gutiérrez Gil
Segundo Ingeniería Técnica en Informática de Gestión (UPO) Asignatura: Bases de Datos

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos

ÍNDICE
  Introducción…………………………………………………………...........................3 Bloques PL/SQL………………………………………………………………………………4

 Uso de sentencias SQL dentro de PL/SQL…………….…………………….…..5  Unidades léxicas…………………………………………………………………….………6
                      Tipo en PL/SQL………………………………………………….……………..……………7 Literales…………………………………………………………………………………………9 Definición de variables en PL/SQL………………………….………………………9 Conversión de tipos……………………………………………………………………….11 Visibilidad de las variables…………………………………………………………….12 Entrada y salida de datos……………………………………………………………….12 Estructuras de control……………………..…………………………………………….14 Funciones SQL predefinidas……………………………………………………………18 Cursores en PL/SQL………………………………………………………………………..20 Bucles de extracción mediante cursores………………………………………..25 Excepciones en PL/SQL…………………………………………………………………..27 Subprogramas en PL/SQL……………………………………………………………….35 Subprogramas en bloques anónimos………………………………………………42 Paquetes en PL/SQL………………………………………………………………………..43 Registros en PL/SQL………………………………………………………………………..47 Definición de VARRAYS……………………………………………………………….…..49 BULK COLLECT……………………………………………………………………………..….51 Transacciones en PL/SQL………………………………………………………………….52 Transacciones autónomas………………………………………………………………..53 PL/SQL y JAVA…………………………………………………………………………………..54 Bibliografía…………………………………………………………………………………….…57 Licencia…………………………………………………………………………………………….58

Página 2

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos

Introducción
SQL es un lenguaje de consulta para las bases de datos relacionales, pero que no posee la potencia de los lenguajes de programación. Para esto existe PL/SQL, para combinar la capacidad de consulta de SQL con la potencia de los lenguajes de programación y así poder realizar aplicaciones completas para el manejo de bases de datos relacionales. PL/SQL es un lenguaje procedimental diseñado por Oracle para trabajar con la base de datos. Soporta todos los comandos de consulta y manipulación de datos, aportando al lenguaje SQL las estructuras de control y otros elementos propios de los lenguajes procedimentales de tercera generación. La unidad mínima de trabajo es el bloque, es un lenguaje estructurado en bloques. Es un lenguaje embebido en ORACLE y PostgreSQL. PL/SQL amplía la funcionalidad de SQL añadiendo estructuras habituales en otros lenguajes de programación como:     Variables y tipos (predefinidos y definidos por el usuario). Estructuras de control (bucles y condiciones IF-THEN-ELSE). Procedimientos y funciones. Tipos de objetos y métodos.

Además de ser procedimental, este lenguaje es modulable, es decir, es posible encapsular el código para su reutilización posterior. De esa forma eliminamos la posibilidad de que exista código redundante, se mejora la eficiencia de las aplicaciones, la seguridad, etc. Los módulos de PL/SQL están divididos en cuatro categorías: Procedimientos, Funciones, Paquetes y Triggers.    Procedimientos: código encapsulado que acepta parámetros de entrada y que no devuelve ningún tipo de valor. Funciones: código encapsulado que acepta parámetros de entrada y que devuelve un valor. Paquete: conjunto de procedimientos y funciones. Tiene dos partes: la especificación, con la cabecera de las funciones, procedimientos y la declaración de variables, y el cuerpo, con el código de estos módulos. Es una forma de aglutinar módulos relacionados entre si. Se utiliza como una biblioteca. Triggers: código PL/SQL asociado a una tabla que se activa siempre que se dé un determinado evento (insert, update, delete). Se utilizan para implementar restricciones complejas en las tablas.

Página 3

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos

Todos estos módulos, una vez creados, se compilarán en la Base de Datos transformándose en objetos propios de dicha Base de Datos. De tal forma que pueden ser utilizados por cualquier usuario u otro código, siempre que se tenga permiso para ello.

Bloques PL/SQL
Como ya se ha mencionado, la unidad básica en PL/SQL es el bloque. Todos los programas PL/SQL están compuestos por bloques que puedes estar anidado. Un bloque PL/SQL está compuesto de tres partes principales:    Sección declarativa (opcional). Sección ejecutable (opcional). Sección de excepciones (opcional).

Estructura de un bloque: A continuación se presenta cual es la estructura de un bloque PL/SQL.

Podemos crear tres tipos de bloques diferentes:     Bloques anónimos: Se construyen de forma dinámica y se suelen ejecutar una sola vez. Bloques nominados: Igual que los anónimos pero con una etiqueta que les da nombre. Subprogramas: Procedimientos, paquetes y funciones, almacenados de la Base de Datos y que se ejecutan en múltiples ocasiones. Los subprogramas se ejecutarán mediante una llamada. Disparadores (“Triggers”): Bloques nominados que se almacenan en la Base de Datos y se ejecutan ante algún suceso.

Página 4

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos

Estas estructuras se pueden anidar dando lugar a bloques más complejos.

Algunos apuntes más:    Para dar nombre a un bloque se le pone una etiqueta antes del DECLARE. Por ejemplo: <<etiqueta>>. Para transformar un bloque en un procedimiento almacenado reemplazamos la palabra clave DECLARE por CREATE OR REPLACE PROCEDURE nombre_procedimiento AS. Todas las sentencias PL/SQL deben acabar en punto y coma.

Existen dos tipos de comentarios en PL/SQL:

Uso de sentencias SQL dentro del lenguaje PL/SQL
PL/SQL posibilita la utilización de consultas SQL dentro del código. Las únicas instrucciones SQL permitidas en un programa PL/SQL son las del lenguaje de manipulación de datos y las de control de transacciones, es decir:   DML: SELECT, INSERT, UPDATE, DELETE. Control de transacciones: COMMIT, ROLLBACK, SAVEPOINT.

Aunque existe una técnica que permite la utilización de SQL dinámico, es decir, del lenguaje de definición de datos. El SQL dinámico permite crear dinámicamente instrucciones SQL en tiempo de ejecución para después analizarlas y ejecutarlas. En cuanto a las instrucciones DML, la única dificultad o diferencia la encontramos en la sentencia SELECT, ya que es necesario utilizar la cláusula INTO para volcar el resultado de la consulta sobre una o varias variables. Además, estas sentencias SELECTINTO tienen la restricción de que han de devolver únicamente un solo registro. Si devolviera más de una fila, PL/SQL devolvería el siguiente mensaje de error:

Página 5

seguida por una secuencia opcional de caracteres entre los cuales encontramos Página 6 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos ORA-1427: Single-row query returns more than a row Veamos un ejemplo de sentencia SELECT-INTO: En una cláusula WHERE. ¿Por qué motivo? Veamos un ejemplo: La intención de este bloque anónimo es borrar todos los registros de la tabla CLASSE que pertenezcan al departamento ‘CS’. podemos utilizar tanto literales como variables declaradas dentro de un bloque PL/SQL. Cuando PL/SQL examina una expresión de tipo EXPR1 = EXPR2. cursores. Los identificadores constan de una letra. Como en PL/SQL no se diferencia entre mayúsculas y minúsculas. b) La variable nunca puede tener el nombre de un atributo de tabla. department y Department son asociadas a la columna de la tabla CLASSES. Unidades léxicas Los identificadores se emplean para dar nombre a objetos PL/SQL. El efecto es que se borrarán todos los registros de las tablas. como por ejemplo. Pero para ello hay que cumplir dos restricciones: a) La variable ha de ser del tipo adecuado: en un WHERE no podemos igualar una variable NUMBER con un campo de tipo DATE. lo primero que hace es comprobar si alguna de esas expresiones se corresponden con columnas de la tabla con la que se está operando. variables. literales. tipos y subprogramas.

En PL/SQL no se distingue entre mayúscula y minúscula.   NUMBER (size. con una longitud máxima especificada. Del -2. Si alguna vez necesitamos utilizar un identificador que incumpla las reglas anteriores o sea igual a una palabra reservada (BEGIN. Se recomienda utilizar este tipo siempre que se pueda.647 y se utilizan para valores que solo intervengan en cálculos y no sean almacenados en la Base de Datos. DATE: se comporta de la misma forma que el tipo equivalente de la Base de Datos. VARCHAR2(s): pueden contener cadenas de caracteres de longitus variable. ORACLE los convierte durante y al final del proceso. BINARY_INTEGER: los literales de tipo NUMBER son almacenados en formato decimal por cuestiones de optimización. Por ello no se utilizan directamente en las operaciones aritméticas.147. Los delimitadores son símbolos que tienen un significado especial y que sirven para separar unos identificadores de otros.483. números. precisión): puede contener un valor numérico entero o de punto flotante. EXCEPTION. etc) podemos encerrar dicho identificador entre dobles comillas. PLS_INTEGER: igual que el tipo anterior pero gestionando más eficientemente.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos letras. END.647 al 2. caracteres de subrayado (_) y almohadillas (#).483. El tipo BINARY_INTEGER está formado por número enteros con signo.     Página 7 . Es igual al tipo NUMBER de la base de datos. signos de dólar ($).147. Los demás caracteres están prohibidos y la longitud máxima es de 30 caracteres. A continuación se muestran los más relevantes: Tipo en PL/SQL A continuación se muestran los tipos disponibles en el gestor de ORACLE. CHAR (s): las variables de este tipo con cadenas de caracteres de longitud fija.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos     LONG: a diferencia de tipo LONG de la BD. OR). Son variables muy similares a las de tipo VARCHAR2. En PL/SQL podemos “bautizar” los tipos con la sentencia SUBTYPE. Página 8 . Las Expresiones lógicas devuelven valores BOOLEANOS utilizando operadores relaciones (<. sentencia parecida a TYPEDEF en C. FALSE o NULL. <=. LONG RAW: son similares a los datos LONG. el tipo LONG de PL/SQL es una cadena de longitud variable con una longitud máxima de 32. que puede contener hasta dos gigabytes de datos. BOOLEAN: las variables BOOLEANAS pueden tomar el valor TRUE. Es parecido al CHAR pero sin sufrir conversiones entre conjuntos de caracteres al ser transmitidos entre dos BD diferentes. RAW: se emplea para almacenar datos binarios de longitud fija. Se pueden combinar mediante operadores lógicos (NOT.  A continuación se muestra una tabla con los diferentes tipos de datos en PL/SQL. AND. Puede almacenar una fila completa de una tabla.760 bytes. excepto por el hecho de que PL/SQL no realizará conversiones entre conjuntos de caracteres.…). TABLE/RECORD: tipo registro.

booleano o carácter que no es un identificador. para representar la cadena Peter’s Friends pondremos ‘Peter’’s Friends’. Solo existen tres: TRUE (cierto). Por ejemplo. Solo pueden asignarse a variables booleanas. Se realiza en la primera parte del bloque (DECLARE) y tiene la siguiente estructura: nombreVariable tipoVariable [:= expresión]. Se utilizan en las expresiones lógicas y en estructuras IF y LOOP. Para poder incluir una comilla simple dentro de una cadena es necesario poner dos comillas simples. En PL/SQL este literal que representa a la cadena de longitud cero es equivalente al valor NULL. En los números reales. la parte decimal se separa de la entera mediante un punto. FALSE (falso) y NULL (nulo). Página 9 . Definición de variables en PL/SQL Las variables pueden ser de los mismos tipos que las columnas de una base de datos.  Literales numéricos. Representan a números reales o enteros y pueden ser asignados a variables de tipo NUMBER o PLS_INTEGER. Estos son los únicos literales que pueden formar parte de una expresión aritmética.34  Literales booleanos.  Literales de carácter. Los literales de carácter están delimitados por comilla simple y se asignan a variables de tipo CHAR o VARCHAR2.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Ejemplo: Literales Un literal es un valor numérico. una detrás de la otra. La cadena vacía se representa mediante dos comillas simples: ‘ ‘. Por ejemplo: 32.

Además también se admite el uso de arrays. Es decir. definimos un tipo de registro que esté formado por varios campos y estos. especialmente útil para declarar variables del mismo tipo que atributos de una tabla. El atributo %TYPE permite declarar una variable del mismo tipo que otra ya existente. con solo indicar la variable y el campo la variable heredará su tipo. Es por ello que en ciertas ocasiones puede sernos útil el poder declarar una variable con el mismo tipo exactamente que el campo de una tabla. la inicialización es obligatoria cuando una constante es definida. Podemos definir. lo que normalmente haremos será recorrer y tratar los datos almacenados en las tablas y vistas. Nombre_var CONSTANT tipo_var := expresion . además de un valor por defecto. para ello.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Por ejemplo: Aquellas variables que no tengan un valor por defecto en su declaración recibirán el valor NULL. por un determinado tipo. Página 10 . variable que sean constantes.nom_campo%TYPE [:= expresion]. Por ejemplo: En este ejemplo la variable v_comision tendrá el mismo tipo que el campo comm de la tabla emp y será la variable apropiada para recoger los valores de esa columna en el código. Con un programa PL/SQL. Para ello se utiliza el Operador %TYPE: Nombre_var nom_tabla. En este caso.

por ejemplo. Este tipo de errores no son lanzados a la hora de compilar. hay una serie de restricciones a la hora de realizar la conversión de un tipo a otro que se deben respetar. Página 11 . un atributo de tipo CHAR(10) nunca podrá convertirse a un valor de tipo VARCHAR2(1). Conversión de tipos Dentro de una misma familia de tipos. pero sí son localizados en tiempo de ejecución. al igual que en sentencias SQL. Nombre_var tipo_var NOT NULL := expresion .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Luego de haber creado nuestro registro.  Conversiones explícitas de datos. Funciones para convertir tipos de datos entre sí. La estructura de la sentencia es la siguiente: Nombre_Var nom_tabla%ROWTYPE. u otro atributo de tipo NUMBER(3. TO_CHAR(arg): convierte un número o fecha en una cadena de tipo VARCHAR2. estos los tomamos de la fila de una tabla. por lo que habrá que asignárselo en el momento de su declaración.2) no podrá ser NUMBER(3). Con esto conseguimos que la variable no pueda contener un valor nulo. TO_DATE(arg): convierte una cadena a tipo FECHA. podemos declarar que una variable sea NOT NULL. En PL/SQL. en vez de declarar todos sus elementos. podemos acceder a los distintos campos con la siguiente estructura: Existe otra forma de crear registros pero. TO_NUMBER(arg): convierte una cadena al tipo numérico.

las más comunes son entre caracteres y números. Entrada y salida de datos en PL/SQL La forma normal de introducir datos en una BD no es a través de un programa en PL/SQL. Si queremos que los mensajes aparezcan por pantallas tenemos que activar la opción SERVEROUTPUT. al comienzo de nuestro script. Solo es visible por su bloque y no por el inmediatamente superior o por otros ya declarados. En cualquier caso existen algunas funciones que nos pueden ayudar a depurar programas mostrando datos por pantalla o leyendo datos.PUT_LINE(<cadena de caracteres> or <number>). PL/SQL realizará automáticamente conversiones entre tipos de datos siempre que sea posible. ya sea este anidado o no. Página 12 .GET_LINES después de que se haya completado el bloque PL/SQL. éstos suelen realizar operaciones específicas dentro de la BD sin interacción con un operador. ya que el paquete DBMS_OUTPUT simplemente implementa una cola: SET ServerOutput ON.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos  Conversiones implícitas de datos. El Operador || se utiliza para concatenar. Ejemplo: Esta orden llama de forma implícita a DBMS_OUTPUT:ENABLE que configura el buffer interno. Visibilidad de las variables Una variable solo es visible dentro del bloque donde ha sido declarada.  Salida de datos. y entre caracteres y fechas. además con la opción ServerOutput activada SQL*Plus llamará a DBMS_OUTPUT. Para mostrar una cadena de caracteres utilizamos la siguiente sentencia: DBMS_OUTPUT. De forma que la salida se visualizará en pantalla una vez completado el bloque PL/SQL. En caso de que el valor a mostrar no sea una cadena puedes utilizar la función TO_CHAR() para transformarlo.

Al ejecutarse una instrucción SQL como las anteriores nos mostrará un mensaje en el PROMPT pidiéndonos el valor de la variable: Enter value for num_emp: Enter value for nombre_emp: Especificaremos SET VERIFY OFF. si esta variable no está inicializada. Una variable de sustitución puede aparecer directamente en una sentencia SELECT sin necesidad de definirla. ACCEPT variable [NUMBER|CHAR|DATE] [FORMAT] format] [PROMPT text]] [HIDE] Para utilizar la variable accedemos a ella anteponiéndole a ella el símbolo &.  Entrada de datos. para formar una cadena con el literal sustituido). si lo que escribimos queremos considerarlo como caracteres o fechas la pondremos entre comillas. Cuando trabajamos pidiendo datos al usuario es habitual especificar la opción SET VERIFY OFF para evitar que el sistema nos muestre el valor que tenía la variable antes y que nos confirme el nuevo valor que toma. si no queremos que SQL nos muestre por pantalla el valor anterior que tenía la variable y el nuevo que toma. se le pedirá el valor al usuario: Página 13 . ACCEPT permite declarar una variable de SQL y leer su valor poniendo un mensaje en el PROMPT.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos  Una forma sencilla de leer valores de pantalla para utilizarlos puede ser con la instrucción SQL ACCEPT y variables de sustitución (variables disponibles en SQL distintas de las de PL/SQL). va precedida del símbolo & y SQL nos preguntará qué valor queremos asignarle (la variable es sustituida por el literal que escribamos. Para pedir datos al usuario se utiliza una variable de substitución. dentro del código fuente del bloque PL/SQL.

Ejemplo:  Sentencia GOTO.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Estructuras de control  Estructuras de control de flujo. En PL/SQL solo disponemos de la estructura condicional IF. Página 14 . Un aspecto a tener en cuenta es que la instrucción condicional anidada es ELSIF y no "ELSEIF". Su sintaxis se muestra a continuación.

En PL/SQL las etiquetas se ejecutan de este modo: << etiqueta >> El siguiente ejemplo ilustra el uso de GOTO.  LOOP  WHILE  FOR El bucle LOOP se repite tantas veces como sea necesario hasta que se fuerza su salida con la instrucción EXIT. Esta sentencia desvía el flujo de ejecución a una determinada etiqueta.  Bucles En PL/SQL tenemos los siguientes iteradores o bucles.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos PL/SQL dispone de la sentencia GOTO. Su sintaxis es la siguiente. Página 15 .

El bucle FOR se repite tantas veces como le indiquemos en los identificadores inicio y final. Por ejemplo:  Sentencia CASE La sintaxis de la estructura CASE es la siguiente. Página 16 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos El bucle WHILE se ejecuta mientras la expresión se cumpla. mientras la condición devuelva TRUE. es decir.

Por ejemplo: La cláusula ELSE de una instrucción CASE es opcional. sin embargo. Cuando una de las expresiones en los WHEN es cierta. PL/SQL mostrará el error predefinido CASE_NOT_FOUND. Si no ponemos esta cláusula y la expresión de comprobación no coincide con ninguno de los valores de comprobación. se ejecuta la secuencia de instrucciones asociada y el control pasa inmediatamente a la instrucción expresada a continuación de CASE. la instrucción CASE de búsqueda.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Donde test_var puede ser una variable o una expresión compleja que incluso podría contener llamadas a funciones. Las condiciones en las cláusulas WHEN son comprobadas secuencialmente. que se ejecuta si test_var no satisface ninguna de las expresiones. En cualquier caso. equivalente al error ORA6592. se evalúa una sola vez al principio de la ejecución de la instrucción CASE. Se puede también establecer una cláusula por defecto (la cláusula ELSE). por ejemplo: Página 17 . PL/SQL también ofrece la posibilidad de utilizar otra variante para definir las expresiones utilizadas en el CASE.

Página 18 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Funciones SQL predefinidas SQL proporciona funciona ya definidas que pueden ser usadas en sentencias SQL y muchas de ellas en sentencias procedimentales de PL/SQL. Estas funciones pueden ser clasificadas según qué tipo de argumento reciben. se realiza una conversión según las normas de coversión de tipos de PL/SQL A continuación se muestra una tabla con algunas de ellas. Si no se proporciona el tipo de argumento adecuado.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Página 19 .

Son más rápidos. Este tipo de cursores se utiliza para operaciones SELECT INTO.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Cursores en PL/SQL PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto por una instrucción SQL. Ocasionalmente también se utilizan en consultas que devuelven un único registro por razones de eficiencia. Se utilizan cuando la consulta devuelve un conjunto de registros. Se usan cuando la consulta devuelve un único registro. Los cursores implicitos no necesitan declaración. Podemos distinguir dos tipos de cursores: Cursores implicitos. Técnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT. Página 20 .  Cursores explicitos. Son los cursores que son declarados y controlados por el programador.  Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos convenios que cualquier otra variable.

variable que se tendrá que colocar después de la declaración del cursor. Para declarar un cursor explícito debemos utilizar la siguiente sintaxis: Se puede utilizar cualquier instrucción SELECT. Página 21 . 4. En una declaración de cursor de puede hacer referencia a variables PL/SQL. Los cuatro pasos para el procesamiento de cursores explícitos en PL/SQL son: 1. Cierre del cursor. 2. Apertura del cursor. Es por ello que los cursores se suelen definir al final del bloque declarativo. o más de una fila. El primero de los pasos es el único que se lleva a cabo en la sección declarativa de un bloque. Hay que tener en cuenta que la instrucción SELECT. es necesario que las variables que se utilicen en el cursor hayan sido declaradas antes. cuando se trata de cursores. incluyendo JOINS e instrucciones con clausulas UNION o MINUS. no contiene la instrucción INTO. 3. llamadas variables de acoplamiento: Para que esta declaración sea correcta. Los otros tres se encuentran en la sección ejecutable o en la de tratamiento de excepciones. Para procesar instrucciones SELECT que devuelvan más de una fila. Extracción de los resultados en variables PL/SQL. Declaración del cursor. Los cursores explícitos se emplean para realizar consultas SELECT que pueden devolver cero filas. salvo que se quiera declarar una variable de tipo cursor%ROWTYPE.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos  Procesamiento de cursores explícitos. son necesarios cursores explícitos combinados con una estructura de bloque.

 Se determina el conjunto activo. PL/SQL ejecutará implícitamente una orden CLOSE antes de reabrirlo. Los parámetros deben declararse junto con el cursor. Al abrir un cursor suceden tres cosas:  Se examinan los valores de las variables acopladas. El contenido de las variables de acoplamiento que se tiene en cuenta es aquel que tienen dichas variables en el momento de la apertura del cursor.  Se hace apuntar el puntero del conjunto activo a la primera fila. También podemos tener varios cursores abiertos al mismo tiempo. Fases para procesar una instrucción SQL La sintaxis para abrir un cursor es: OPEN nombre_cursor. El siguiente ejemplo muestra la declaración de un cursor con un parámetro. identificado por p_continente. Aunque dichas variables cambien después de la instrucción OPEN.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Un cursor admite el uso de parámetros. el conjunto de la consulta no Página 22 . El siguiente diagrama representa como se procesa una instrucción SQL a través de un cursor. Podemos reabrir un cursor que ya estaba abierto.

%ISOPEN y Página 23 . Cada instrucción FETCH devuelve el valor o valores asociados a una fila determinada del conjunto activo del cursor. Atributos de los cursores Existen cuatro atributos en PL/SQL que pueden aplicarse a los cursores para obtener valores sobre ellos. Los atributos son %FOUND. Ó  FETCH nombre_cursor INTO registro PL/SQL. También es ilegal cerrar un cursor que ya está cerrado (ORA-1001). la variable o variables de la clausula INTO deben ser compatibles en cuanto a tipo con la lista de selección de la consulta. Después de cada FETCH. Si se intenta hacerlo se reproduce el error ORACLE: ORA-1001: Invalid Cursor u ORA-1002: Fetch out of Sequence. Al atributo de cursores %NOTFOUND se utiliza para determinar cuándo se ha terminado de extraer todo el conjunto activo. se incrementa el puntero del conjunto activo para que apunte a la siguiente fila. Una vez que se cierra el cursor es ilegal realizar operaciones de extracción de datos sobre él. De esta forma con un bucle cada FETCH devolverá filas sucesivas del conjunto activo. Para poder utilizar valores de las variables de acoplamiento tendríamos que cerrar y volver a abrir el cursor. La sintaxis es: CLOSE nombre_cursor. no se podrá volver a abrir a menos que se cierre primero. Al ejecutarse una instrucción FETCH el cursor para a la siguiente fila. En ambos casos. Esta acción informa a PL/SQL de que el programa ha terminado de utilizar el cursor y de que se pueden liberar los recursos asociados a él. Cierre de un cursor Cuando se ha terminado de extraer el conjunto activo debe cerrarse el cursor. %NOTFOUND. Esta fila será la apuntada por el puntero de dicho conjunto. var2. ORACLE devuelve el error ORA-6511.…. Extracción de los datos de un cursor Existen dos posibles sintaxis:  FETCH nombre_cursor INTO var1. varN. Si se ejecuta una instrucción OPEN contra un cursor que ya está abierto. Una vez que se haya abierto el cursor.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos cambia.

*Número de registros que ha recuperado hasta el momento. Página 24 .  %ISOPEN: nos indica si el cursor está o no abierto.  %FOUND: es un atributo de forma opuesta a %FOUND. Los cursores implícitos solo pueden devolver una única fila. Toman los valores TRUE. ** Número total de registros.  %NOTFOUND: se comporta de forma opuesta a %FOUND.  Procesamiento de cursores implícitos.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos %ROWCOUNT. Este atributo se utiliza comúnmente como condición de salida para un bucle de extracción.  %ROWCOUNT: este atributo numérico devuelve el número de filas extraídas por el cursor hasta ese momento. FALSE o NULL dependiendo de la situación. Los cursores implícitos de utilizan para realizar consultas SELECT que devuelven un único registro. Este atributo se utiliza comúnmente como condición de salida para un bucle de extracción. Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores implícitos:    Con cada cursor implícito debe existir la palabra clave INTO. En caso de que se devuelva más de una fila (o ninguna fila) se producirá una excepción. Las variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tabla. Los atributos se unen al nombre del cursor y el resultado que devuelven es el siguiente.

…. Diferenciamos entre bucle simple o LOOP.. valor2. Para ello se utiliza un bucle de extracción. Se utilizan las instrucciones LOOP y END-LOOP de la siguiente forma: Página 25 . En el caso de los cursores parametrizados se utiliza la instrucción OPEN para pasar los valores reales al cursor: OPEN nom_cursor(valor1.  Bucles SIMPLES.argN tipoN) IS SELECT…. al igual que lo hacen las funciones y los procedimientos. Son las llamadas variables de acoplamiento. valorN). Ya hemos visto que podemos utilizar variables de bloque declarativo al definir nuestro cursor. WHILE y FOR. Bucles de extracción mediante cursor La operación más común que se puede realizar con un cursor consiste en extraer todas las filas del conjunto activo. Un cursor puede admitir argumentos. Existe otra manera de utilizar este tipo de información. La sintaxis es la siguiente.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos El siguiente ejemplo muestra un cursor implícito: La salida del programa generaría la siguiente línea: La lectura del cursor es: ESPAÑA  Cursores parametrizados. CURSOR nom_cursor (arg1 tipo1. arg2 tipo2. …. que no es más que un bucle que procesa una a una las filas del conjunto activo. .

 Bucles FOR de cursor. el bucle abre. También se puede construir un bucle de extracción mediante cursor utilizando la sintaxis siguiente: En este caso. Además de la variable registro. PL/SQL proporciona un tipo de bucle más simple. extrae los datos y cierra el cursor de manera implícita. El tipo de esta variable es cursor%ROWTYPE y su ámbito se extiende sólo al propio bucle FOR. Antes de que dé comienzo del bucle se abre el cursor. el EXIT WHEN se coloca justo antes del procesamiento de la fila recuperada. mediante las instrucciones OPEN. Hay dos detalles a tener en cuenta.  Bucles WHILE. Cuando termina el bucle.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Como se puede apreciar. En primer lugar. La sintaxis de los bucles FOR se puede simplificar aún más todavía. el cursor propiamente dicho se puede declarar implícitamente: Página 26 . la extracción de fila se hace justo después del procesamiento. FETCH y CLOSE. dentro del bucle. De esta manera. Los dos tipos anteriores requieren un procesamiento explícito del cursor. Antes de cada iteración del bucle se comprueba el atributo %FOUND para asegurarse de que aún quedan filas en el conjunto activo. la variable registro es declarada de modo implícito por el compilador PL/SQL. En segundo lugar. nos aseguramos de no procesar una fila inexistente. que realiza de modo implícito el procesamiento del cursor. se cierra el cursor.

usuario se declaran en la sección declarativa de un variables. Las excepciones se declaran en la sección declarativa de un bloque. Por ejemplo un error relativo a los datos.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Excepciones en PL/SQL En PL/SQL una advertencia o condición de error es llamada una excepción. Cualquier otra excepción será capturada en el bloque WHEN OTHERS THEN. Una excepción definida por el usuario es un error programa. Al igual que las (EXCEPTION) y un ámbito. Las excepciones se controlan dentro de su propio bloque. se generan en la sección ejecutable y se tratan en la sección de excepciones. Página 27 . La estructura de bloque de una excepción se muestra a continuación. Por e_demasiadosEstudiantes es un identificador que será visible hasta el final del bloque. El siguiente ejemplo muestra un bloque de excepciones que captura las excepciones NO_DATA_FOUND y ZERO_DIVIDE. Existen dos tipos de excepciones: definidas por el usuario y predefinidas. las excepciones tienen un tipo asociado ejemplo: cuya definciión se realiza en el Las excepciones deifnidas por el bloque PL/SQL.

Página 28 . Una vez finalizada la ejecución del bloque de EXCEPTION no se continúa ejecutando el bloque anterior. se ejecuta el bloque EXCEPTION. WHEN OTHERS debe ser el último manejador de excepciones. transfiriéndose el control a las sentencias del bloque. Estas mismas condiciones excepcionales tienen sus propio tipos y pueden ser referenciadas por ellos: ZERO_DIVIDE y STORAGE_ERROR. Las excepciones predefinidas no necesitan ser declaradas. Si existe un bloque de excepción apropiado para el tipo de excepción se ejecuta dicho bloque. Las excepciones pueden ser definidas en forma interna o explícitamente por el usuario. También provee claridad en el código ya que permite mantener las rutinas correspondientes al tratamiento de los errores de forma separada de la lógica del negocio. Simplemente se utilizan cuando estas son lanzadas por algún error determinado. Excepciones predefinidas. Ejemplos de excepciones definidas en forma interna son la división por cero y la falta de memoria en tiempo de ejecución. Con las excepciones se pueden manejar los errores cómodamente sin necesidad de mantener múltiples chequeos por cada sentencia escrita. Si no existe un bloque de control de excepciones adecuado al tipo de excepción se ejecutará el bloque de excepción WHEN OTHERS THEN (si existe!). Las excepciones definidas por el usuario deben ser alcanzadas explícitamente utilizando la sentencia RAISE. PL/SQL proporciona un gran número de excepciones predefinidas que permiten controlar las condiciones de error más habituales.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Como ya hemos dicho cuando ocurre un error.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos En la siguiente tabla se puede encontrar una lista de excepciones predefinidas más frecuentes: Página 29 .

las que deberán ser declaradas y lanzadas explícitamente utilizando la sentencia RAISE. Página 30 . subprograma o paquete. Una vez que pasa el control a la rutina de tratamiento de excepciones. Se declara una excepción como cualquier otra variable. no hay forma de volver a la sección ejecutable del bloque.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos - Excepciones definidas por el usuario. PL/SQL permite al usuario definir sus propias excepciones. Si no hay sección de excepciones. Las mismas reglas de alcance aplican tanto sobre variables como sobre las excepciones. Las excepciones deben ser declaradas en el segmento DECLARE de un bloque. asignándole el tipo EXCEPTION. la excepción se propaga al bloque de nivel superior. Ejemplo: Cuando se genera una excepción. el control pasa inmediatamente a la sección de excepciones del bloque.

una excepción declarada en un bloque es local a ese bloque y global a todos los sub-bloques que comprende. Las excepciones predefinidas son siempre válidas. Como las variables. es decir el bloque o programa donde ha sido declarada. Una excepción es válida dentro de su ámbito de alcance. Con la sentencia RAISE podemos lanzar una excepción definida por el usuario o predefinida. Página 31 . Reglas de alcance. La excepción se genera porque la columna id de la tabla es una clave primaria. La sentencia RAISE permite lanzar una excepción en forma explícita. y el segundo INSERT intenta insertar un registro con el mismo valor de clave. La sentencia RAISE. siendo el comportamiento habitual lanzar excepciones definidas por el usuario. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepción. Por ejemplo: Este bloque generará la excepción DUP_VAL_ON_INDEX (violación de una restricción de unicidad).Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Las excepciones predefinidas se generan automáticamente cuando tiene lugar el error Oracle asociado.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Recordar la existencia de la excepción OTHERS. SQLCode devuelve el número del error de Oracle y un 0 (cero) en caso de éxito al ejecutarse una sentencia SQL. para aclarar el significado de la excepción OTHERS. es común observar la sentencia ROLLBACK en el grupo de sentencias de la excepción o alguna de las funciones SQLCODE – SQLERRM. Estas funciones no pueden ser utilizadas directamente en una sentencia SQL. que se detallan en el próximo punto. Uso de SQLCODE y SQLERRM. SQLERRM devuelve el correspondiente mensaje de error. Al manejar una excepción es posible usar las funciones predefinidas SQLCode y SQLERRM para aclarar al usuario la situación de error acontecida. En ese caso. que simboliza cualquier condición de excepción que no ha sido declarada. Por otra parte. Estas funciones son muy útiles cuando se utilizan en el bloque de excepciones. pero sí se puede asignar su valor a alguna variable de programa y luego usar esta última en alguna sentencia. Página 32 . Se utiliza comúnmente para controlar cualquier tipo de error que no ha sido previsto.

podemos modificar el código anterior para tratar la excepción añadiendo el siguiente código: Página 33 . Esta sección está compuesta por rutinas de tratamiento para las distintas excepciones.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos También es posible entregarle a la función SQLERRM un número negativo que represente un error de Oracle y ésta devolverá el mensaje asociado. Una rutina de tratamiento de excepciones contiene el código que se ejecutará cuando ocurra el error asociado con la excepción y ésta sea generada. Cuando se genera una excepción. Por ejemplo. La sintaxis de la sección de excepciones es la siguiente: Cada rutina de tratamiento de excepciones está formada por la cláusula WHEN y las instrucciones que se ejecutarán cuando la excepción sea generada. - Tratamiento de excepciones. el control pasa a la sección de excepciones del bloque. La cláusula WHEN identifica la excepción correspondiente a cada rutina de tratamiento.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Una misma rutina de tratamiento puede utilizarse para más de una excepción. Debe ser siempre la última rutina de tratamiento del bloque. Para ello es necesario utilizar la instrucción RAISE_APPLICATION_ERROR. más específicas. Siendo:   error_num es un entero negativo comprendido entre -20001 y -20999 mensaje la descripcion del error Página 34 . En ocasiones queremos enviar un mensaje de error personalizado al producirse una excepción PL/SQL. el compilador PL/SQL generaría el error PLS-483. Si hubiera más de una rutina de tratamiento para una excepción. Excepciones personalizadas en PL/SQL.<mensaje>). La sintaxis general es la siguiente: RAISE_APPLICATION_ERROR(<error_num>. con sólo enumerar los nombres de las excepciones en la cláusula WHEN. La rutina WHEN OTHERS se ejecutará para todas las excepciones que se generen y que no sean tratadas por ninguna otra cláusula WHEN definida en la sección de excepciones actual. de modo que todas las rutinas de tratamiento anteriores. WHEN OTHERS interceptará todos los errores. ya sean definidos por el usuario o predefinidos. separadas por OR: Una excepción determinada puede ser tratada como máximo por una rutina de tratamiento en una sección de excepciones. sean examinadas primero.

Al especificar el tipo de dato del parámetro no debemos especificar la longitud del tipo. Debemos especificar el tipo de datos de cada parámetro. Triggers. un error. Página 35 . Funciones. - Procedimientos almacenados.. Los subprogramas pueden ser de varios tipos:     Procedimientos almacenados. Un procedimiento tiene un nombre. y el procedimiento existe. un conjunto de parámetros (opcional) y un bloque de código.. Un procedimiento es un subprograma que ejecuta una acción específica y que no devuelve ningún valor. salvo porque se reemplaza la sección DECLARE por la secuencia PROCEDURE. IS en la especificación del procedimiento.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Subprogramas en PL/SQL Como hemos visto anteriormente los bloques de PL/SQL pueden ser bloques anónimos (scripts) y subprogramas. La sintaxis de un procedimiento almacenado es la siguiente: El uso de OR REPLACE permite sobrescribir un procedimiento existente. Subprogramas en bloques anónimos. se producirá. Los subprogramas pueden recibir parámetros. Los subprogramas son bloques de PL/SQL a los que asignamos un nombre identificativo y que normalmente almacenamos en la propia base de datos para su posterior ejecución. La sintaxis es muy parecida a la de un bloque anónimo. Si se omite.

Si el sistema nos indica que el procedimiento se ha creado con errores de compilación podemos ver estos errores de compilación con la orden SHOW ERRORS en SQL *Plus. y se toma ese valor en caso de que no especifiquemos nada. de salida (OUT) o de entrada salida (IN OUT). Estas son: Página 36 . También podemos asignar un valor por defecto a los parámetros. Existen dos formas de pasar argumentos a un procedimiento almacenado a la hora de ejecutarlo (en realidad es válido para cualquier subprograma).Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Los parámetros pueden ser de entrada (IN). El valor por defecto es IN. Una vez creado y compilado el procedimiento almacenado podemos ejecutarlo. utilizando la clausula DEFAULT o el operador de asiganción (:=) .

Página 37 . un error. se producirá. La única diferencia entre una función y un procedimiento es que la función devuelve un valor. la llamada a una función se produce como parte de una expresión. - Funciones en PL/SQL. Por lo cual.  Notación nominal: Se pasan los valores en cualquier orden nombrando explícitamente el parámetro. La sintaxis de los parámetros es la misma que en los procedimientos almacenado. mientras que la llamada a un procedimiento es una instrucción PL/SQL en sí misma. Si se omite. La sintaxis para construir funciones es la siguiente: El uso de OR REPLACE permite sobrescribir una función existente.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos  Notación posicional: Se pasan los valores de los parámetros en el mismo orden en que el procedimiento los define. exceptuando que solo pueden ser de entrada. y la función existe.

Página 38 . INSERT y DELETE): - Triggers en PL/SQL.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Ejemplo: Si el sistema nos indica que el la función se ha creado con errores de compilación podemos ver estos errores de compilación con la orden SHOW ERRORS en SQL *Plus. UPDATE o DELETE) sobre dicha tabla. UPDATE. que se ejecuta como consecuencia de una determinada instrucción SQL (una operación DML: INSERT. Un trigger es un bloque PL/SQL asociado a una tabla. Una vez creada y compilada la función podemos ejecutarla de la siguiente forma: Las funciones pueden utilizarse en sentencias SQL de manipulación de datos (SELECT.

El modificador FOR EACH ROW indica que el trigger se disparará cada vez que se realizan operaciones sobre una fila de la tabla. UPDATE o DELETE. Si se acompaña del modificador WHEN. y el trigger existe. y pueden ejecutarse antes o después de la operación. Si se omite. el trigger solo actuará. se establece una restricción. El modificador BEFORE AFTER indica que el trigger se ejecutará antes o despues de ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos La sintaxis para crear un trigger es la siguiente: El uso de OR REPLACE permite sobrescribir un trigger existente. El alcance de los disparadores puede ser la fila o de orden. sobre las filas que satisfagan la restricción. La cláusula WHEN sólo es válida para los disparadores con nivel de fila. Los triggers pueden definirse para las operaciones INSERT. La siguiente tabla resume los contenidos anteriores. Página 39 . un error. se producirá. Si incluimos el modificador OF el trigger solo se ejecutará cuando la sentencia SQL afecte a los campos incluidos en la lista.

o Se ejecuta la propia orden. Para cada fila a la que afecte la orden: o Se ejecuta si existe. Orden de ejecución de los triggers Una misma tabla puede tener varios triggers. Se ejecuta. actualizando o borrando. si existe. Los disparadores se activan al ejecutarse la sentencia SQL. el disparador de tipo AFTER (disparador posterior) con nivel de fila. Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL. el disparador de tipo AFTER con nivel de orden. el disparador de tipo BEFORE con nivel de fila. UPDATE. o Se ejecuta si existe. En tal caso es necesario conocer el orden en el que se van a ejecutar.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Dentro del ámbito de un trigger disponemos de las variables OLD y NEW. con la salvedad de que no es necesario declararlas. DELTE) que ha ejecutado el trigger. son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y después (NEW) de la acción SQL (INSERT.    Si existe. El siguiente ejemplo muestra un trigger que inserta un registro en la tabla PRECIOS_PRODUCTOS cada vez que insertamos un nuevo registro en la tabla PRODUTOS: El trigger se ejecutará cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT. se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de orden. Página 40 . Utilizando esta variable podemos acceder a los datos que se están insertando.

Los registros OLD y NEW son sólo válidos dentro de los disparadores con nivel de fila. UPDATE. ROLLBACK o SAVEPOINT. ningún procedimiento o función llamado por el disparador puede emitir órdenes de control de transacciones.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Restricciones de los triggers El cuerpo de un trigger es un bloque PL/SQL. Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL. actualizando o borrando. Cualquier orden que sea legal en un bloque PL/SQL. El cuerpo del disparador no puede contener ninguna declaración de variables LONG o LONG RAW Utilización de :OLD y :NEW Dentro del ámbito de un trigger disponemos de las variables OLD y NEW. hay tres funciones booleanas que pueden emplearse para determinar de qué operación se trata. Página 41 . La siguiente tabla muestra los valores de OLD y NEW. Cuando la orden que provoca el disparo es confirmada o cancelada. Estos predicados son INSERTING. UPDATE y DELETE). Utilización de predicados de los triggers: INSERTING. Por razones idénticas. DELTE) que ha ejecutado el trigger. El disparador se activa como parte de la ejecución de la orden que provocó el disparo. UPDATING y DELETING. es legal en el cuerpo de un disparador. y forma parte de la misma transacción que dicha orden. se confirma o cancela también el trabajo realizado por el disparador. con la salvedad de que no es necesario declararlas. Podemos usar OLD y NEW como cualquier otra variable PL/SQL. Utilizando esta variable podemos acceder a los datos que se están insertando. son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y después (NEW) de la acción SQL (INSERT. UPDATING y DELETING Dentro de un disparador en el que se disparan distintos tipos de órdenes DML (INSERT. con las siguientes restricciones:    Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT.

Este tipo de subprogramas son menos conocidos que los procedimientos almacenados. Nótese que se utiliza la función TO_CHAR para convertir el resultado de la función fn_multiplica_x2 (numérico) en alfanumérico y poder mostrar el resultado por pantalla. pero son enormemente útiles.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Su comportamiento es el siguiente: Subprogramas en bloques anónimos Dentro de la sección DECLARE de un bloque anónimo podemos declarar funciones y procedimientos almacenados y ejecutarlos desde el bloque de ejecución del script. Página 42 . funciones y triggers. El siguiente ejemplo declara y ejecuta utiliza una funcion (fn_multiplica_x2).

funciones. tipos. En ella es posible declarar los tipos. funciones. Los objetos declarados en la especificación del paquete son accesibles desde fuera del paquete por otro script de PL/SQL o programa. Página 43 . Para crear la especificación de un paquete la sintaxis general es la siguiente: El cuerpo en la implementación del paquete.). variables. La sintaxis general para crear el cuerpo de un paquete es muy parecida a la de la especificación. la especificación es como el archivo de cabecera de un programa en C. y se implementa el código de los subprogramas. tan solo se añade la palabra clave BODY. Haciendo una analogía con el mundo de C. variables. La especificación es la interfaz con las aplicaciones. La especificación del un paquete y su cuerpo se crean por separado.) en la base de datos.. El cuerpo del paquete debe implementar lo que se declaró inicialmente en la especificación. no se implementa el código. En la especificación del paquete sólo se declaran los objetos (procedures. En el cuerpo de un paquete podemos declarar nuevos subprogramas y tipos. Esto nos permite agrupar la funcionalidad de los procesos en programas... constantes. pero estos serán privados para el propio paquete.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Paquetes en PL/SQL Un paquete es una estructura que agrupa objetos de PL/SQL compilados (procedures. variables.. cursores y subprogramas disponibles para su uso posterior desde fuera del paquete. Lo primero que debemos tener en cuenta es que los paquetes están formados por dos partes: la especificación y el cuerpo. excepciones. Es el donde debemos escribir el código de los subprogramas.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos El siguiente ejemplo crea un paquete llamado PKG_CONTABILIDAD. Página 44 .

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Para crear la especificación del paquete: Página 45 .

Es en el cuerpo del paquete cuando escribimos el código de los subprogramas Contabilizar y fn_Obtener_Saldo. Página 46 . prototipado las funciones y procedimientos públicos. Es posible modificar el cuerpo de un paquete sin necesidad de alterar por ello la especificación del mismo. Los paquetes pueden llegar a ser programas muy complejos y suelen almacenar gran parte de la lógica de negocio.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Aquí sólo hemos declarado las variables y constantes.

cada uno de los cuales tiene su propio nombre y tipo y que se tratan como una sola unidad lógica. omitimos intencionadamente ciertos tipos de datos.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Registros PL/SQL Cuando vimos los tipos de datos. La sintaxis general es la siguiente: Los registros son un tipo de datos. se inicializarán a NULL. Página 47 . Estos son:    Registros Tablas de PL/SQL VARRAY Declaración de un registro. Los campos de un registro pueden ser inicializados y pueden ser definidos como NOT NULL. almacenados en campos. Un registro es una estructura de datos en PL/SQL. por lo que podremos declarar variables de dicho tipo de datos. Aquellos campos que no sean inicializados explícitamente.

Tiene dos componentes: Un índice de tipo BINARY_INTEGER que permite acceder a los elementos en la tabla PL/SQL y una columna de escalares o registros que contiene los valores de la tabla PL/SQL Puede incrementar su tamaño dinámicamente. La sintaxis general para declarar una tabla de PL es la siguiente: Una vez que hemos definido el tipo. Tablas PL/SQL. El rango de binary integer es –2147483647. lo cual indica que el índice del primer valor no tiene que ser necesariamente el cero. Una tabla PL/SQL:    Es similar a un array. 2147483647. Página 48 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Los registros pueden estar anidados. No es posible inicializar las tablas en la inicialización. por lo tanto el índice puede ser negativo. podemos declarar variables y asignarle valores. Es posible declarar elementos de una tabla PL/SQL como de tipo registro. Las tablas de PL/SQL son tipos de datos que nos permiten almacenar varios valores del mismo tipo de datos. Es decir. un campo de un registro puede ser de un tipo de dato de otro registro..

Definición de VARRAYS Un varray se manipula de forma muy similar a las tablas de PL. Devuelve el menor índice de la tabla. DELETE. Los elementos en el varray se almacenan comenzando en el índice 1 hasta la longitud máxima declarada en el tipo varray.n) borra los elementos entre m y n. La sintaxis general es la siguiente: TYPE <nombre_tipo> IS VARRAY (<tamaño_maximo>) OF <tipo_elementos>. NULL si está vacía. Cuando trabajamos con tablas de PL podemos utilizar las siguientes funciones:         FIRST. Devolverá TRUE si en el índice i hay un valor. Para inicializar un VARRAY se utiliza un constructor (podemos inicializar el VARRAY en la sección DECLARE o bien dentro del cuerpo del bloque): Página 49 . EXISTS(i). DELETE(m. Borra todos los elementos de la tabla PL/SQL. Una consideración a tener en cuenta es que en la declaración de un varray el tipo de datos no puede ser de los siguientes tipos de datos:        BOOLEAN NCHAR NCLOB NVARCHAR(n) REF CURSOR TABLE VARRAY Sin embargo se puede especificar el tipo utilizando los atributos %TYPE y %ROWTYPE.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos - Funciones para el manejo de tablas PL/SQL. TRIM(n) borra n elementos del final de la tabla PL/SQL. LAST. Borra un elemento del final de la tabla PL/SQL. TRIM. pero se implementa de forma diferente. DELETE(n) borra el correspondiente al índice n. NULL si está vacía. Los VARRAY deben estar inicializados antes de poder utilizarse. Devuelve el mayor índice de la tabla. Utilizada para saber si en un cierto índice hay almacenado un valor.

Devuelve el número máximo de elementos que admite el VARRAY. si declaramos un VARRAY de cinco elementos pero al inicializarlo pasamos sólo tres parámetros al constructor. La sintaxis general es: CREATE [OR REPLACE] TYPE <nombre_tipo> IS VARRAY (<tamaño_maximo>) OF <tipo_elementos>.Añade (n) elementos al VARRAY. EXTEND(n) . pero nunca con mayor dimensión que la definida en la declaración del tipo. un varray sólo puede manipularse en su integridad. pero añade las siguientes:    LIMIT . EXTEND . El tamaño de un VARRAY podrá aumentarse utilizando la función EXTEND. no pudiendo modificarse sus elementos individuales de un varray. Si se hacen asignaciones a elementos que queden fuera del rango se producirá un error. Página 50 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos El tamaño de un VARRAY se establece mediante el número de parámetros utilizados en el constructor. la variable v_lista que sólo tiene 3 valores definidos por lo que se podría ampliar hasta cinco elementos pero no más allá. Sin embargo. Varrays en la base de datos Los VARRAYS pueden almacenarse en las columnas de la base de datos.Añade un elemento al VARRAY. el tamaño del VARRAY será tres. Para poder crear tablas con campos de tipo VARRAY debemos crear el VARRAY como un objeto de la base de datos. Por ejemplo. Un VARRAY comparte con las tablas de PL todas las funciones válidas para ellas.

Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Una vez que hayamos creado el tipo sobre la base de datos. por lo que optimizaremos el rendimiento de nuestras aplicaciones.. podremos utilizarlo como un tipo de datos más en la creación de tablas. Luego se modifica la variable y se vuelve a almacenar en la tabla.. declaración de variables.. Página 51 . primero hay que seleccionarlo en una variable PL/SQL. BULK COLLECT PL/SQL nos permite leer varios registros en una tabla de PL con un único acceso a través de la instrucción BULK COLLECT. Véase el siguiente ejemplo: Para modificar un varray almacenado. Esto nos permitirá reducir el número de accesos a disco. Como contrapartida el consumo de memoria será mayor.

actualizar los saldos. confirmándose o deshaciéndose en grupo. . En estos casos. al confirmar la transacción (COMMIT) o al deshacerla (ROLLBACK) garantizamos que todos los datos quedan en un estado consistente. Cuando realizamos COMMIT los cambios se escriben en la base de datos. sentencias SELECT.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Transacciones con PL/SQL Una transacción es un conjunto de operaciones que se ejecutan en una base de datos. es decir. Página 52 . INSERT.. Para realizar una transferencia de dinero entre dos cuentas bancarias debemos descontar el dinero de una cuenta.. y que son tratadas como una única unidad lógica por el SGBD. todas estas operaciones deben ser correctas o fallar todas. una transacción es una o varias sentencias SQL que se ejecutan en una base de datos como una única operación. Por lo tanto. Un ejemplo clásico de transacción son las transferencias bancarias. Es decir. realizar el ingreso en la otra cuenta y grabar las operaciones y movimientos necesarios. Sólo son transaccionales las operaciones correspondientes al DML. En una transacción los datos modificados no son visibles por el resto de usuarios hasta que se confirme la transacción. No todas las operaciones SQL son transaccionales.Si en alguno de estos puntos se produce un fallo en el sistema podríamos hacer descontado el dinero de una de las cuentas y no haberlo ingresado en la otra. quedando la base de datos en el mismo estado que antes de iniciarse la transacción. Cuando realizamos ROLLBACK se deshacen todas las modificaciones realizadas por la transacción en la base de datos. UPDATE y DELETE Para confirmar una transacción se utiliza la sentencia COMMIT. Para deshacer una transacción se utiliza la sentencia ROLLBACK.

Siempre debemos especificar si que queremos deshacer o confirmar la transacción. Con esta directiva marcamos el subprograma para que se comporte como transacción diferente a la del proceso principal. PL/SQL permite marcar un bloque con PRAGMA AUTONOMOUS_TRANSACTION. llevando el control de COMMIT o ROLLBACK independiente. las operaciones que realiza el trigger están dentro del ámbito de la transacción. Transacciones autónomas En ocasiones es necesario que los datos escritos por parte de una transacción sean persistentes a pesar de que la transacción se deshaga con ROLLBACK.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos El siguiente ejemplo muestra una supuesta transacción bancaria: Si alguna de las tablas afectadas por la transacción tiene triggers. una segunda transacción no podrá ver los cambios realizados por la primera transacción hasta que esta se confirme. y son confirmadas o deshechas conjuntamente con la transacción. ORACLE es completamente transaccional. Página 53 . Durante la ejecución de una transacción.

por ejemplo. PL/SQL y JAVA Otra de las virtudes de PL/SQL es que permite trabajar conjuntamente con Java. ORACLE incorpora su propia versión de la máquina virtual Java y del JRE. Esta versión de Java se instala conjuntamente con ORACLE. trabajar con Sockets. en caso de que se produzca algún tipo de error queramos insertar un registro en una tabla de log con el error que se ha producido y hacer ROLLBACK de la transacción. podemos necesitar de un lenguaje de programación más potente. Por ejemplo podríamos necesitar consumir un servicio Web.. Primero creamos un procedimiento y lo marcamos con PRAGMA AUTONOMOUS_TRANSACTION. Es muy común que. PL/SQL es un excelente lenguaje para la gestión de información pero en ocasiones.. Pero si hacemos ROLLBACK de la transacción también lo hacemos de la inserción del log. conectar a otro servidor.. Para estos casos podemos trabajar conjuntamente con PL/SQL y Java.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Obsérvese el siguiente ejemplo. Página 54 . Crear un programa de recubrimiento (Wrapper) de PL/SQL. Para poder trabajar con Java y PL/SQL debemos realizar los siguientes pasos:   Crear el programa Java y cargarlo en la base de datos. Creación de Objetos Java en la base de datos ORACLE. Para crear objetos Java en la base de datos podemos utilizar la utilidad LoadJava de ORACLE desde línea de comandos o bien crear objetos JAVA SOURCE en la propia base de datos.

Página 55 .Introducción al lenguaje PL/SQL Asignatura: Bases de Datos La sintaxis para la creación de JAVA SOURCE en ORACLE es la siguiente. Un aspecto muy a tener en cuenta es que los métodos de la clase java que queramos invocar desde PL/SQL deben ser estáticos. El siguiente ejemplo crea y compila una clase Java OracleJavaClass en el interior de JAVA SOURCE FuentesJava. Un mismo JAVA SOURCE puede contener varias clases de Java.

podremos ejecutarlo como cualquier otra funcion o procedimiento de PL/SQL.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos La otra opción sería guardar nuestro código java en el archivo OracleJavaClass. internamente se ejecutará la clase java y se invocará el método estático "OracleJavaClass. Cuando ejecutemos el wrapper.lang. Esto se realiza a través de subprogramas de recubrimiento llamados Wrappers. es decir. Una vez creado el wrapper. Página 56 . La sintaxis general es la siguiente: El siguiente ejemplo muestra el Wrapper para nuestra función Saludo. A continuación se muestran ejemplos del uso de la utilidad LoadJava: - Ejecución de programas Java con PL/SQL Una vez que tenemos listo el programa de Java debemos integrarlo con PL/SQL. la función "Saluda_wrap". Un aspecto a tener en cuenta es que es necesario proporcionar el nombre del tipo java completo. No podemos crear un Wrapper en un bloque anónimo.Saluda". compilarlo y cargarlo en ORACLE con LoadJava.String en lugar de únicamente String. debemos especificar java.java. Debemos crear un wrapper por cada función java que queramos ejecutar desde PL/SQL. es decir.

devjoker. Tercero Ingeniería Técnica en Informática de Gestión (Universidad Pablo de Olavide). Página 57 . Página web: http://www.com Manual de introducción a PL/SQL de Miguel Ángel Galdón Romero. Bibliografía    Apuntes asignatura ‘Ampliación de Bases de Datos’. deberíamos cargarlos en la base de datos con la utilidad LoadJava.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos La ejecución de este ejemplo en SQL*Plus genera la siguiente salida: Una recomendación de diseño sería agrupar todos los Wrapper en un mismo paquete. En el caso de que nuestro programa Java necesitase de packages Java adicionales.

0 Unported Usted es libre de:  copiar. distribuir y comunicar públicamente la obra  hacer obras derivadas Bajo las condiciones siguientes:  Reconocimiento.    Al reutilizar o distribuir la obra. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra). tiene que dejar bien claro los términos de la licencia de esta obra. Página 58 . No puede utilizar esta obra para fines comerciales. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Nada en esta licencia menoscaba o restringe los derechos morales del autor.Introducción al lenguaje PL/SQL Asignatura: Bases de Datos Licencia Reconocimiento-No comercial 3.  No comercial.

Sign up to vote on this title
UsefulNot useful