Unidad vi esp parte 2 procesimientos en plsql y transact sql

25
Ejercicios de PL SQL • Los siguientes ejercicios han sido desarrollados basados en el esquema HR • Si no lo tiene… ejecute los scripts que se le proporcionaron.

Transcript of Unidad vi esp parte 2 procesimientos en plsql y transact sql

Ejercicios de PL SQL

• Los siguientes ejercicios han sido desarrollados basados en el esquema HR

• Si no lo tiene… ejecute los scripts que se le proporcionaron.

TRIGGER(ORACLE)

• Bitácora de inserción, eliminación y actualización.CREAR TABLAS PARA TRABAJAR TRIGGERS Y OTROS PROCESOS CREATE TABLE EMP (EMPNO NUMBER(3,0),

NOMBRE VARCHAR2(40), TRABAJO VARCHAR2(20), DEPNO NUMBER(3,0),

SALARIO NUMBER(8,2) ) ;create table bitacora (accion char(20) NULL,empno number(3,0)

NULL);

TRIGGER(SQL)

• Bitácora de inserción, eliminación y actualización.CREAR TABLAS PARA TRABAJAR TRIGGERS Y OTROS PROCESOS CREATE TABLE EMP (EMPNO NUMERIC(3,0),

NOMBRE VARCHAR(40), TRABAJO VARCHAR(20), DEPNO NUMERIC(3,0),

SALARIO NUMERIC(8,2) ) ;create table bitacora (accion char(20) NULL,empno numeric(3,0)

NULL);

Trigger para hacer bitácora(ORACLE)

create or replace TRIGGER TR_EMP BEFORE INSERT OR DELETE OR UPDATE ON EMPREFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLAREBEGIN IF INSERTING THEN INSERT INTO bitacora VALUES ('INSERTO',:NEW.EMPNO);

END IF; IF DELETING THEN INSERT INTO bitacora VALUES ('ELIMINO',:OLD.EMPNO); END

IF; IF UPDATING THEN INSERT INTO bitacora VALUES ('MODIFICO',:OLD.EMPNO);

END IF;END;/

Trigger para hacer bitácora (sql)Create TRIGGER TR_EMPON EMPAFTER INSERT,DELETE,UPDATEASDECLARE @nempleado intBEGINSET NOCOUNT ON; IF EXISTS(SELECT * FROM INSERTED)

beginselect @nempleado=empno from inserted

IF EXISTS(SELECT * FROM DELETED) INSERT INTO bitacora VALUES ('MODIFICO',@nempleado)

ELSEINSERT INTO bitacora VALUES ('ADICIONO',@nempleado)

end ELSE IF EXISTS(SELECT * FROM DELETED) begin

select @nempleado=empno from deletedINSERT INTO bitacora VALUES ('ELIMINO', @nempleado)

end END

Estructura de un bloque PL/SQLen esquema HR(programa 1)imprimir un valor cualquiera

set serveroutput on;DECLAREv_nombre employees.employee_id % TYPE;beginv_nombre:=1;dbms_output.put_line(v_nombre);end;

Estructura de un bloque PL/SQLen esquema HR(programa 2)

Salario mayor

DECLAREv_mayor employees.salary % TYPE;beginv_mayor:=0;select max(salary) into v_mayorfrom employees; dbms_output.put_line(v_mayor);end;

Estructura de un bloque PL/SQLen esquema HR(programa 3)

Salario mayor, menor … n variables

DECLAREv_mayor employees.salary % TYPE;v_menor employees.salary % TYPE;beginv_mayor:=0;v_menor:=0;select max(salary),min(salary) into v_mayor,v_menorfrom employees ;dbms_output.put_line('salario mayor es '|| to_char (v_mayor));dbms_output.put_line('salario menor es '||to_char(v_menor));End;

Estructura de un bloque PL/SQLcrear secuencias y una tabla para trabajar los programas

CREATE SEQUENCE NUMEMPLEADOS MINVALUE 0 MAXVALUE 1000 INCREMENT BY 1 START WITH 0 CACHE 20 NOORDER NOCYCLE ;

EN BASE A UNA SECUENCIA GUARDAR INSERTAR EMPLEADOS CON ESE CORRELATIVOS

DECLAREv_empno emp.empno%TYPE;BEGINSELECT NUMEMPLEADOS.NEXTVALINTO v_empnoFROM dual;INSERT INTO emp(empno, nombre, trabajo, depno)VALUES(v_empno, 'nombre'|| to_char (v_empno),'AUXILIAR',

10);Commit;END;

INSERTAR 10 REGISTROS EN UN CICLO FOR .. LOOP

DECLARE

BEGINFOR i IN 1..10 LOOPINSERT INTO emp(empno, nombre)VALUES(i, 'nombre'|| to_char (i));END LOOP;Commit;END;

INSERTAR EN UN CICLO WHILEdesde un valor mínimo hasta un máximo

ACCEPT menor PROMPT 'Introduce el menor: 'ACCEPT mayor PROMPT 'Introduce el mayor: 'DECLAREmaximo number;minimo number;BEGINmaximo:=0;minimo:=0;maximo:=to_number(&mayor);minimo:=to_number(&menor);WHILE maximo>= minimo LOOP dbms_output.put_line(minimo);INSERT INTO emp(empno, nombre, trabajo, depno)VALUES(minimo, 'nombre'|| to_char (minimo),'AUXILIAR', 10); minimo:= minimo+1;END LOOP;Commit;END;

Uso de rowtype y cursor para imprimir valores de una tabla(PLSQL)

DECLARE CURSOR cemp IS SELECT empno,nombre,depno FROM emp; cepm_rec cemp%ROWTYPE; BEGIN DBMS_OUTPUT.PUT_LINE ('no nombre depno'); FOR cemp_rec IN cemp LOOP DBMS_OUTPUT.PUT_LINE (cemp_rec.empno || ' ' || cemp_rec.nombre|| ' ' || cemp_rec.depno); END LOOP;END;

PARA PRACTICAR CON LOS PROCEDIMIENTOS Y FUNCIONES, AGREGUE UNA COLUMNA LLAMADA SALARIO A EMP Y

PONGALES VALORES FICTICIOS

• EJ. ALTER TABLE EMP ADD SALARIO NUMBER(12,2);• UPDATE EMP SET SALARIO=2000; O BORRAR LOS DATOS MANUALMENTE, AGREGAR

COLUMNA EN SQL DEVELOPERY TOMANDO DE BASE EL CODIGO QUE ESTA EN LA LAMINA

8... MODIFICAR EL INSERT… INSERT INTO emp(empno, nombre, trabajo, depno, salario)VALUES(minimo, 'nombre'|| to_char (minimo),'AUXILIAR',

10,2000);

PROCEDIMIENTO1…(oracle)modificar el salario del empleado n(salario x 1.1)

CREATE OR REPLACE PROCEDURE act_salario (v_id in emp.empno%TYPE)ISBEGINUPDATE empSET salario = salario * 1.10WHERE empno =v_id;END act_salario;/Ejecutelo para el empleado 10

EXECUTE act_salario (10);

CREATE PROCEDURE act_salario( @numemp INT OUTPUT )

AS UPDATE empSET salario = salario * 1.10WHERE empno = @numemp

EXEC dbo.act_salario @numemp = 2

PROCEDIMIENTO1…(SQL)modificar el salario del empleado n(salario x 1.1)

CREATE OR REPLACE PROCEDURE act_sa2 (v_id in emp.empno%TYPE, v_sal in emp.salario%TYPE)ISBEGINUPDATE empSET salario = v_salWHERE empno =v_id;END act_sa2;/Ejecutelo para el empleado 10

EXECUTE act_sa2 (10,3000);

PROCEDIMIENTO2…(oracle)modificar el salario del empleado n, salario x

PROCEDIMIENTO2…(SQL)modificar el salario del empleado n, salario x

CREATE PROCEDURE act_salario2( @numemp INT, @nsalario DOUBLE OUTPUT )

AS UPDATE empSET salario = @nsalario WHERE empno = @numemp

EXEC dbo.act_salario2 @numemp = 2, @nsalario = 40

FUNCION EN PL SQL(ORACLE)

CREATE OR REPLACE FUNCTION obten_sal (v_id IN emp.empno%TYPE)RETURN NUMBERISv_salario emp.salario%TYPE :=0;BEGINSELECT salario INTO v_salaryFROM emp WHERE empno = v_id;RETURN (v_salary);END obten_sal;

EJECUCION DE FUNCION EN PL SQL(ORACLE)

VARIABLE g_salario numberEXECUTE :g_salario := obten_sal(1)

FUNCION EN TRANSACT SQL(SQL)CREATE FUNCTION fn_ObtenSalario(@Numempl int)RETURNS DECIMAL(10,2)ASBEGIN DECLARE @mSalario DECIMAL(10,2)SELECT @mSalario = salario FROM emp WHERE empno=

@Numempl RETURN @mSalarioEND

EJECUCION DE FUNCION EN TRANSACT(SQL)

DECLARE @Numempl int, @Resultado DECIMAL(10,2)SET @Numempl= 2SET @Resultado =hr.dbo.fn_ObtenSalario(@Numempl)PRINT @Resultado

Cursores en Transact SQL

Un cursor es una variable que nos permite recorrer con un conjunto de resultados obtenido a través de una sentencia SELECT fila a fila.

Cuando trabajemos con cursores debemos seguir los siguientes pasos.

• Declarar el cursor, utilizando DECLARE• Abrir el cursor, utilizando OPEN• Leer los datos del cursor, utilizando FETCH ... INTO• Cerrar el cursor, utilizando CLOSE• Liberar el cursor, utilizando DEALLOCATE

CURSOR TRANSACT SQL-- Declaracion de variables para el cursorDECLARE @empno numeric(3,0),

@nombre varchar(40),@trabajo varchar(20),@depno numeric(3,0),@salario numeric(12,2)

-- Declaración del cursorDECLARE cEMP CURSOR FORSELECT empno, nombre, trabajo, depno, salario FROM EMP

-- Apertura del cursorOPEN cEMP

CURSOR TRANSACT SQL-- Lectura de la primera fila del cursor/ luego impresión en ciclo whileFETCH cEMP INTO @empno, @nombre, @trabajo, @depno, @salarioPRINT ' nemp nombre trabajo depno salario'-- Lectura de la siguiente fila del cursorWHILE (@@FETCH_STATUS = 0 )BEGIN PRINT STR(@empno)+' '+@nombre + ' ' +replicate ('*',40-LEN(@nombre))+' '+

@trabajo +' '+replicate ('*',20-LEN(@trabajo))+STR(@depno)+' '+STR( @salario)-- Lectura de la siguiente fila del cursorFETCH cEMP INTO @empno, @nombre, @trabajo, @depno, @salarioEND-- Cierre del cursorCLOSE cEMP-- Liberar los recursosDEALLOCATE cEMP