PL/SQL Francisco Moreno Universidad Nacional.

Slides:



Advertisements
Presentaciones similares
Se necesita un PA que muestre la información de todos los clientes registrados de la siguiente forma: Nombre1 Nombre2, Apellido1 Apellido2 bajo el título.
Advertisements

Insercion de datos..
Ejercicios Solemne 2 Parte 1
LENGUAJE ESTRUCTURADO DE CONSULTA “SQL”
BASE DE DATOS OBJETO RELACIONAL
Implementación de funciones definidas por el usuario
ADA: lenguaje de programación concurrente
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Introducción a PL/SQL Conceptos básicos.
Programación modular Procedimientos y Funciones
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
Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Tipos definidos por el usuario –Parámetros array ilimitados.
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle
Características Objeto Relacionales en Oracle
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
UNITA - IBARRA BLOQUES PL-SQL SUBPROGRAMAS Paulina Guevara.
Características Objeto Relacionales en Oracle
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
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.
Semana 5 Subprogramas..
PL/SQL Francisco Moreno Universidad Nacional.
PL/SQL Francisco Moreno Universidad Nacional.
Ing. Ricardo Carlos Inquilla Quispe
Procedimientos Almacenados Funciones Agregadas
UNITA - IBARRA TRIGGERS
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.
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:
Elaborado por: Guillermo Baquerizo I Término 2012.
Sesión 9 Construcción de cursores.
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Ciclo de vida y operaciones masivas Conceptos básicos.
Triggers(Disparadores)
Ada 2º Parte (variables, ámbitos , subrutinas , tipos abstractos de datos y excepciones)
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.
SQL: DDL Francisco Moreno. SQL: DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la BD Tipos de objetos: - Tablas: corresponden a las.
Expresiones algebraicas equivalentes
Cursores SQL RECORRER CON UN CONJUNTO DE RESULTADOS RECORRER CON UN CONJUNTO DE RESULTADOS.
SQL Sigla del nombre “Structured Query Language”.
Se producen cuando una aplicación recibe datos no confiables y estos no han sido validados adecuadamente antes de procesarlos, lo cual puede llevar a que.
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,
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.
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Uso de Procedimiento y Funciones Conceptos básicos.
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
UNIVERSIDAD LATINA IV. CONSULTAS AVANZADAS CON BASES DE DATOS. E.I. L.E. Prof. Ramón Castro Liceaga.
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.
Base de Datos I – Ing. Mary Carlota Bernal J. BASE DE DATOS I PL/SQL.
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.
Mtr. Adrián Monge Monge Educación 2015 Maestría, Mención en Administración de Proyectos ULACITMaestría, Mención en Administración de Proyectos 2012 Licenciatura,
Base de Datos I – Ing. Mary Carlota Bernal J.  Cada instrucción PL/SQL tiene asociado internamente un cursor  Los cursores en PL/SQL pueden ser de dos.
Implementación de funciones definidas por el usuario.
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 Copyright © 2004, Oracle. Todos los derechos reservados. Trabajar con Tipos de Dato Compuestos.
Crear una tabla (create table - sp_tables - sp_columns - drop table) Para ver las tablas existentes creadas por los usuarios en una base de datos usamos.
Características Objeto Relacionales en Oracle
BASE DE DATOS IUPSM CLASE PRACTICA. PROF. ING. JOSE L GUZMAN H.
Características Objeto Relacionales en Oracle
Transcripción de la presentación:

PL/SQL Francisco Moreno Universidad Nacional

Paquetes: sobrecarga de subprogramas Sobrecarga de subprogramas: Varios subprogramas pueden tener el mismo nombre en un paquete siempre y cuando no haya ambigüedad con los tipos de los parámetros y de retorno

No puede haber sobrecarga si la diferencia entre los subprogramas con el mismo nombre solo se basa en: el modo (IN, OUT) el tipo de retorno de una función Tipos de datos de la misma familia como CHAR y VARCHAR* * Se permite para ciertos tipos de datos, por ejemplo NUMBER vs POSITIVE, aunque el comportamiento es bastante peculiar.

No puede haber sobrecarga entre: PROCEDURE xxx(a VARCHAR) PROCEDURE yyy(a IN NUMBER) FUNCTION zzz(a IN NUMBER) RETURN NUMBER PROCEDURE xxx(b CHAR) PROCEDURE yyy(b OUT NUMBER) FUNCTION zzz(b IN NUMBER) RETURN VARCHAR

Ejemplo CREATE OR REPLACE PACKAGE mat IS FUNCTION area(radio NUMBER) RETURN NUMBER; FUNCTION area(largo NUMBER, ancho NUMBER) RETURN NUMBER; END; /

CREATE OR REPLACE PACKAGE BODY mat IS FUNCTION area(radio NUMBER) RETURN NUMBER IS BEGIN RETURN 3.1416*radio*radio; END; FUNCTION area(largo NUMBER, ancho NUMBER) RETURN NUMBER IS RETURN largo*ancho; /

Para ejecutar: BEGIN DBMS_OUTPUT. PUT_LINE(mat. area(10)); DBMS_OUTPUT Para ejecutar: BEGIN DBMS_OUTPUT.PUT_LINE(mat.area(10)); DBMS_OUTPUT.PUT_LINE(mat.area(20,30)); END; / SELECT mat.area(10), mat.area(20,30) FROM dual;

Variables en los Paquetes Las variables de los paquetes son persistentes durante la sesión Las variables declaradas en la especificación son públicas: se pueden acceder y modificar directamente desde otros subprogramas o bloques anónimos Las variables declaradas en el cuerpo son privadas: solo se pueden acceder dentro del cuerpo. Si se desea ver su valor desde afuera del cuerpo, se debe crear un subprograma (público) a través del cual se acceden (cf. encapsulamiento)

Ejemplo CREATE OR REPLACE PACKAGE vbles IS nro_veces NUMBER(3) := 0; -- Vble pública PROCEDURE incrementa_veces; PROCEDURE muestra_veces; PROCEDURE muestra_impresiones; END; / Este procedimiento no es estrictamente necesario aunque es recomendable ¿por qué? Subprogramas públicos

CREATE OR REPLACE PACKAGE BODY vbles IS nro_impresiones NUMBER(3) := 0; --Variable privada PROCEDURE incrementa_veces IS BEGIN nro_veces := nro_veces + 1; END; PROCEDURE muestra_veces IS DBMS_OUTPUT.PUT_LINE(nro_veces); nro_impresiones := nro_impresiones + 1; PROCEDURE muestra_impresiones IS DBMS_OUTPUT.PUT_LINE(nro_impresiones); /

Para ejecutar:  0  1  1  1  3 EXECUTE vbles.muestra_veces; EXECUTE vbles.muestra_impresiones; EXECUTE vbles.incrementa_veces;  0  1  1  1  3

Directamente se pueden acceder las variables públicas pero NO las privadas. Igual sucede cuando hay subprogramas privados. Por ejemplo: BEGIN vbles.nro_veces := vbles.nro_veces + 1; END; / DBMS_OUTPUT.PUT_LINE(vbles.nro_veces); DBMS_OUTPUT.PUT_LINE(vbles.nro_impresiones); Genera error porque nro_impresiones NO es pública

Cursores REF Los cursores REF permiten pasar los resultados de una consulta a otro subprograma El programa que recibe el cursor REF lo puede recorrer como un cursor normal Hay cursores REF fuertes (se les especifica el tipo de retorno) y débiles.

Ejemplo de cursor REF fuerte --Sea la tabla: DROP TABLE emp; CREATE TABLE emp( cedula NUMBER(8) PRIMARY KEY, nom VARCHAR2(10) NOT NULL ); INSERT INTO emp VALUES(8,'Loui'); INSERT INTO emp VALUES(7,'Dina'); INSERT INTO emp VALUES(5,'Xena');

Se define el tipo del cursor REF y su tipo de retorno: CREATE OR REPLACE PACKAGE prueba_ref_cursor IS TYPE ref_emp_type IS REF CURSOR RETURN emp%ROWTYPE; END; / Tipo de retorno del REF CURSOR: es lo que lo hace “fuerte”

CREATE OR REPLACE PROCEDURE devuelve_cursor /*Se envía el cursor REF fuerte como parámetro de salida:*/ (c OUT prueba_ref_cursor.ref_emp_type) AS BEGIN OPEN c FOR SELECT * FROM emp; --Se llena END; / Ya el cursor REF c queda lleno (pero los datos no se recorren acá)

--Se invoca el procedimiento anterior y se imprimen --los resultados: DECLARE resultados prueba_ref_cursor.ref_emp_type; a emp%ROWTYPE; BEGIN devuelve_cursor(resultados); --Se invoca LOOP --Se recorre FETCH resultados INTO a; EXIT WHEN resultados%NOTFOUND; DBMS_OUTPUT.PUT_LINE(a.cedula || ' ' || a.nom); END LOOP; CLOSE resultados; END; /

Ejemplo de cursor REF débil: SYS_REFCURSOR CREATE OR REPLACE PROCEDURE devuelve_cursor /*Se envía el cursor REF débil (parámetro de salida) y el nombre de la tabla a consultar */ (c OUT SYS_REFCURSOR, nom_tabla IN VARCHAR) AS BEGIN OPEN c FOR 'SELECT * FROM ' || nom_tabla; --Se llena END; / Nótese que la consulta asociada con un REF CURSOR puede ser ¡una cadena de caracteres!, esto permite crear cursores cuya consulta no se conoce en tiempo de compilación.

--Sea la tabla: DROP TABLE cliente; CREATE TABLE cliente( ced NUMBER(8) PRIMARY KEY, nom VARCHAR2(10) NOT NULL, ciudad VARCHAR2(10) NOT NULL ); INSERT INTO cliente VALUES(1,'Pedra', 'Cali'); INSERT INTO cliente VALUES(2,'Kathy', 'Londres'); INSERT INTO cliente VALUES(3,'Donna', 'Paris');

El programa continua en la próxima diapositiva DECLARE --Una variable de tipo SYS_REFCURSOR mi_ref_cursor SYS_REFCURSOR; a1 emp%ROWTYPE; a2 cliente%ROWTYPE; BEGIN devuelve_cursor(mi_ref_cursor,'emp'); --Se invoca LOOP FETCH mi_ref_cursor INTO a1; EXIT WHEN mi_ref_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(a1.cedula || ' ' || a1.nom); END LOOP; CLOSE mi_ref_cursor; El programa continua en la próxima diapositiva

devuelve_cursor(mi_ref_cursor, 'cliente'); --Se invoca LOOP FETCH mi_ref_cursor INTO a2; EXIT WHEN mi_ref_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(a2.ced || ' ' || a2.nom || ' ' || a2.ciudad); END LOOP; CLOSE mi_ref_cursor; END; /

¿Se podrá adaptar el programa anterior de tal forma que quede funcionando para imprimir los resultados de cualquier consulta? El problema es que solo en tiempo de ejecución se sabe cual es la tabla a consultar y sus columnas  Solución: Usar el paquete DBMS_SQL.

DECLARE rcursor SYS_REFCURSOR; theCursor INTEGER; colCnt NUMBER; dTbl DBMS_SQL.DESC_TAB; val VARCHAR2(100); BEGIN OPEN rcursor FOR SELECT * FROM cliente; theCursor := DBMS_SQL.TO_CURSOR_NUMBER(rcursor); DBMS_SQL.DESCRIBE_COLUMNS(theCursor,colCnt,dTbl); FOR i IN 1 .. colCnt LOOP DBMS_SQL.DEFINE_COLUMN(theCursor,i,val,100); END LOOP; Ensayar con emp

WHILE(DBMS_SQL.FETCH_ROWS(theCursor) > 0) LOOP FOR i IN 1 .. colCnt LOOP DBMS_SQL.COLUMN_VALUE(theCursor,i,val); DBMS_OUTPUT.PUT_LINE(dTbl(i).col_name || ': ' || val); END LOOP; DBMS_OUTPUT.PUT_LINE('Siguiente registro'); DBMS_SQL.CLOSE_CURSOR(theCursor); END; /