16/04/2015 1 sesión 11 funciones y procedimientos ing. ricardo inquilla

42
04/07/22 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

Upload: agata-lazcano

Post on 27-Jan-2016

214 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

1

Sesión 11Funciones y procedimientos

Ing. Ricardo Inquilla

Page 2: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

2

Crear e invocar funciones propias con PL/SQL

Crear e invocar procedimientos con PL/SQL

Page 3: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

3

Creación de funciones y procedimientos.

Subprogramas locales. Programas almacenados y el

diccionario de datos.

Page 4: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

4

Existen dos tipos principales de bloques PL/SQL, anónimos y nominados.

Ejm: Funciones, procedimientos, paquetes y disparadores.

Los bloques anónimos, que empiezan con DECLARE o BEGIN, se compilan cada vez que se ejecutan, no se almacenan en la base de datos y no pueden llamarse directamente desde otros bloques PL/SQL.

Page 5: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

5

Los procedimientos y funciones PL/SQL se comportan de forma muy parecida a los procedimientos y funciones de otros lenguajes de tercera generación, compartiendo muchas de sus propiedades.

Los procedimientos y funciones también se

conocen con el nombre de subprogramas.

Page 6: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

6

En primer lugar creamos el procedimiento con la instrucción CREATE OR REPLACE PROCEDURE

En la llamada al procedimiento le pasamos un parámetro, en el caso del ejemplo es un mensaje.

Un subprograma es un bloque PL/SQL con una sección declarativa, una sección ejecutable y una sección de tratamiento de errores, donde únicamente la sección ejecutable es obligatoria.

Page 7: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

7

Sintaxis :CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [(argumento [IN|OUT |INOUT ] tipo....[(argumento [IN|OUT |INOUT ] tipo) ] {IS |AS} Cuerpo_procedimiento;

Page 8: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

8

nombre_procedimiento : Es el nombre del procedimiento que se quiere crear.

argumento : Es el nombre de un parámetro del procedimiento.

tipo : Es el tipo del parámetro. cuerpo_procedimiento : Es un bloque

PL/SQL que constituye el código del procedimiento.

Page 9: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

9

ININ OUTOUT IN OUTIN OUT

Pasa un valor alsubprograma

Retorna un valor a quieninvoca el subprograma

Pasa un valor alsubprograma y retorna elvalor actualizado

Puede ser una constanteo variable

Debe ser una variable Debe ser una variable

Page 10: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

10

CREATE OR REPLACE PROCEDURE imprime asasBEGINdbms_output.put_line (‘Pocedimiento 2008’);dbms_output.put_line (‘Pocedimiento 2008’);END;/ /

• Creación

BEGINimprime ();

END;/

• Llamada al subprograma

Page 11: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

11

CREATE OR REPLACE PROCEDURE imprimeCREATE OR REPLACE PROCEDURE imprime ( ( mensaje in mensaje in varchar2)varchar2)

asasBEGINBEGIN dbms_output.put_line (mensaje);dbms_output.put_line (mensaje);END;END;//

• Creación

BEGINimprime (' Este es mi primer procedimiento ');

END;/

• Llamada al subprograma

Page 12: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

12

CREATE TABLE tb_credito (credito_id varchar2(30) ,balance numeric(4,1))

Crear un procedimiento que incremente la columna balance , del codigo recibido como parametro, el monto a incrementar será recibido con otro parámetro

Page 13: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

13

create or replace procedure credito (codigo in varchar, monto in number)as

begin update tb_credito set balance = balance + monto where credito_id = codigo; end;

BEGINcredito (‘1‘,450);

END; /

• Llamada al subprograma

Page 14: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

14

CREATE TABLE tb_credito (credito_id VARCHAR2(30) ,balance numeric(4,1))

Page 15: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

15

PRIMERA FORMA-CURSOR create or replace procedure Act_lista(credito

varchar, monto numeric)asbeginupdate tb_credito set balance = balance + montowhere credito_Id = credito;end;

declare cursor cs1 is select * from tb_credito;beginAct_lista ('001', '49');for fila in cs1 loopdbms_output.put_line(fila.credito_id || '-' || fila.balance);end loop;end;

Page 16: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

16SEGUNDA FORMA-FOR

create or replace procedure p_02(id in varchar, b in numeric )

as begin update tb_credito

set balance=balance + b where credito_id=id ; for x in (select credito_id,balance from tb_credito)loop

dbms_output.put_line (x.credito_id || '-' || x.balance); end loop;

end;/ begin

p_02('002',100);end;/

Page 17: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

17

Crear un procedimiento que utilizando 1 secuencia para el código inserte 1 registro en la tabla tb_credito y utilizando excepciones muestre un mensaje de error cuando duplique la llave primaria y otro mensaje para cualquier otro error.

Page 18: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

18

CREATE OR REPLACE PROCEDURE sp_inserta_depaCREATE OR REPLACE PROCEDURE sp_inserta_depa (v_name in dept.dname%TYPE, v_local in dept.loc%TYPE)(v_name in dept.dname%TYPE, v_local in dept.loc%TYPE) ISIS v_nuevodeptno dept.deptno%TYPE;v_nuevodeptno dept.deptno%TYPE; BEGINBEGIN SELECT seq_departament.NEXTVAL INTO v_nuevodeptno FROM DUAL;SELECT seq_departament.NEXTVAL INTO v_nuevodeptno FROM DUAL; INSERT INTO dept VALUES (v_nuevodeptno, v_name, v_local);INSERT INTO dept VALUES (v_nuevodeptno, v_name, v_local); COMMIT;COMMIT;EXCEPTIONEXCEPTION WHEN DUP_VAL_ON_INDEX THENWHEN DUP_VAL_ON_INDEX THEN ROLLBACK;ROLLBACK; DBMS_OUTPUT.PUT_LINE('Ya existe un departamento con el código generado.');DBMS_OUTPUT.PUT_LINE('Ya existe un departamento con el código generado.'); WHEN OTHERS THENWHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM);DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); END;END;

Creando ProcedimietnoCreando Procedimietno

BEGINBEGINsp_inserta_depa(‘Luis’,’Costa Norte’);sp_inserta_depa(‘Luis’,’Costa Norte’);

END;END;

Ejecutar ProcedimietnoEjecutar ProcedimietnoCREATE SEQUENCE seq_empINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

CREATE SEQUENCE seq_empINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

Page 19: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

19

CREATE OR REPLACE PROCEDURE sp_inserta_depaCREATE OR REPLACE PROCEDURE sp_inserta_depa (v_name in dept.dname%TYPE, v_local in dept.loc%TYPE)(v_name in dept.dname%TYPE, v_local in dept.loc%TYPE) ISIS v_nuevodeptno dept.deptno%TYPE;v_nuevodeptno dept.deptno%TYPE; BEGINBEGIN SELECT seq_departament.NEXTVAL INTO v_nuevodeptno FROM DUAL;SELECT seq_departament.NEXTVAL INTO v_nuevodeptno FROM DUAL; INSERT INTO dept VALUES (v_nuevodeptno, v_name, v_local);INSERT INTO dept VALUES (v_nuevodeptno, v_name, v_local); COMMIT;COMMIT;EXCEPTIONEXCEPTION WHEN DUP_VAL_ON_INDEX THENWHEN DUP_VAL_ON_INDEX THEN ROLLBACK;ROLLBACK; DBMS_OUTPUT.PUT_LINE('Ya existe un departamento con el código generado.');DBMS_OUTPUT.PUT_LINE('Ya existe un departamento con el código generado.'); WHEN OTHERS THENWHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM);DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); END;END;

Creando ProcedimietnoCreando Procedimietno

BEGINBEGINsp_inserta_depa(‘Luis’,’Costa Norte’);sp_inserta_depa(‘Luis’,’Costa Norte’);

END;END;

Ejecutar ProcedimietnoEjecutar ProcedimietnoCREATE SEQUENCE seq_empINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

CREATE SEQUENCE seq_empINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

Page 20: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

20

PROCEDIMIENTO CON PARAMETRO DE SALIDA

CREATE OR REPLACE PROCEDURE sp_inserta_dept_2(p_name dept.dname%TYPE, p_local dept.loc%TYPE, p_nuevodeptno OUT dept.deptno%TYPE)

IS

BEGINSELECT seq_dept.NEXTVAL INTO p_nuevodeptno FROM DUAL;INSERT INTO dept VALUES (p_nuevodeptno, p_name, p_local);COMMIT;

EXCEPTIONWHEN DUP_VAL_ON_INDEX THEN

DBMS_OUTPUT.PUT_LINE('Ya existe un departamento con el código generado.');

p_nuevodeptno :=-1;WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM);p_nuevodeptno :=-1;

END;/

CREATE SEQUENCE seq_deptINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

CREATE SEQUENCE seq_deptINCREMENT BY 1START WITH 1NOMAXVALUENOCYCLE;

Page 21: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

21LLAMANDO AL

PROCEDIMIENTO

DECLAREv_nombre DEPT.dname%TYPE:='RRHH';v_local DEPT.loc%TYPE:='LINCE';v_nuevocodigo DEPT.deptno%TYPE;

BEGINsp_inserta_dept_2('FINANZAS','LIMA',v_nuevocodigo);dbms_output.put_line('Nuevo Departamento: ' || v_nuevocodigo);

sp_inserta_dept_2(v_nombre,v_local,v_nuevocodigo);dbms_output.put_line('Nuevo Departamento: ' || v_nuevocodigo);

END;/

Page 22: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

22

9.-Crear un procedimiento que muestre los tres primeros empleado(nombres) que tienen un salario superior a 2000.

Page 23: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

23

SOLUCIONDECLAREPROCEDURE ENCONTRAR ISCURSOR C1 IS SELECT EMPNO,ENAME FROM EMP WHERE SAL>2000;REGISTRO C1%ROWTYPE;

BEGINOPEN C1;FETCH C1 INTO REGISTRO;IF C1 %ROWCOUNT=3 THENDBMS_OUTPUT.PUT_LINE(REGISTRO.EMPNO || ' '||REGISTRO.ENAME);ELSEDBMS_OUTPUT.PUT_LINE('NO SE ENCONTRO');END IF;CLOSE C1;END ENCONTRAR;/BEGIN ENCONTRAR;END;

Page 24: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

24

create or replace procedure sp_empleados2000 is begin DECLARE CURSOR todos2000 IS SELECT * FROM emp where

sal>2000; mi_emp emp%ROWTYPE; BEGIN OPEN todos2000; LOOP FETCH todos2000 INTO mi_emp; /* Procesar sólamente los empleados de salario

superior a 2000*/ EXIT WHEN todos2000%NOTFOUND or

todos2000%ROWCOUNT > 3; DBMS_OUTPUT.PUT_LINE(mi_emp.empno ||' '||

mi_emp.ename ||' '|| mi_emp.sal ); END LOOP; CLOSE todos2000; END; end;

Page 25: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

25

10.- Crear un procedimiento que liste todos los empleados que tienen un nombre de 5 letras.

Page 26: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

26

DECLAREPROCEDURE EJERCICIO_7_4 ISCURSOR C1 IS SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE LENGTH(ENAME)=&long;REGISTRO C1%ROWTYPE;

BEGINOPEN C1;LOOPFETCH C1 INTO REGISTRO;EXIT WHEN C1%NOTFOUND;DBMS_OUTPUT.PUT_LINE (REGISTRO.ENAME ||' '||REGISTRO.JOB ||' '||REGISTRO.SAL||' '||REGISTRO.DEPTNO);END LOOP;CLOSE C1;END EJERCICIO_7_4;BEGINEJERCICIO_7_4;END;/

Page 27: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

27

Sintaxis :CREATE [OR REPLACE] FUNCTION nombre_función [(argumento [IN|OUT |INOUT ] tipo....[(argumento [IN|OUT |INOUT ] tipo) ] RETURN tipo_retorno{IS |AS} Cuerpo_función;

Page 28: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

28

nombre_función : Es el nombre de la función que se quiere crear.

argumento : Es el nombre de un parámetro de la función.

tipo : Es el tipo del parámetro. tipo_retorno : Es el tipo del valor que

devuelve la función. cuerpo_función : Es un bloque PL/SQL que

constituye el código de la función.

Page 29: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

29--1.- Utilizar la Tabla tb_credito--1.- Utilizar la Tabla tb_credito

--2.- Crear función que retorna monto(balance)--2.- Crear función que retorna monto(balance)

CREATE or replace FUNCTION obtener_monto CREATE or replace FUNCTION obtener_monto ((monto_no IN NUMBER) RETURN NUMBER ) RETURN NUMBER IS IS acc_bal NUMBER(11,2); BEGIN BEGIN SELECT balance INTO SELECT balance INTO acc_bal FROM tb_credito WHERE credito_id = monto_no; tb_credito WHERE credito_id = monto_no; RETURN(acc_bal); RETURN(acc_bal); END; END;

--3.- Ejecutar Funcióndeclare valor number(4); begin valor:=obtener_monto(2);dbms_output.put_line(valor);end;/

Page 30: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

30

CREATE OR REPLACE FUNCTION sf_can_empleadoCREATE OR REPLACE FUNCTION sf_can_empleado(p_dept dept.deptno%TYPE)(p_dept dept.deptno%TYPE)

RETURN NUMBERRETURN NUMBERISISv_numerov_numero number(6); number(6);

BEGINBEGINSELECT count(1) INTO v_numero FROM emp WHERESELECT count(1) INTO v_numero FROM emp WHERE deptno = p_dept;deptno = p_dept;RETURN v_numero;RETURN v_numero;EXCEPTIONEXCEPTIONWHEN OTHERS THENWHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Error Inesperado.' ||SQLERRM);DBMS_OUTPUT.PUT_LINE('Error Inesperado.' ||SQLERRM);END;END;

DECLAREDECLAREValor NUMBER(6);Valor NUMBER(6);BEGINBEGINValor := sf_can_empleado(20);Valor := sf_can_empleado(20);dbms_output.put_line(valor);END; END; 

Cantidad de empleados que pertenecen al departamento enviado como parámetro  

Page 31: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

31

Dentro del cuerpo de una función, la instrucción RETURN, se utiliza para devolver el control, junto con un valor, al entorno que realizó la llamada.

Sintaxis :RETURN expresión;

Page 32: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

32

Eliminación de procedimientos :DROP PROCEDURE nombre_procedimiento;

Eliminación de funciones :DROP FUNCTION nombre_función;

Page 33: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

33

Subprogramas Locales

Page 34: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

34

Los subprogramas locales no crean un objeto en la base de datos, solo tienen vigencia durante la ejecución del programa o subprograma que los crea e invoca.

Los subprogramas locales deben ser declarados al final de la sección declarativa .

Page 35: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

35DECLARE CURSOR c_Emps IS SELECT ename, job FROM emp; v_salida_formateada VARCHAR2(50); -- Función que devolverá el nombre y job --concatenados y separados por espacio FUNCTION Formateador ( p_ename IN VARCHAR2,

p_job IN VARCHAR2) RETURN p_ename||' '||p_job;END Formateador;-- Inicio del bloque principalBEGIN FOR v_emp_record IN c_Emps LOOP v_salida_formateada :=

Formateador(v_emp_record.ename,v_emp_record.ename.job); DBMS_OUTPUT.PUT_LINE(v_salida_formateada);

END LOOP;END;

Page 36: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

36

Programas almacenados y el diccionario de datos

Page 37: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

37

La vista del diccionario de datos que contiene el código de un procedimiento o de una función es la vista ALL_SOURCE.

Page 38: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

38

select * from user_objectswhere object_type =

‘PROCEDURE'

Mostrar errores de procedimiento y funciones Errors show

Page 39: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

39

Mucha Gracias por tu atención.

Page 40: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

40

Crea un procedimiento que utilizando dos parámetro inserte 1 registro en la tabla crédito y muestre el ultimo monto insertado.

Page 41: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

41

Page 42: 16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla

21/04/23

42

select * from user_objectswhere object_type = ‘PROCEDURE'