Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PL SQL
Es un lenguaje de programacin que se utiliza para acceder a las base de datos Oracle desde distintos entornos. Su utilizacin es dentro del administrador de bases de datos Oracle y sus principales caractersticas son:
La posibilidad de utilizar sentencias SQL para manipular datos en Oracle Sentencias de control de flujo para organizar esta manipulacin de datos.
PL SQL
Dentro del lenguaje, es posible declarar constantes y variables, definir procedimientos y funciones y atrapar errores en tiempo de ejecucin
SQL
SQL
SQL
SQL . SQL .
Aplicacin Cliente
Aplicacin Cliente
Requisitos previos
Poseer conocimientos de diseo de base de datos relacionales. As como del lenguaje SQL Y conocer mnimamente los fundamentos de la Programacin estructurada.
Las tablas estn compuestas por filas y columnas. Las filas y las columnas, en principio, carecen de orden
Las filas slo se ordenan si se le indica a la base de datos que lo haga, mediante el correspondiente comando. De no ser as, el orden ser arbitrario, y puede cambiar en caso de tratarse de una base datos dinmica. El orden de las columnas lo determina cada consulta.
Entidades Atributos Interrelaciones Cardinalidades Mnimas y mximas en las interrelaciones Generalizaciones Identificadores
Las Entidades
Son los objetos principales en el modelo E-R que representan objetos, personas, cosas o eventos de inters sobre las que se quiere almacenar informacin relevante. En el diagrama E-R las entidades se representan mediante rectngulos.
Los Atributos
Se utilizan para detallar las entidades asignndoles propiedades descriptivas tales como color, nombre y peso Existen dos tipos de atributos:
Las Entidades
Las Interrelaciones
Una relacin es una asociacin o relacin matemtica entre varias entidades Las Interrelaciones se caracterizan por su nombre, grado (numero de entidades que participan en la Interrelacin) y al cardinalidad (nmero de instancias o elementos de una entidad que pueden asociarse a un elemento de la otra entidad relacionada ) Se representan en el diagrama E-R mediante flechas y rombos.
Las cardinalidades
Se definen las cardinalidades mnimas y mximas que intervienen en una relacin como el numero mnimo y mximo de una ocurrencia de una entidad que puedan relacionarse con una nica ocurrencia de otra u otras entidades. Grficamente se representan en el Modelo E-R con una etiqueta (0,1),(0,n),(1,1),(1,n),(n,n), situada en la lnea que conecta la entidad con el rombo que representa el tipo de relacin. Ejemplo
(n,1)
(1,n)
PROYECTO
PARTICIPA
(0,1)
EMPLEADO
LA RELACION INDICA QUE SOLO UN EMPLEADO PUEDE PARTICIPAR EN UN PROYECTO Y QUE HAY EMPLEADOS QUE NO PARTICIPAN EN PROYECTOS Y QUE EN UN PROYECTO OBLIGATORIAMENTE DEBE HABER POR LO MENOS UN EMPLEADO Y QUE COMO MAXIMO HABRAN MUCHOS EMPLEADOS
2.
3.
Una a una (1:1) : PAIS y CAPITAL. Una a muchas (1:N): CLIENTE y PEDIDOS. Muchas a muchas (N:N). : PERSONAS y VIVIENDAS
Generalizaciones
Nos permiten especializar una entidad (que se denominar supertipo) en subtipos, o tambin se puede decir generalizar los subtipos en un supertipo. Normalmente se utiliza la jerarqua es_un de las redes semnticas para identificar las generalizaciones. Un supertipo es_un subtipo.
Si un programador es un empleado y una secretaria es un empleado, entonces podramos decir que el tipo de entidad PROGRAMADOR y SECRETARIA es un subtipo de entidad EMPLEADO; o de manera equivalente, que el tipo de entidad EMPLEADO es un supertipo de la entidad PROGRAMADOR Y SECRETARIA.
Para identificar las generalizaciones hay que encontrar una serie de atributos comunes a todas las entidades que intervienen en la generalizacin. Estos atributos comunes describirn al supertipo y los compartir el subtipo; y los atributos particulares describirn al subtipo pero no los compartir el supertipo.
En el ejemplo anterior todas las propiedades de EMPLEADO se aplican a los programadores y secretaria pero no sucede lo contrario. Las propiedades que se aplican al supertipo son heredados por el subtipo.
En el ejemplo anterior se muestra una generalizacin total porque no existen EMPLEADOS que no sean ni INGENIEROS, ni SECRETARIAS, ni TECNICOS; adems, es una generalizacin exclusiva, es decir, un EMPLEADO es un INGENIERO, o SECRETARIA o TECNICO pero no puede ser varias cosas a la vez
Identificadores
Es uno o varios atributos de una entidad (o de varias entidades) que tiene la propiedad de identificar en forma nica todas las ocurrencias (registros) de una entidad. Los identificadores se clasifican: Identificador interno simple: Cuando est formado por un solo atributo, y ste pertenece a la entidad.
Identificador interno compuesto: Cuando est formado por ms de un atributo, y stos pertenecen a la entidad. Identificador externo simple: Cuando est formado por un solo atributo, y ste no pertenece a la entidad. Identificador externo compuesto: Cuando est formado por ms de un atributo, y stos pertenecen a otra entidad.
Identificador Mixto: Cuando est formado por ms de un atributo, y stos pertenecen a ms de una entidad.
Identificar las entidades y las interrelaciones que debe presentar la base de datos. Determinar las cardinalidades de las interrelaciones establecidas entre las distintas entidades y clasificar estas interrelaciones entre los siguientes tipos:
Uno a uno (p.ej., una parcela slo tiene una direccin). Uno a muchos (p.ej., en una parcela pueden ocurrir varios incendios). Muchos a muchos (p.ej., la venta de parcelas: una misma parcela la pueden vender varios propietarios y cada propietario puede vender varias parcelas).
Dibujar el diagrama Entidad/Interrelacin. Determinar los atributos de cada entidad. Definir la clave primaria (nica) de cada entidad.
Importancia
SQL es un lenguaje formal que se utiliza para manipular informacin y el esquema en una base de datos.
Hoy en da las bases de datos relacionales estn implementadas en casi todas las empresas; el SQL toma una gran importancia desde este punto de vista; adems su fcil comprensin y su facilidad para obtener informacin en forma ordenada y ocupando poco espacio lo han hecho el lenguaje de manipulacin de informacin de bases de datos ms extendido.
DDL (Lenguaje de Definicin de Datos) Permiten crear y definir nuevas bases de datos, tablas, campos y restricciones. Lo forman las instrucciones CREATE, ALTER, DROP y RENAME
DML (Lenguaje de Manipulacin de Datos) Permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos; adems insertar y actualizar informacin. Lo forman las instrucciones SELECT, INSERT, UPDATE, MERGE y DELETE.
Comandos Sql
DCL (Lenguaje de Control de Datos) Administran los derechos y restricciones de los usuarios. Lo forman las instrucciones GRANT y REVOKE.
INSTRUCCIONES DE TRANSFERENCIA Administran las modificaciones creadas por las instrucciones DML. Lo forman las instrucciones ROLLBACK, COMMIT y SAVEPOINT
CREATE
CREATE TABLE nombre Tabla (nombre_campo1 Tipo_de_variable [(tamao)] [Null/Not Null] [Primay Key] [Check (condicin)], nombre_campo2 Tipo_de_variable [(tamao)] [Null/Not Null] [FOREIGN KEY(Clave Secundaria) REFERENCES Tabla_Primaria(Clave_Primaria_Tabla_Primaria1), [CONSTRAINT pk_NombreRestriccion PRIMARY KEY (clave1, clave2)], [CONSTRAINT fk_NombreRestriccion FOREIGN KEY (clave secundaria) REFERENCES TablaPrimaria(ClavePrimaria)], etc... );
RESTRICIONES
Una restriccin es una condicin de obligado cumplimiento para una o ms columnas de la tabla. A cada restriccin se le pone un nombre, en el caso de no poner un nombre (en las que eso sea posible) entonces el propio Oracle le coloca el nombre.
Sintaxis
CREATE TABLE nombreTabla | ALTER TABLE nombreTabla {ADD | MODIFY} (campo tipo [propiedades] [,...] CONSTRAINT nombreRestriccin tipoRestriccin (columnas) [,CONSTRAINT nombrerestriccin tipoRestriccin (columnas) ...)
CREATE TABLE cliente( dni VARCHAR2(9) PRIMARY KEY, nombre VARCHAR(50)) ; CREATE TABLE cliente( dni VARCHAR2(9) CONSTRAINT cliente_pk PRIMARY KEY, nombre VARCHAR(50)) ; CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula) ;
CREATE TABLE Clientes ( Cli_Cod Integer Not Null Primary Key, Cli_Descripcion Varchar2(30) Not Null, Cli_Direccion Varchar2(30) Not Null );
CLAVE FORANEA
CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula), CONSTRAINT dni_fk FOREIGN KEY (dni) REFERENCES clientes(dni), CONSTRAINT pelicula_fk FOREIGN KEY (cod_pelicula) REFERENCES peliculas(cod) );
VALIDACION
Son restricciones que dictan una condicin que deben cumplir los contenidos de una columna. Una misma columna puede tener mltiples CHECKS en su definicin.
EJEMPLO
CREATE TABLE ingresos(cod NUMBER(5) PRIMARY KEY, concepto VARCHAR2(40) NOT NULL, importe NUMBER(11,2), CONSTRAINT importe_min CHECK (importe>0), CONSTRAINT importe_max CHECK (importe<8000) );
CREATE TABLE curso( cod_curso CHAR(7) PRIMARY KEY, fecha_inicio DATE, fecha_fin DATE, tItulo VARCHAR2(60), cod_siguientecurso CHAR(7), CONSTRAINT fecha_ck CHECK(fecha_fin>fecha_inicio), CONSTRAINT cod_ste_fk FOREIGN KEY(cod_siguientecurso) REFERENCES curso ON DELETE SET NULL);
VALORES UNICOS
Las restricciones de tipo UNIQUE obligan a que el contenido de uno o ms campos no puedan repetir valores. Hay dos formas de colocar esta restriccin:
CREATE TABLE cliente(dni VARCHAR2(9) UNIQUE); CREATE TABLE cliente(dni VARCHAR2(9) CONSTRAINT dni_u UNIQUE); CREATE TABLE alquiler(dni VARCHAR2(9), cod_pelicula NUMBER(5), CONSTRAINT alquiler_uk UNIQUE(dni,cod_pelicula) ;
La restriccin NOT NULL permite prohibir los nulos en una determinada COLUMNA. Eso obliga a que la columna tenga que tener obligatoriamente un valor para que sea almacenado el registro.
A cada columna se le puede asignar un valor por defecto durante su creacin mediante la propiedad DEFAULT.
CREATE TABLE articulo (cod NUMBER(7), nombre VARCHAR2(25), precio NUMBER(11,2) DEFAULT 3.5);
Grupo #1
ORGANIZACIONES NO GUBERNAMENTALES ENUNCIADO:
Grupo #2
ALQUILER DE VEHICULOS ENUNCIADO:
INSTRUCCIN SELECT
El resultado de la consulta con la instruccin SELECT es una tabla lgica, porque no se guarda en el disco sino que est en memoria y cada vez que ejecutamos la consulta se vuelve a calcular.
Al SELECT tenemos que indicar qu columnas queremos que tenga el resultado y qu filas queremos seleccionar de la tabla origen.
Sintxis
Bsica
SELECT Campos FROM Tabla;
Completa
Seleccin de Columnas
Se refiere a las columnas que apareceran en el resultado de la consulta y se especifican delante de la Instruccin Select y antes de la clusula FROM.
Si aadimos una columna nueva en la tabla, esta nueva columna saldr sin tener que modificar la consulta
Nombre simple
Nombre cualificado
(nbcol)
(nbtabla.nbcol, el nombre de la columna precedido del nombre de la tabla que contiene la columna y separados por un punto).
Clausula FROM
Indica o especifica en qu tabla tiene que buscar la informacin.
Ejemplos
Generar una consulta que devuelve todos los campos de la tabla clientes
SELECT * FROM Clientes
Columnas calculadas
Adems de las columnas que existen en la tabla origen, una consulta SQL puede incluir columnas calculadas cuyos valores se calculan a partir de los valores de los datos almacenados.
Para obtener una columna calculada, se especifica en la lista de seleccin una expresin en vez de un nombre de columna. La expresin puede contener sumas, restas, multiplicaciones y divisiones, concatenacin & , parntesis y tambin funciones predefinidas.
Ejemplos
De cada pedido queremos saber su nmero de pedido, fab, producto, cantidad, precio unitario e importe
SELECT numpedido, fab, producto, cant, importe / cant AS precio_unitario, importe FROM pedidos
Clausula Order by
Permiten ordenar las filas del resultado de la consulta Con esta clusula se altera el orden de visualizacin de las filas de la tabla pero en ningn caso se modifica el orden de las filas dentro de la tabla. Podemos indicar la columna por la que queremos ordenar utilizando su nombre de columna (nbcolumna) o utilizando su nmero de orden que ocupa en la lista de seleccin (Ncolumna).
Seleccin de Filas
queremos siguientes
Clausula ROWNUM
ROWNUM devuelve el nmero lgico que nos indica el orden en el cual una fila ha sido recuperada de una tabla por una sentencia SELECT
SELECT ROWNUM, edad, nombre FROM clientes SELECT ROWNUM, edad, nombre FROM clientes where rownum<1
Clausula DISTINCT
Concatenacin
Clausula Where
La clusula WHERE selecciona las filas que cumplan una condicin de seleccin especificada.
El test de comparacin El test de rango BETWEEN El test de pertenencia a un conjunto IN El test de valor nulo IS NULL El test de correspondencia con patrn LIKE
El Test de Comparacin
EJRMPLOS
/* Obtiene a las personas de entre 25 y 50 aos SELECT nombre,apellidos FROM personas WHERE edad>=25 AND edad<=50;
/*Obtiene a la gente de ms de 60 aos o de menos de 20 SELECT nombre,apellidos FROM personas WHERE edad>60 OR edad<20;
BETWEEN
IN
LIKE
Permite obtener registros cuyo valor en un campo cumpla una condicin textual. LIKE utiliza una cadena que puede contener estos smbolos:
Smbolo % Significado Una serie cualquiera de caracteres
Un carcter cualquiera
EJEMPLOS
/* Selecciona nombres que empiecen por A */ SELECT nombre FROM personas WHERE nombre LIKE 'A%'; /*Selecciona las personas cuyo apellido sea Sanchez, Senchez,Stnchez,...*/ SELECT apellido1 FROM Personas WHERE apellido1 LIKE 'S_nchez';
IS NULL
si
una
expresin
FUNCIONES CONDICIONALES
CASE Es una instruccin incorporada en Oracle que permite establecer condiciones de salida (al estilo if-then-else de muchos lenguajes). Sintaxis:
CASE expresin WHEN valor1 THEN resultado1 [ WHEN valor2 THEN resultado2 .... ... ELSE resultadoElse ] END
EJEMPLO
SELECT CASE cotizacion WHEN 1 THEN salario*0.85 WHEN 2 THEN salario * 0.93 WHEN 3 THEN salario * 0.96 ELSE salario END FROM empleados;
DECODE
Similar a la anterior pero en forma de funcin. Se evala una expresin y se colocan a continuacin pares (valor, resultado) de forma que si se la expresin equivale al valor, se obtiene el resultado indicado. Se puede indicar un ltimo parmetro con el resultado a efectuar en caso de no encontrar ninguno de los valores indicados.
SINTAXIS
DECODE(expresin, valor1, resultado1 [,valor2, resultado2,...] [,valorPordefecto])
SELECT DECODE(cotizacion,1, salario*0.85, 2,salario * 0.93, 3,salario * 0.96, salario) FROM empleados;
Consultas de Resumen
Se incluyen dos nuevas clusulas a la sentencia SELECT, la clusula GROUP BY y la clusula HAVING
Es un tipo de consultas cuyas filas resultantes son un resumen de las filas de la tabla origen.
Estas clausulas se tienen que escribir entre la clusula WHERE y la clusula ORDER BY
Consultas de Resumen
Las filas del resultado de una consulta de resumen corresponden a varias filas de la tabla origen.
Una fila de una consulta de resumen corresponde a un resumen de varias filas de la tabla origen.
Ejemplo
En el ejemplo tenemos una consulta normal en la que se visualizan las filas de la tabla oficinas ordenadas por regin, en este caso cada fila del resultado se corresponde con una sola fila de la tabla oficinas, mientras que la segunda consulta es una consulta resumen, cada fila del resultado se corresponde con una o varias filas de la tabla oficinas.
Sintaxis:
Funciones de Columnas
Se utilizan en una consulta de resumen. Se aplican a una columna y obtiene un valor que resume el contenido de la columna. Las mas utilizadas son:
Funcin Sum()
Calcula la suma de los valores de una columna Ejemplo SELECT SUM(ventas) FROM oficinas Obtiene una sola fila con el resultado de sumar todos los valores de la columna ventas de la tabla oficinas.
Funcin Avg()
Calcula el promedio de los valores de una columna Ejemplo SELECT AVG(ventas) FROM oficinas Obtiene una sola fila con el resultado de promediar todos los valores de la columna ventas de la tabla oficinas.
Funcin Count()
Cuenta el nmero de filas o registros que hay en la columna Ejemplo SELECT COUNT(numemp) FROM empleados Obtiene el numero de empleados que existen en la tabla empleados.
La clausula Group by
Llamadas tambin consultas de resumen o consultas agrupadas. Permiten obtener subtotales. Agrupa los datos de la tabla origen y produce una nica fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupacin.
Ejemplo
SELECT SUM(ventas) FROM oficinas Obtiene la suma de ventas de todas oficinas. las las
Se forma un grupo para cada oficina y la suma se calcula sobre cada oficina.
HAVING
de
una
expresin
SELECT tipo,modelo, SUM(Cantidad) FROM existencias GROUP BY tipo,modelo HAVING SUM(Cantidad)>500; SELECT tipo,modelo, cantidad, SUM(Cantidad) FROM existencias WHERE tipo!='AR' GROUP BY tipo,modelo HAVING SUM(Cantidad)>500;
MERGE
Es el comando ms poderoso del lenguaje de manipulacin de Oracle . Sirve para actualizar los valores de los registros de una tabla a partir de valores de registros de otra tabla o consulta. Permite combinar los datos de dos tablas a fin de actualizar la primera.
MERGE
Supongamos que poseemos una tabla en la que queremos realizar una lista de localidades con su respectiva provincia. Las localidades estn ya rellenadas, nos faltan las provincias. Resulta que tenemos otra tabla llamada clientes en la que tenemos datos de localidades y provincias, gracias a esta tabla podremos rellenar los datos que faltan en la otra.
SINTAXIS
MERGE INTO tabla alias USING (instruccin SELECT) alias ON (condicin de unin) WHEN MATCHED THEN UPDATE SET col1=valor1 [col2=valor2] WHEN NOT MATCHED THEN INSERT (listaDeColumnas) VALUES (listaDeValores)
MERGE compara los registros de ambas tablas segn la condicin indicada en el apartado ON. Compara cada registro de la tabla con cada registro del SELECT.
tabla es el nombre de la tabla que queremos modificar. USING. En esa clusula se indica una instruccin SELECT tan compleja como queramos que muestre una tabla que contenga los datos a partir de los cuales se modifica la tabla ON. permite indicar la condicin que permite relacionar los registros de la tabla con los registros de la consulta SELECT
WHEN MATCHED THEN. El UPDATE que sigue a esta parte se ejecuta cuando la condicin indicada en el apartado ON sea cierta para los dos registros actuales. WHEN NOT MATCHED THEN. El INSERT que sigue a esta parte se ejecuta para cada registro de la consulta SELECT que no pudo ser relacionado con ningn registro de la tabla.
MERGE INTO localidades l USING (SELECT * FROM clientes) c ON (l.localidad=clientes.localidad) WHEN MATCHED THEN UPDATE SET l.provincia=c.provincia WHEN NOT MATCHED THEN INSERT (localidad, provincia) VALUES (c.localidad, c.provincia)
SECUENCIAS
Una secuencia sirve para generar automticamente nmeros distintos Es una rutina interna de Oracle la que realiza la funcin de generar un nmero distinto cada vez. Las secuencias se almacenan independientemente de la tabla, por lo que la misma secuencia se puede utilizar para diversas tablas.
SINTAXIS
CREATE SEQUENCE secuencia [INCREMENT BY n] [START WITH n] [{MAXVALUE n|NOMAXVALUE}] [{MINVALUE n|NOMINVALUE}] [{CYCLE|NOCYCLE}] Donde:
Secuencia. Es el nombre que se le da al objeto de secuencia. INCREMENT BY. Indica cunto se incrementa la secuencia cada vez que se usa. Por defecto se incrementa de uno en uno START WITH. Indica el valor inicial de la secuencia (por defecto 1)
MAXVALUE. Mximo valor que puede tomar la secuencia. MINVALUE. Mnimo valor que puede tomar la secuencia. CYCLE. Hace que la secuencia vuelva a empezar si se ha llegado al mximo valor.
EJEMPLO
CREATE SEQUENCE numero INCREMENT 100 STARTS WITH 100 MAXVALUE 2000
METODOS
NEXTVAL y CURRVAL NEXTVAL incrementa la secuencia y devuelve el valor actual. CURRVAL devuelve el valor de la secuencia, pero sin incrementar la misma.
El apartado CONNECT permite indicar que relacin hay que seguir para recorrer el rbol. La palabra PRIOR indica hacia dnde se dirige el recorrido. Finalmente el apartado START indica la condicin de inicio del recorrido (normalmente la condicin que permita buscar el nodo del rbol por el que comenzamos el recorrido, es decir sirve para indicar desde donde comenzamos.
SELECT nombre FROM empleados START WITH nombre='Andrs' CONNECT BY PRIOR n_jefe=n_empleado;
SELECT nombre FROM empleados START WITH nombre='Andrs' CONNECT BY PRIOR n_jefe=n_empleado;
ROLLUP
Esta expresin en una consulta de agrupacin (GROUP BY) permite obtener los subtotales de cada grupo formado y el total general.
PL SQL
Nos provee una manera de relacionar los conceptos de bases de datos y manejarlos mediante ciertas estructuras de control, dentro del contexto de una herramienta netamente de programacin. Su utilizacin es dentro del administrador de bases de datos Oracle y sus principales caractersticas son la posibilidad que brinda de utilizar sentencias SQL para manipular datos y sentencias de control de flujo para organizar esta manipulacin de datos.
Dentro del lenguaje, es posible declarar constantes y variables, definir procedimientos y funciones y atrapar errores en tiempo de ejecucin. As visto, PL/SQL combina el poder de la manipulacin de datos, con SQL, y las facilidades del procesamiento de los mismos, tal como en los ms modernos lenguajes de programacin.
Alta productividad
Si se utiliza otros productos de Oracle como Oracle Forms y Oracle Reports, es posible integrar bloques completos de PL/SQL en un trigger de Oracle Forms, debido a que PL/SQL es el mismo en todos los ambientes.
Completa portabilidad
Las aplicaciones escritas con PL/SQL son portables a cualquier sistema operativo y plataforma en la cual se encuentre corriendo Oracle.
Seguridad
Los procedimientos almacenados construidos con PL/SQL previene que se efecte manipulacin de los datos desde el cliente. Adems, se puede restringir el acceso a los datos de Oracle, permitiendo a los usuarios la ejecucin de los procedimientos almacenados para los cuales tengan privilegios solamente.
Estructuras de Bloque
La unidad bsica de codificacin son bloques. Un bloque permite agrupar en forma lgica un grupo de sentencias. Un bloque PL/SQL tiene tres partes: una seccin de declaracin, una seccin de ejecucin y otra de manejo de excepciones.
DECLARE //Seccin declarativa: variables, tipos, y subprogramas de uso local BEGIN //Seccin ejecutable: las instrucciones procedimentales, y de SQL aparecen aqu. Es la nica seccin obligatoria en el bloque.
EXCEPTION //Seccin de manejo de excepciones. Las rutinas de manejo de errores aparecen aqui END;
En la seccin de declaraciones, se indican las variables que sern usadas dentro del bloque y sus tipos. Por ejemplo: DECLARE nombre VARCHAR2(20); precio NUMBER(6,2); CURSOR micursor IS SELECT num_dept, nom_dept, dir_dept FROM dept; c1 micursor%ROWTYPE;
En algunos casos, es posible que se desee que el tipo de una variable coincida con el tipo usado para una columna de una tabla determinada. DECLARE niombre personal.nombre%TYPE;
DECLARE CURSOR mi_cursor IS SELECT salario + NVL(comm,0) wages, nom_emp FROM emp; mi_rec mi_cursor%ROWTYPE;
MANEJO DE CURSORES
Los cursores son reas de trabajo que permiten ejecutar sentencias SQL y procesar la informacin obtenida de ellos. Un cursor devuelve cero, una o ms filas, dependiendo de los criterios con que hayan sido construidos.
Se utilizan tres instrucciones para controlar un cursor: OPEN, FETCH, y CLOSE. En primer lugar, se inicializa el cursor con la sentencia OPEN, la cual identifica al conjunto resultante. Entonces, se usa la sentencia FETCH para recuperar la primera fila; se puede ejecutar FETCH de manera repetida hasta que todas las filas han sido tratadas, cuando se procesa la ltima, se debe cerrar el cursor con la sentencia CLOSE. Se pueden procesar varias consultas de forma paralela, declarando y abriendo mltiples cursores.
Declaracin de un Cursor
CURSOR nombre_cursor [ (parametro[, parametro] )] IS sentencia_select;
Cuando se declara un cursor, se debe ponerle un nombre y asociarlo con una consulta especfica
DECLARE CURSOR c1 IS SELECT num_emp, nom_emp, trab_emp, sal_emp FROM emp WHERE sal_emp>2000;
Apertura de un Cursor
Cuando se abre un cursor, se ejecuta la consulta que tiene asociada, la cual recupera todas las filas que se ven incluidas en su condicin de bsqueda.
DECLARE CURSOR c1 IS SELECT nom_emp, trab_emp FROM emp WHERE sal_emp<3000; BEGIN OPEN c1; END;
Las filas del conjunto resultante no son recuperadas cuando se ejecuta la sentencia OPEN, sino que lo sern ms tarde cuando se ejecute la sentencia FETCH.
LOOP FETCH c1 INTO IF c1%FOUND THEN -- fetch exitoso ELSE -- fetch fall; se sale del loop EXIT; END IF; END LOOP;
LOOP FETCH c1 INTO mi_record; EXIT WHEN c1%NOTFOUND; -- Procesa la informacin del record END LOOP;
Cierre de un Cursor
La sentencia CLOSE deshabilita el cursor CLOSE c1; Una vez que un cursor se cierra, se puede volver a abrir sin problemas. Cualquier otra operacin sobre un cursor cerrado, provoca una excepcin que se llama INVALID_CURSOR.
Podemos sustituir las instrucciones de manejo de cursores: OPEN, FETCH y CLOSE, por la utilizacin de bucles FOR. Esto simplifica mucho el funcionamiento ya que no es necesario abrir el cursor, ni realizar el fetch, ni cerrarlo posteriormente, ya que todas estas operaciones van implcitas cuando se usa el bucle FOR.
MANEJO DE ERRORES
En PL/SQL, a un warning o una condicin de error, se le llama excepcin. Las excepciones pueden ser Internas (definidas por el propio sistema), o definidas por el usuario. Ejemplos de excepciones definidas de forma interna son division by zero y out of memory.
DECLARE pe_ratio NUMBER(3,1); BEGIN SELECT precio/ganancias INTO pe_ratio FROM stocks WHERE simbolo=XYZ; -- Esto puede causar el error de divisin entre cero INSERT INTO estadis (simbolo,ratio) VALUES (XYZ,pe_ratio); COMMIT; EXCEPTION WHEN ZERO_DIVIDE THEN -- Controla la excepcin INSERT INTO estadis (simbolo,ratio) VALUES (XYZ,NULL); COMMIT; WHEN OTHERS THEN -- Controla el resto de excepciones ROLLBACK; END; -- El manejador de errores y el bloque acaban aqu
Nombre Excepcin
Gatillada cuando
SQLCODE
ACCESS_INTO_NULL
COLLECTION_IS_NULL
CURSOR_ALREADY_OPEN
El programa intent abrir un cursor que -6511 ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automticamente lo abre y ello no se debe especificar con la sentencia OPEN
DUP_VAL_ON_INDEX
El programa intent almacenar valores -1 duplicados en una columna que se mantiene con restriccin de integridad
INVALID_NUMBER
En una sentencia SQL, la conversin de -1722 una cadena de caracteres hacia un nmero falla cuando esa cadena no representa un nmero vlido
LOGIN_DENIED
El programa intent conectarse a Oracle -1017 con un nombre de usuario o password invlido
NO_DATA_FOUND
Una sentencia SELECT INTO no +100 devolvi valores o el programa referenci un elemento no inicializado en una tabla indexada
NOT_LOGGED_ON
El programa efectu una llamada a Oracle -1012 sin estar conectado PL/SQL tiene un problema interno Los elementos de una asignacin (el valor -6501
PROGRAM_ERROR
ROWTYPE_MISMATCH
SELF_IS_NULL
El parmetro SELF (el primero que es -30625 pasado a un mtodo MEMBER) es nulo
STORAGE_ERROR
-6500
SUBSCRIPT_BEYOND_COUNT
El programa est tratando de referenciar -6533 un elemento de un arreglo indexado que se encuentra en una posicin ms grande que el nmero real de elementos de la coleccin
SUBSCRIPT_OUTSIDE_LIMIT
El programa est referenciando un -6532 elemento de un arreglo utilizando un nmero fuera del rango permitido (por ejemplo, el elemento -1)
SYS_INVALID_ROWID
La
conversin
de
una
cadena
de -1410
TIMEOUT_ON_RESOURCE
TOO_MANY_ROWS
INTO -1422
VALUE_ERROR
Ocurri un error aritmtico, de -6502 conversin o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable ms pequea
ZERO_DIVIDE
DECLARE out_of_stock EXCEPTION;-- declaracin de la excepcin total NUMBER(4); BEGIN IF total < 1 THEN RAISE out_of_stock;-- llamado a la excepcin END IF; EXCEPTION WHEN out_of_stock THEN -- manejar el error aqu WHEN OTHERS THEN END;
SQLCODE y SQLERRM
Sqlcode siempre retornar el nmero del error de Oracle y un 0 (cero) en caso exitoso al ejecutarse una sentencia SQL. Sqlerrm retornar el correspondiente mensaje de error para la situacin ocurrida. Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones, para aclarar el significado de la excepcin OTHERS.
DECLARE err_num NUMBER; err_msg VARCHAR2(100); BEGIN EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; err_msg := SUBSTR(SQLERRM, 1, 100); INSERT INTO errores VALUES(err_num, err_msg); END;
Subprogramas
Son bloques de instrucciones de PL/SQL que pueden ser invocados por otros y recibir parmetros. En PL/SQL existen dos tipos de subprogramas: Los Procedimientos y las Funciones. Generalmente, se utiliza un procedimiento para ejecutar una accin especfica y una funcin para calcular un valor.
CREATE OR REPLACE PROCEDURE debit_account (idcuenta INTEGER, monto REAL) IS viejosaldo REAL; nuevosaldo REAL; negativo EXCEPTION; BEGIN SELECT bal INTO viejosaldo FROM cuentas WHERE numero = idcuenta; nuevosaldo := viejosaldo monto; IF nuevosaldo < 0 THEN RAISE negativo; ELSE UPDATE cuentas SET bal = nuevosaldo WHERE numero = idcuenta; END IF; EXCEPTION WHEN negativo THEN END debit_account;