Sei sulla pagina 1di 43

BASE DE DATOS

ESC. INGENIERIA DE SISTEMAS


MODALIDAD EXPERIENCIA LABORAL

SQL: PROGRAMACIN EN BLOQUES


Procedimientos Almacenados

SESIN 08 Ing. Johny Pretell C.


Lima, Semestre 2011-1

Contenido
Programacin en Bloques

Procedimientos Almacenados - Bloque Nombrados y No Nombrados


Cursores Funciones Disparadores (triggers)

Programacin en Bloques
Extensin del SQL Standard que guarda las caractersticas de diseo de los lenguajes de programacin. Los bloques de cdigo se conocen como scripts y pueden ser: 1. nombrados 2. no nombrados. Incluyen sentencias tipo DML y en algunos DBMS ciertas sentencias tipo DDL y DCL (estas ltimas son restringidas). En oracle se denomina PL/SQL: Procedural Language.

Programacin con SQL


Tambin conocida como programacin en bloques. Se pueden programar objetos como:

PROCEDURES FUNCTIONS

TRIGGERS
PACKAGES (ORACLE)

Proceso batch: SQL CLR (SQL Server) PL/SQL (ORACLE)

Beneficios de la Programacin en Bloques


Modulariza el desarrollo de la programacin Permite el manejo de variables, constantes, cursores. Excepciones en el caso de Oracle. Programar con estructuras de control de lenguaje procedural para tratamientos alternativos y repetitivos Manejo de errores Portabilidad Integracin Aumenta el performance.

Rendimiento del DBMS


SENTENCIAS SQL

DBMS

PROGRAMA SQL EN BLOQUES

DBMS

Programacin en Bloque
Los programas SQL pueden ejecutarse desde el Cliente desde el Servidor:
Cliente (client side) los procedimientos y funciones se ejecutan en el cliente e interaccionan con el servidor mediante queries. Servidor (server side) los procedimientos y funciones se almacenan en el servidor y son invocadas desde el cliente.

Programacin en Bloque: Ventajas del Side Server


Muchas aplicaciones pueden usar el mismo procedimiento o funcin, sin tener que copiarla o crear objetos redundantes. Se pueden invocar desde otros queries de SQL Si se modifica un procedimiento o funcin, todas las aplicaciones que la usan quedan actualizadas.

Bloque Nombrado

Procedimientos Almacenados
Coleccin de sentencias SQL como si se tratase de un lenguaje estructurado (C, Pascal, ... ). Es decir: es posible llamarlo mediante un identificador, puede recibir argumentos y devolver un valor de retorno. Ejemplo:
EXEC CALCULA_LIQUIDAC (@numEmp, @Ini, @Fin)

Caracterstica primordial: Se optimizan en el momento de su creacin.

Procedimientos Almacenados
Se crea, se compila y se almacena de manera normalizada en una tabla del sistema.
Las siguientes ejecuciones del SP son rpidas, porque: - Ya est normalizado - Ya est compilado y optimizado

El proceso optimizado se mantiene en memoria para posteriores ejecuciones (ahorro adicional de tiempo y recurso).

Creacin de un PROCEDURE
Para crear un PROCEDURE (procedimientos almacenado) tanto en SQL Server como en Oracle se puede utilizar la consola del Editor de Consultas, la consola del Enterprise

Manager o cualquier otra herramienta. Sintaxis CREATE PROCEDURE (SQL Server)

CREATE PROCEDURE [propietario.] nombre_proc [(lista de parmetros) ]


[{FOR REPLICATION} | {WITH RECOMPILE} [{[WITH] | [,]} ENCRYPTION]] AS sentencias SQL
Nota.- Todo lo que va entre [ ] es opcional.

Ejemplo de PROCEDURE (SQL Server)


CREATE PROCEDURE CORRIGE_COD ( @cod char(10), @nom char(10) ) AS BEGIN declare @v_cod char(10) If (LEN(@cod) < 10) Begin --Completa ceros a la izquierda set @v_cod = replicate( '0',10 - LEN(@cod) ) + @cod; print 'Nuevo Cod.: ' + @v_cod; print 'Nombre Alu: ' + UPPER(@nom); End Else print 'Cdigo OK!!!!!!!!!!!!!!!'; END

exec CORRIGE_COD '41','juan'

Creacin de un PROCEDURE En ORACLE


CREATE [OR REPLACE] PROCEDURE procedure_name (argument1 [mode1] datatype1, argument2 [mode2] datatype2, . . . IS parte declarativa (OPCIONAL) BEGIN sentencias ejecutables [EXCEPTION] END;

Manejo de parmetros
Procedimiento

entorno de llamada

Parmetro IN Parmetro OUT Parmetro IN OUT


(DECLARE) BEGIN EXCEPTION END;

Modo de parmetros
IN
Por Defecto Valor que se pasa al Subprograma

OUT
Tiene que especif. Devuelve al entorno de llamada

IN OUT
Tiene que especif. Valor que se pasa al Subprograma; Devuelve al ent. de llamada Variable Inicializada

Parmetro formal constante Parmetro Actual puede ser un literal, expresin, constante o variable inicializada

Variable no Inicializada

Tiene que ser una variable

Tiene que ser una variable

En ORACLE

Ejemplo: Parmetro IN
7369 v_id

SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%TYPE) 3 IS 4 BEGIN 5 UPDATE emp 6 SET sal = sal * 1.10 7 WHERE empno = v_id; 8 END raise_salary; 9 / Procedure created.

SQL> EXECUTE raise_salary (7369) PL/SQL procedure successfully completed.

Ejemplo: Parmetro OUT


Entorno de Llamada

En ORACLE

Proc. QUERY_EMP v_id MARTIN v_name 1250 1400 v_salary v_ comm

7654

SQL> 1 2 3 4 5 6 7 8 9 10 11 12

CREATE OR REPLACE PROCEDURE query_emp (v_id IN emp.empno%TYPE, v_name OUT emp.ename%TYPE, v_salary OUT emp.sal%TYPE, v_comm OUT emp.comm%TYPE) IS BEGIN SELECT ename, sal, comm INTO v_name, v_salary, v_comm FROM emp WHERE empno = v_id; END query_emp; /

En ORACLE

Ejemplo: Parmetro IN OUT


Calling environment
'(800)633-0575'

FORMAT_PHONE procedure
'(800)633-0575'

v_phone_no

SQL> CREATE OR REPLACE PROCEDURE format_phone 2 (v_phone_no IN OUT VARCHAR2) 3 IS 4 BEGIN 5 v_phone_no := '(' || SUBSTR(v_phone_no,1,3) || 6 ')' || SUBSTR(v_phone_no,4,3) || 7 '-' || SUBSTR(v_phone_no,7); 8 END format_phone; 9 /

En ORACLE

Llamada a un PROCEDURE desde un Bloque NO Nombrado (Annimo)

DECLARE v_id NUMBER := 7900; BEGIN raise_salary(v_id); COMMIT; ... END;

--invoke procedure

Llamada a un PROCEDURE desde un Bloque NO Nombrado (Annimo)


CREATE PROCEDURE CORRIGE_COD ( @cod char(10) OUTPUT, @nom char(10) OUTPUT ) AS BEGIN Begin --Completa ceros a la izquierda set @cod = replicate( '0',10 - LEN(@cod) ) + @cod; Set @nom = UPPER(@nom); End END BEGIN Declare @codigo char(10) Declare @nombre char(10) Select @codigo = '12', @nombre = 'juan' exec CORRIGE_COD @codigo output, @nombre output print 'Nuevo Cod.: ' + @codigo; print 'Nombre Alu: ' + @nombre; END

En ORACLE

Llamada a un PROCEDURE desde otro Procedure


SQL> CREATE OR REPLACE PROCEDURE process_emps 2 IS 3 CURSOR emp_cursor IS 4 5 6 BEGIN 7 FOR emp_rec IN emp_cursor LOOP 8 raise_salary(emp_rec.empno); 9 END LOOP; 10 COMMIT; 11 END process_emps; 12 /

SELECT empno FROM emp;

--invoke procedure

Borrando un PROCEDURE
DROP PROCEDURE procedure_name

SQL> DROP PROCEDURE raise_salary; Procedure dropped.

Resumen
Un procedimiento es un bloque nombrado que realiza una accin.
Usa parmetros para pasar datos desde el entorno de llamada al procedimiento. Los Procedimientos pueden ser llamados desde cualquier herramienta, aplicacin lenguaje que soporte el SGBD. Los Procedimientos pueden servir como bloques de una aplicacin.

Qu es un Cursor?
Es una estructura de datos que nos permite recorrer el resultado de una consulta SQL y realizar operaciones en cada paso de sta.
La sintaxis para definir un cursor es la siguiente: DECLARE nombre-cursor FOR especificacion-consulta [ORDER BY]

Cursores
Por ejemplo:
DECLARE Mi_Cursor FOR SELECT num_emp, nombre, puesto, salario FROM empleados WHERE num_dept = 'informatica'
Nota: Este comando es slo declarativo. Especifica las filas y columnas que se van a recuperar. La consulta se ejecuta cuando se abre o se activa el cursor.

Ejemplo: Cursor
CREATE PROCEDURE EJEMPLO AS BEGIN /* La tabla Cliente 8 campos */ declare @cod as int declare @user as varchar(50) declare @pass as varchar(50)
-- declaramos el cursor e indicamos los campos a traer

declare CURSORITO cursor for select CliCod, CliUser, CliPass from Cliente open CURSORITO
-- Vamos al primer registro y cargamos en las variables los valores encontrados

fetch next from CURSORITO into @cod, @user, @pass while @@fetch_status = 0 begin update Cliente set CliPass= @user where CliCod=@cod
-- Avanzamos otro registro

fetch next from CURSORITO into @cod, @user, @pass end


-- cerramos el cursor

close CURSORITO END

Qu es una Funcin?
Es una porcin encapsulada de cdigo que puede ser reutilizada por diferentes programas.
Los SGBD traen funciones ya construidas que pueden ser utilizadas dentro de las aplicaciones para proveer funcionalidad comn. Ejemplo: GETDATE() retorna la fecha y hora actual del sistema.

Tipos de funciones
Scalar Functions: Retorna un resultado
con un valor escalar.

Table-Value Functions: Retorna el


resultado en forma de tabla.

Scalar Functions
Pueden aceptar 0 o parmetros de entrada. ms
Retorna solo un valor escalar. Generalmente se usan en como campos de columnas y en las condiciones del Where. No se puede utilizar una funcin para cambiar el estado de un objeto de la base de datos (No puede insertar, modificar, eliminar datos de una tabla. No puede borrar tablas u otros objetos de la base de datos).

Tabled-Value Functions
Cumplen las mismas reglas de las Scalar Functions. Retorna una tabla como salida. Generalmente se usan en la clausula FROM.

Sintaxis de una Funcin Escalar


El Nombre debe ser nico

Puede o no puede tener parametros

Tipo de parametro

Tipo de dato de retorno

Cuerpo Opcional

Sintaxis de una Table-Value Functions

Funciones Determinsticas y No Determinsticas


Funciones Deterministicas: retorna

siempre para el o los mismos parametros de entrada, el mismo valor de resultado. Ejemplo: Cos(). Funciones No Deterministicas: retorna diferentes valores de resultado cada vez que se les llaman Ejemplo: GetDate().

Qu es un Trigger Disparador?
Un evento que se ejecuta automticamente cuando se cumple una condicin establecida, al realizar una operacin de: insercin (INSERT), actualizacin (UPDATE) o borrado (DELETE).
Es una implementacion de Transact-SQL en un proceso batch SQL CLR que responde a un evento dentro de la base de datos.
SQL CLR: SQL Common Language Runtime

Tipos de Triggers
Existen 2 tipos:
Data Manipulation Languaje (DML): se ejecutan con las intrucciones INSERT, UPDATE or DELETE. Data Definition Languaje (DFL): se ejecutan cuando se crean, alteran o borran objetos de la base de datos.

DML Triggers
Puede estar atachado a una tabla o una vista en un evento particular definido. Modos de ejecucion:
AFTER: Se ejecuta cuando se

DDL Triggers
El propsito principal es auditar acciones realizadas en una base de datos.

completa exitosamente todas las validaciones y operaciones de una accion.


INSTEAD OF: Se ejecuta sobre la

operacion definida, sin importar si se complet toda la accin.

Un DML trigger no puede ser ejecutado por un usuario.


No se puede crear, modificar, borrar, realizar o restaurar una base de datos mediante un trigger. No puede crear alterar tablas o ndices mediante un trigger.

Sintaxis de un DML Trigger

Sintaxis de un DDL Trigger

Ejemplo: Trigger
Se tiene una tabla NOTAS de los alumnos y se desea auditar cada vez que alguien modifique altere la nota (UPDATE). Create table Notas ( codAlu int PRIMARY KEY, nota int ) Create table Auditoria ( codAlu int, nota_ant int, nota_nue int, obs varchar(20), fecha datetime )

CREATE trigger CAMBIASTATUS ON Notas For Update As Insert Into AUDITORIA Select d.codAlu, d.nota, i.nota, 'Modificacin', getdate() From Deleted d INNER JOIN Inserted i ON d.codAlu = i.codAlu
Inserted y Deleted son tablas lgicas que contienen los valores antiguos y los valores nuevos respectivamente.

43