Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porAgata Lazcano Modificado hace 9 años
1
16/04/2015 1 Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla
2
16/04/2015 2 Crear e invocar funciones propias con PL/SQL Crear e invocar procedimientos con PL/SQL
3
16/04/2015 3 Creación de funciones y procedimientos. Subprogramas locales. Programas almacenados y el diccionario de datos.
4
16/04/2015 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.
5
16/04/2015 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.
6
16/04/2015 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.
7
16/04/2015 7 Sintaxis : CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [(argumento [IN|OUT |INOUT ] tipo.... [(argumento [IN|OUT |INOUT ] tipo) ] {IS |AS} Cuerpo_procedimiento;
8
16/04/2015 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.
9
16/04/2015 9 INOUT IN OUT Pasa un valor al subprograma Retorna un valor a quien invoca el subprograma Pasa un valor al subprograma y retorna el valor actualizado Puede ser una constante o variable Debe ser una variable
10
16/04/2015 10 CREATE OR REPLACE PROCEDURE imprime as as BEGIN dbms_output.put_line (‘Pocedimiento 2008’); END;/ Creación BEGIN imprime (); END; / Llamada al subprograma
11
16/04/2015 11 CREATE OR REPLACE PROCEDURE imprime ( mensaje in varchar2) as asBEGIN dbms_output.put_line (mensaje); dbms_output.put_line (mensaje);END;/ Creación BEGIN imprime (' Este es mi primer procedimiento '); END; / Llamada al subprograma
12
16/04/2015 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
13
16/04/2015 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; BEGIN credito (‘1‘,450); END; / Llamada al subprograma
14
16/04/2015 14 CREATE TABLE tb_credito (credito_id VARCHAR2(30), balance numeric(4,1))
15
16/04/2015 15 create or replace procedure Act_lista(credito varchar, monto numeric) as begin update tb_credito set balance = balance + monto where credito_Id = credito; end; declare cursor cs1 is select * from tb_credito; begin Act_lista ('001', '49'); for fila in cs1 loop dbms_output.put_line(fila.credito_id || '-' || fila.balance); end loop; end;
16
16/04/2015 16 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; /
17
16/04/2015 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.
18
16/04/2015 18 CREATE 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) IS IS v_nuevodeptno dept.deptno%TYPE; v_nuevodeptno dept.deptno%TYPE; BEGIN BEGIN 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;EXCEPTION WHEN DUP_VAL_ON_INDEX THEN WHEN 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 THEN WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); END; END; Creando Procedimietno BEGIN sp_inserta_depa(‘Luis’,’Costa Norte’); END; Ejecutar Procedimietno CREATE SEQUENCE seq_emp INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE; CREATE SEQUENCE seq_emp INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE;
19
16/04/2015 19 CREATE 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) IS IS v_nuevodeptno dept.deptno%TYPE; v_nuevodeptno dept.deptno%TYPE; BEGIN BEGIN 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;EXCEPTION WHEN DUP_VAL_ON_INDEX THEN WHEN 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 THEN WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); DBMS_OUTPUT.PUT_LINE('Error Inesperado.' || SQLERRM); END; END; Creando Procedimietno BEGIN sp_inserta_depa(‘Luis’,’Costa Norte’); END; Ejecutar Procedimietno CREATE SEQUENCE seq_emp INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE; CREATE SEQUENCE seq_emp INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE;
20
16/04/2015 20 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 BEGIN SELECT seq_dept.NEXTVAL INTO p_nuevodeptno FROM DUAL; INSERT INTO dept VALUES (p_nuevodeptno, p_name, p_local); COMMIT; EXCEPTION WHEN 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_dept INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE; CREATE SEQUENCE seq_dept INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE;
21
16/04/2015 21 DECLARE v_nombreDEPT.dname%TYPE:='RRHH'; v_localDEPT.loc%TYPE:='LINCE'; v_nuevocodigoDEPT.deptno%TYPE; BEGIN sp_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; /
22
16/04/2015 22 9.-Crear un procedimiento que muestre los tres primeros empleado(nombres) que tienen un salario superior a 2000.
23
16/04/2015 23 DECLARE PROCEDURE ENCONTRAR IS CURSOR C1 IS SELECT EMPNO,ENAME FROM EMP WHERE SAL>2000; REGISTRO C1%ROWTYPE; BEGIN OPEN C1; FETCH C1 INTO REGISTRO; IF C1 %ROWCOUNT=3 THEN DBMS_OUTPUT.PUT_LINE(REGISTRO.EMPNO || ' '||REGISTRO.ENAME); ELSE DBMS_OUTPUT.PUT_LINE('NO SE ENCONTRO'); END IF; CLOSE C1; END ENCONTRAR; / BEGIN ENCONTRAR; END;
24
16/04/2015 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;
25
16/04/2015 25 10.- Crear un procedimiento que liste todos los empleados que tienen un nombre de 5 letras.
26
16/04/2015 26 DECLARE PROCEDURE EJERCICIO_7_4 IS CURSOR C1 IS SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE LENGTH(ENAME)=&long; REGISTRO C1%ROWTYPE; BEGIN OPEN C1; LOOP FETCH 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; BEGIN EJERCICIO_7_4; END; /
27
16/04/2015 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;
28
16/04/2015 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.
29
16/04/2015 29 --1.- Utilizar la Tabla tb_credito --2.- Crear función que retorna monto(balance) CREATE or replace FUNCTION obtener_monto () RETURN NUMBER (monto_no IN NUMBER) RETURN NUMBERIS acc_bal NUMBER(11,2); BEGIN BEGIN SELECT balance INTO tb_credito WHERE credito_id = monto_no; SELECT balance INTO acc_bal FROM tb_credito WHERE credito_id = monto_no;RETURN(acc_bal);END; --3.- Ejecutar Función declare valor number(4); begin valor:=obtener_monto(2); dbms_output.put_line(valor); end; /
30
16/04/2015 30 CREATE OR REPLACE FUNCTION sf_can_empleado (p_dept dept.deptno%TYPE) RETURN NUMBER IS v_numero number(6); BEGIN SELECT count(1) INTO v_numero FROM emp WHERE deptno = p_dept; deptno = p_dept; RETURN v_numero; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error Inesperado.' ||SQLERRM); END; DECLARE Valor NUMBER(6); BEGIN Valor := sf_can_empleado(20); dbms_output.put_line(valor);END; Cantidad de empleados que pertenecen al departamento enviado como parámetro
31
16/04/2015 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;
32
16/04/2015 32 Eliminación de procedimientos : DROP PROCEDURE nombre_procedimiento; Eliminación de funciones : DROP FUNCTION nombre_función;
33
16/04/2015 33 Subprogramas Locales
34
16/04/2015 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.
35
16/04/2015 35 DECLARE 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 principal BEGIN FOR v_emp_record IN c_Emps LOOP v_salida_formateada := Formateador(v_emp_record.ename,v_emp_record.en ame.job); DBMS_OUTPUT.PUT_LINE(v_salida_formateada); END LOOP; END;
36
16/04/2015 36 Programas almacenados y el diccionario de datos
37
16/04/2015 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.
38
16/04/2015 38 select * from user_objects where object_type = ‘PROCEDURE' Mostrar errores de procedimiento y funciones Errors show
39
16/04/2015 39 Mucha Gracias por tu atención.
40
16/04/2015 40 Crea un procedimiento que utilizando dos parámetro inserte 1 registro en la tabla crédito y muestre el ultimo monto insertado.
41
16/04/2015 41
42
16/04/2015 42 select * from user_objectswhere object_type = ‘PROCEDURE'
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.