Anda di halaman 1dari 21

PBD3301 PROGRAMACIN DE BASE DE DATO

Creando Funciones PL/SQL

Unidad de Aprendizaje N2
Construyendo Bloques PL/SQL
Aprendizaje Esperado :
Construye unidades de programacin, segn sintaxis,
restricciones del lenguaje, requisitos de la lgica de
negocios y de informacin.
Utiliza recursos del lenguaje segn su sintaxis,
restricciones, requisitos de la lgica de negocios y de
informacin.
CREATE OR REPLACE FUNCTION FN_OBT_SALARIO(id NUMBER) RETURN NUMBER
IS
;
BEGIN
. ;
. ;
EXCEPTION
. ;
END;

Objetivos de la Clase

Describir los usos de las funciones.


Cmo crear funciones en la Base de Datos.
Cmo invocar una funcin creada por el usuario.
Cmo eliminar una funcin creada por el usuario.
Qu vistas del diccionario de datos consultar para obtener informacin de
las funciones.

Funcin Almacenada
Es un tipo de subprograma
PL/SQL que retorna un valor

Puede aceptar parmetros

Estructuralmente es similar a un
Procedimiento

Tiene una clusula RETURN y a


lo menos una sentencia RETURN

Se puede compilar y almacenar


en la Base de Datos

Se puede invocar, desde una


aplicacin, un bloque PL/SQL o
una sentencia SQL

Promueve la reusabilidad y la
capacidad de mantencin

Creacin de una Funcin Almacenada

Ver errores/advertencias
en SQL Developer
YES

Crear/editar
funcin

Advertencias/errore
s de compilacin ?

Ver advertencias/errores
de compilacin

Usar el comando
SHOW ERRORS en SQL*Plus

NO

Usar Vistas USER/ALL/DBA_


ERRORS
Invocar la funcin

Creacin de una Funcin Almacenada

Sintaxis:
CREATE [OR REPLACE] FUNCTION nombre_funcin
[(parmetro1 [modo1] tipo_dato1, ...)]
RETURN tipo_dato IS|AS
[declaracin_variables_locales; ]
BEGIN
-- Sentencias ejecutables SQL y PL/SQL
RETURN expresin
[EXCEPTION]
-- Sentencias control de excepciones
[RETURN expresin]
END [nombre_funcin];

Bloque PL/SQL estndar

Diferencias entre Procedimientos y Funciones


PROCEDIMIENTOS
Ejecutado
PL/SQL

como

una

FUNCIONES

sentencia

Invocadas como parte de una expresin

No contiene la clusula RETURN en el


encabezado

Debe
contener
en el encabezado

Puede retornar un
parmetros de salida

Debe retornar una valor simple

valor

Puede contener una


RETURN sin un valor

usando

sentencia

una

clusula

RETURN

Debe contener a lo menos una sentencia


RETURN

Creando y Ejecutando una Funcin

Ejemplo:
Creacin de la Funcin
CREATE OR REPLACE FUNCTION FN_OBT_SALARIO
(id employees.employee_id%TYPE) RETURN NUMBER IS
sal employees.salary%TYPE := 0;
BEGIN
SELECT salary INTO sal
FROM employees
WHERE employee_id = id;
RETURN sal;
END FN_OBT_SALARIO;

Usando la funcin en una Sentencia SQL


SELECT employee_id,
FN_OBT_SALARIO(employee_id) SALARIO
FROM employees
WHERE department_id = 30;

Ejecutando una Funcin


Invocando la Funcin como parte de una expresin PL/SQL
DECLARE
v_sal
employees.salary%type;
v_emp NUMBER(3):=100;
BEGIN
v_sal := FN_OBT_SALARIO(v_emp);
DBMS_OUTPUT.PUT_LINE('El salario del empleado ' || v_emp || ' es ' ||
TO_CHAR(v_sal,'$999,999'));
END;

Usando la funcin como un parmetro para otro subprograma


BEGIN
dbms_output.put_line(FN_OBT_SALARIO(100));
END;

Ejecutando una Funcin


Usando la funcin en otro subprograma
CREATE OR REPLACE PROCEDURE sp_salarios_por_depto
(p_depto NUMBER) IS
CURSOR emp_cursor IS
SELECT employee_id
FROM employees
WHERE department_id = p_depto;
v_salario NUMBER(5):=0;
BEGIN
dbms_output.put_line(' Salarios Departamento ' || p_depto);
dbms_output.put_line('------------------------------------------------------- '
);
dbms_output.new_line();
dbms_output.put_line('Id. Empleado
Salario ' );
dbms_output.put_line('------------------------------------------------' );
FOR emp_rec IN emp_cursor
LOOP
v_salario := FN_OBT_SALARIO(emp_rec.employee_id);
dbms_output.put_line(RPAD(emp_rec.employee_id, 30, '
') || v_salario);
END LOOP;
END;

EXEC
sp_salarios_por_depto(20);

Funciones Definidas por el Usuario en


Sentencias SQL
Pueden ser referenciadas en
cualquier sentencia SQL

Actan en forma similar a las


funciones predefinidas de una
fila de SQL

Pueden ser usadas en la


clusula SELECT , WHERE,
HAVING, ORDER BY, GROUP BY,
VALUES y SET

Permite efectuar clculos y


operaciones complejos

Incrementa la eficiencia de las


queries cuando son utilizadas en
la clusula WHERE

Funciones Definidas por el Usuario en


Sentencias SQL

Ejemplo:
CREATE OR REPLACE FUNCTION FN_IMPUESTO(p_valor IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_valor * 0.08);
END FN_IMPUESTO;

SELECT employee_id, last_name, salary, FN_IMPUESTO(salary)


FROM employees
WHERE department_id = 100;

Funciones Definidas por el Usuario en


Sentencias SQL

Ejemplo:
SELECT employee_id, FN_IMPUESTO(salary)
FROM employees
880
WHERE FN_IMPUESTO(salary) > (SELECT MAX(FN_IMPUESTO(salary))
FROM employees
WHERE department_id = 30)
ORDER BY FN_IMPUESTO(salary) DESC;

Restricciones de Funciones Definidas


por el Usuario
No se pueden invocar desde clusula de CHECK constraint, sentencia
CREATE TABLE o ALTER TABLE

No se puede usar para especificar un valor por defecto de una columna

Cuando son invocadas desde una sentencia SELECT sobre una tabla T no
pueden contener sentencias DML sobre la misma tabla T
Cuando se invocan desde sentencias UPDATE o DELETE sobre una tabla T
no pueden tener una sentencia SELECT o contener DML sobre la misma
tabla T

Restricciones de Funciones Definidas


por el Usuario

Ejemplo:
CREATE OR REPLACE FUNCTION FN_DML_SQL(sal NUMBER)
RETURN NUMBER IS
BEGIN
INSERT INTO employees(employee_id, last_name, email, hire_date, job_id, salary)
VALUES(1, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', sal);
RETURN (sal + 100);
END;

SELECT FN_DML_SQL(salary) FROM employees;

Restricciones de Funciones Definidas


por el Usuario

Ejemplo:
UPDATE employees
SET salary = FN_DML_SQL(2000)
WHERE employee_id = 170;

Eliminando Funciones

Se pueden eliminar las funciones que estn almacenado en la Base de


Datos.
Cuando se elimina una funcin todos los privilegios que se han
otorgado sobre la funcin son revocadas cuando la funcin es
eliminada.

Sintaxis:
DROP FUNCTION nombre_funcin ;

Ejemplo:
DROP FUNCTION fn_obtiene_sal ;

Obteniendo Informacin de Funciones desde


el Diccionario de Datos
USER_SOURCE: cdigo fuente de
los subprogramas que ha creado el
usuario.

USER_OBJECTS: informacin de
todos los objetos que pertenecen al
usuario.

USER_ERRORS:
informacin
sobre
errores
de
compilacin
de
los
subprogramas creados por el usuario.

Funciones Locales

Se definen en la seccin de declaracin del subprograma y slo puede


ser en la seccin de ejecucin.
Ejemplo:

CREATE OR REPLACE PROCEDURE sp_obtiene_desc_job IS desc_trabajo jobs.job_title


%TYPE;
CURSOR emp_cursor IS
SELECT first_name || ' ' || last_name AS nombre, job_id, salary
FROM employees;
FUNCTION fn_obtiene_trabajo(jobid VARCHAR2) RETURN VARCHAR2 IS
trabajo jobs.job_title%TYPE;
BEGIN
SELECT job_title INTO trabajo
FROM jobs
WHERE job_id = jobid;
RETURN trabajo;
END;
BEGIN
FOR emprec IN emp_cursor
LOOP
desc_trabajo:= fn_obtiene_trabajo(emprec.job_id);
DBMS_OUTPUT.PUT_LINE('El trabajo del empleado ' || emprec.nombre || ' es ' ||
desc_trabajo|| ' y su salario es de ' || emprec.salary);
END LOOP;
END;

Funciones Locales

Resultado del ejemplo anterior:

.
.

Resumen de la Clase

Se describieron el uso de las funciones.


Se explic cmo crear funciones en la Base de Datos.
Se explic cmo invocar una funcin creada por el usuario.
Se explic cmo eliminar un funcin creada por el usuario.
Se explic que vistas del diccionario de datos consultar para obtener
informacin de las funciones.

Anda mungkin juga menyukai