PL/SQL Francisco Moreno Universidad Nacional.

Slides:



Advertisements
Presentaciones similares
DECLARE CURSOR cur1 IS SELECT dnombre, loc FROM DEPART; v_nombre DEPART.DNOMBRE%TYPE; v_localidad DEPART.LOC%TYPE; BEGIN OPEN cur1; LOOP FETCH cur1 INTO.
Advertisements

VISTAS (VIEWS) DEFINICIÓN Y OBJETIVO DE LAS VISTAS.
Insercion de datos..
Ejercicios Solemne 2 Parte 1
Implementación de procedimientos almacenados
LENGUAJE ESTRUCTURADO DE CONSULTA “SQL”
BASE DE DATOS OBJETO RELACIONAL
Introducción a Transact-SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Introducción a PL/SQL Conceptos básicos.
Fernando Velasco
PL/SQL Francisco Moreno Universidad Nacional. Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta.
Presentación Asignatura POF030 Semana 1. Contenido En forma general, los conceptos que se estudiarán en la asignatura son: – Procedures – Functions –
Subprogramas: Procedimientos
Maestría en Bioinformática Bases de Datos y Sistemas de Información Otros objetos de Base de Datos Ing. Alfonso Vicente, PMP
01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno.
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle
Francisco Moreno Bases de Datos II Universidad Nacional
Características Objeto Relacionales en Oracle
PL/SQL Francisco Moreno Universidad Nacional.
EXPLAIN PLAN Cómo leer los resultados del EXPLAIN PLAN
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
UNITA - IBARRA BLOQUES PL-SQL SUBPROGRAMAS Paulina Guevara.
Características Objeto Relacionales en Oracle
Diseño Físico Procedimientos Almacenados y Disparadores (Triggers)
Unidad 3 Lenguaje SQL Contenidos Que es SQL ? Estructura de SQL
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
MySQL M.C. Pedro Bello López.
PL/SQL Francisco Moreno Universidad Nacional. Introducción al PL/SQL ¿Por qué PL/SQL? A pesar de que SQL tiene mecanismos de control condicional (cláusula.
Bases de Datos Relacionales
16/04/ Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla.
PL/SQL Francisco Moreno Universidad Nacional.
PL/SQL Francisco Moreno Universidad Nacional.
Subconsultas Avanzadas
Ing. Ricardo Carlos Inquilla Quispe
Procedimientos Almacenados Funciones Agregadas
UNITA - IBARRA TRIGGERS
Lenguaje Estructurado de Consultas
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
Laboratorio de Bases de datos
PL/SQL Francisco Moreno Universidad Nacional.
COMANDOS SQL.
Bases de Datos Relacionales
PL/SQL Francisco Moreno Universidad Nacional.
TRIGGERS EN ORACLE 8 J. Iriarte S. España
SQL: DDL Francisco Moreno & Carlos Mario Zapata. SQL:DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la Base de Datos Tipos de Objetos:
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
Triggers(Disparadores)
Características Objeto Relacionales en Oracle
Características Objeto-Relacionales en Oracle Francisco Moreno Universidad Nacional.
Estructura general de un programa en el servidor de Bases de Datos.
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
Expresiones algebraicas equivalentes
PROCEDIMIENTOS ALMACENADOS Es una consulta almacenada en la base de datos en un servidor. Los P.A. Mejoran el Rendimiento Disminuyen el tráfico. Los P.A.
Base de datos Francisco Castro. Creación de una tabla drop table TABLA cascade constraints; /*==============================================================*/
PUESTO-TRABAJO (Código-Puesto, Empresa, Sueldo, DNI- Contratado) TITULADO (DNI-Titulado, Nombre, Apellidos, Dirección) TITULACION (Iden-Titulación, Nombre,
JOIN EN MYSQL Bueno en esta presentación mostrare cosas acerca de los usos de la sentencia JOIN en mysql , mediante esta presentación planeo mostrar los.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
SQL es un estándar internacional para trabajar con bases de datos, que consta de dos partes: una parte para manipular datos y una parte para definir tipos.
Después de completar esta lección, debe ser capaz de:  Crear registro definidos por el usuario.  Crear un registro con el atributo %ROWTYPE.  Crear.
5 Paquetes ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
Apuntes PL-SQL Triggers II. Tipos de datos compuestos Registros PL/SQL: Son similares a un tipo struct en C o a un tipo Registro en otros 3GL. Se componen.
SQL: DDL.
6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
3 Cursores ORACLE Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega.
DLM Transact SQL Sesión II Recuperación de información.
6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
6 Triggers ORACLE - III Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
BASE DE DATOS IUPSM CLASE PRACTICA. PROF. ING. JOSE L GUZMAN H.
Transcripción de la presentación:

PL/SQL Francisco Moreno Universidad Nacional

Subprogramas: Procedimientos A excepción de los triggers, hasta ahora los bloques PL/SQL que se han presentado son Anónimos (sin nombre) Temporales (no quedan almacenados en la BD) Los bloques PL/SQL se pueden almacenar (garantizar su persistencia) en la BD mediante subprogramas (funciones y procedimientos) Los subprogramas pueden tener argumentos (parámetros)

Procedimientos Sintaxis: CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [( arg1 [modo] tipo [, arg2 [modo] tipo...])] IS | AS Bloque PL/SQL

La opción REPLACE remplaza el procedimiento si ya existe Se puede usar AS o IS (son equivalentes) El bloque PL/SQL comienza con la palabra BEGIN o con la declaración de las variables locales (sin usar la palabra DECLARE). Para ver los errores de compilación en SQL*Plus se puede usar el comando SHOW ERRORS Herramientas como SQL Navigator, PL/SQL Developer, entre otras; facilitan mucho las labores de depuración.

El "modo" especifica el tipo del parámetro así: - IN (modo predeterminado): Parámetro de entrada. - OUT: Parámetro de salida. El subprograma devuelve un valor en el parámetro. - IN OUT: Parámetro de entrada y salida. El subprograma devolverá un valor posiblemente diferente al enviado inicialmente. Para declarar los parámetros usar en lo posible %TYPE y %ROWTYPE No se puede especificar tamaño para los parámetros en lo que respecta al tipo de datos

Ejemplo 1. Sea la tabla: CREATE TABLE registro( id_usuario VARCHAR2(10), fecha DATE, estacion VARCHAR2(15) ); CREATE OR REPLACE PROCEDURE registrarse IS BEGIN INSERT INTO registro VALUES (USER, SYSDATE, USERENV('TERMINAL')); END; / Para ejecutarlo en SQL*Plus: EXECUTE registrarse;

registrarse se puede invocar, por ejemplo, desde un trigger de LOGON así: CREATE OR REPLACE TRIGGER registrar AFTER LOGON ON DATABASE BEGIN registrarse; --Llama al procedimiento END; / Para crear este trigger se requiere: GRANT ADMINISTER DATABASE TRIGGER TO user;

Ejemplo 2. Sea la tabla: DROP TABLE emp; CREATE TABLE emp( cod NUMBER(8) PRIMARY KEY, nom VARCHAR2(15), depto NUMBER(3) ); INSERT INTO emp VALUES(12,'María',10); INSERT INTO emp VALUES(15,'Ana',5); INSERT INTO emp VALUES(76,'Lisa',15);

CREATE OR REPLACE PROCEDURE consulta_emp (v_nro IN emp.cod%TYPE) IS v_nom emp.nom%TYPE; BEGIN SELECT nom INTO v_nom FROM emp WHERE cod = v_nro; DBMS_OUTPUT.PUT_LINE(v_nom); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Empleado no existe'); END; / EXECUTE consulta_emp(15); Parámetro de entrada

Los parámetros de salida usualmente son recibidos por variables de otros subprogramas que los invocan. CREATE OR REPLACE PROCEDURE consulta_emp (v_nro IN emp.cod%TYPE, v_nom OUT emp.nom%TYPE) IS BEGIN SELECT nom INTO v_nom -- Se llena el parámetro FROM emp WHERE cod = v_nro; EXCEPTION WHEN NO_DATA_FOUND THEN v_nom := 'Sin nombre'; -- Si no se llena queda en NULL END; / Parámetro de salida

Invocación desde otro subprograma: CREATE OR REPLACE PROCEDURE invoca_consulta(v_nro IN emp.cod%TYPE) IS nombre emp.nom%TYPE; BEGIN consulta_emp(v_nro, nombre); DBMS_OUTPUT.PUT_LINE('El nombre es: ' || nombre); END; / Para ejecutar: EXECUTE invoca_consulta(15); Parámetro de salida Retornará con el nombre

Ejemplo 3 Sea el modelo: MOVIMIENTO #cons *valor CUENTA #nro *saldo de generadora de

Sean las tablas: CREATE TABLE cuenta( nro NUMBER(8) PRIMARY KEY, saldo NUMBER(8) NOT NULL ); CREATE TABLE mvto( cons NUMBER(8) PRIMARY KEY, valor NUMBER(8) NOT NULL, cta NUMBER(8) NOT NULL REFERENCES cuenta

INSERT INTO cuenta VALUES(1,100); INSERT INTO cuenta VALUES(2,400); Ingreso de datos: INSERT INTO cuenta VALUES(1,100); INSERT INTO cuenta VALUES(2,400); INSERT INTO cuenta VALUES(3,600); INSERT INTO mvto VALUES(3,20, 2); INSERT INTO mvto VALUES(4,20, 2); INSERT INTO mvto VALUES(5,30, 2); INSERT INTO mvto VALUES(6,20, 2); INSERT INTO mvto VALUES(7,20, 2); INSERT INTO mvto VALUES(8,10, 2); INSERT INTO mvto VALUES(1,30, 3); INSERT INTO mvto VALUES(2,10, 3); La cuenta 1 no tiene movimientos

Desarrollar un procedimiento que imprima cada cuenta con sus n valores de movimiento más altos, en formato horizontal: Ejemplo: si n = 3, la salida debe ser: 1 2 30 20 20 3 30 10 No tiene movimientos Solo tiene dos movimientos Aunque acá se muestran los datos ordenados por nro. de cuenta, por simplicidad no se considerará este aspecto en la solución

CREATE OR REPLACE PROCEDURE topn_horizontal(n IN POSITIVE) IS cadena VARCHAR2(1000); cont NUMBER(8); BEGIN FOR mi_c1 IN (SELECT nro FROM cuenta) LOOP cadena := mi_c1.nro; cont := 0; FOR mi_c2 IN (SELECT valor FROM mvto WHERE cta = mi_c1.nro ORDER BY 1 DESC) LOOP cadena := cadena || ' ' || mi_c2.valor; cont := cont + 1; EXIT WHEN cont = n; END LOOP; DBMS_OUTPUT.PUT_LINE(cadena); END; /

¿La solución usando solo SQL? La idea es crear una consulta SQL en la que el usuario solo indica el valor de n El problema es que en el momento de escribir la consulta no se sabe cuantas columnas se van a necesitar para los top n valores  Pero afortunadamente esto se puede solucionar, por ejemplo, con la función de agregación ¡LISTAGG!

Nombre para la columna de salida Pero primero, ¿qué hace la siguiente consulta? Se usa la función analítica ROW_NUMBER. CREATE OR REPLACE VIEW v_pos AS SELECT cta, valor, ROW_NUMBER() OVER (PARTITION BY cta ORDER BY valor DESC) AS pos FROM mvto; Una vista Nombre para la columna de salida Para crear vistas se requiere: GRANT CREATE ANY VIEW TO user;

SELECT cta, LISTAGG(valor,' ') WITHIN GROUP(ORDER BY valor DESC) Ahora se muestra un ejemplo con la función LISTAGG ¿qué hace la siguiente consulta? SELECT cta, LISTAGG(valor,' ') WITHIN GROUP(ORDER BY valor DESC) AS listado FROM v_pos GROUP BY cta; Carácter separador al concatenar los valores, espacio en este ejemplo

SELECT cta || ' ' || LISTAGG(valor, ' ') Entonces: SELECT cta || ' ' || LISTAGG(valor, ' ') WITHIN GROUP(ORDER BY valor DESC) AS listado FROM v_pos WHERE pos <= n GROUP BY cta; Colocar acá el número deseado Pero hay un problema: ¡quedan faltando las cuentas que no tienen movimientos!

Colocar acá el número deseado Entonces, una solución en SQL es: SELECT c1.nro || ' ' || (SELECT LISTAGG(valor, ' ') WITHIN GROUP(ORDER BY valor DESC) FROM v_pos WHERE cta = c1.nro AND pos <= n) AS listado FROM cuenta c1; Colocar acá el número deseado

Colocar acá el número deseado Tarea analizar la siguiente consulta y ver si es equivalente a la anterior solución: SELECT nro || ' ' || listado FROM cuenta LEFT OUTER JOIN (SELECT LISTAGG(valor, ' ') WITHIN GROUP(ORDER BY valor DESC) AS listado, cta FROM v_pos WHERE pos <= n GROUP BY cta ) ON (cta = nro); Colocar acá el número deseado

Sin embargo, dada la cantidad de funciones nuevas que se han incorporado a SQL en las últimas versiones, este empieza a perder su simplicidad y quizás sea preferible una solución vía PL/SQL… Ejercicio: hacer el mismo problema anterior pero sin considerar valores repetidos, es decir, los n valores de movimiento más altos no repetidos