Vous êtes sur la page 1sur 39

BASE DE

DATOS II

Base de

Datos II
Subprograma PL / SQL
Introduccin

INGENIERA
DE SOFTWARE

CARRERA DE

INGENIERA
INFORMTICA
Y DE SISTEMAS

Agenda

Creacin de Procedimientos

Creacin de Funciones

Creacin de Paquetes

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Introduccin

Un subprograma:

Es un bloque PL/SQL nombrado que puede aceptar


parmetros y se le puede invocar desde un entorno de
llamada.

Es de dos tipos:

Un procedimiento que realiza una accin.

Una funcin que calcula un valor.

Se basa en una estructura estndar de bloque PL/SQL.

Es modular, reutilizable, extensible, se puede mantener y


permite hacer el cdigo ms claro.

INGENIERA
DE SOFTWARE

Estructura de los Sub-Programas


PL/SQL
<encabezado>
<encabezado>
IS
IS || AS
AS
Seccin
Seccin de
de declaracin
declaracin
BEGIN
BEGIN
Seccin
Seccin
EXCEPTION
EXCEPTION

ejecutable
ejecutable
(opcional)
(opcional)

Seccin
Seccin de
de excepciones
excepciones
END;
END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Procedimientos

Qu es un procedimiento?

Un tipo de sub-programa que realiza una accin.

Un procedimiento se puede almacenar en la base


de datos, como un objeto del esquema, para
ejecutarse varias veces.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Sintaxis para crear Procedimientos


CREATE [OR REPLACE] PROCEDURE nombre_procedimiento
[(parametro1 [modo1] tipodato1,
parametro2 [modo2] tipodato2,
)]
IS | AS
Bloque PL/SQL;

La opcin REPLACE indica que si el procedimiento existe, se


eliminar y ser reemplazado con la nueva versin creada
por la sentencia.
Los bloques PL/SQL se inician con BEGIN o la declaracin
de variables locales y finaliza con END o END
nombre_procedimiento.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Parmetros formales y reales

Parmetros formales: variables declaradas


en la lista de parmetros de la especificacin
del sub-programa.
CREATE PROCEDURE raise_sal(p_id NUMBER, p_amount NUMBER)

END raise_sal;

Parmetros reales: variables o expresiones


referenciadas en la lista de parmetros de una
llamada al sub-programa.
raise_sal(v_id, 2000);

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Crear Procedimientos con Parmetros


IN

OUT

IN OUT

Modo por defecto

Se debe especificar

Se debe especificar

El valor se pasa al subprograma

Retornado al entorno de
llamada

Pasado hacia el subprograma; retornado al


entorno de llamada

Parmetros formales
actan con constantes

Variables sin inicializar

Variables inicializadas

Parmetros reales
Debe ser una variable
pueden ser literales,
expresiones, constantes o
variables inicializadas

Debe ser una variable

Se le puede asignar un
valor por defecto
INGENIERA
DE SOFTWARE

No se le puede asignar un No se le puede asignar un


valor por defecto
valor por defecto

BASE DE
DATOS II

Parmetros IN: Ejemplo


Ambiente de llamada

Procedimiento raise_salary

176

CREATE OR REPLACE PROCEDURE raise_salary


(p_id IN employees.employee_id%TYPE)
IS
BEGIN
UPDATE employees
SET salary = salary * 1.10
WHERE employee_id = p_id;
END raise_salary;
/

INGENIERA
DE SOFTWARE

p_id

BASE DE
DATOS II

Parmetros OUT: Ejemplo


CREATE OR REPLACE PROCEDURE query_emp
(
p_id
IN employees.employee_id%TYPE,
p_name
OUT employees.last_name%TYPE,
p_salary
OUT employees.salary%TYPE,
p_comm
OUT employees.commission_pct%TYPE
)
IS
BEGIN
SELECT last_name, salary, commission_pct
INTO p_name, p_salary, p_comm
FROM employees
WHERE employee_id = p_id;
END query_emp;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Parmetro OUT: Ejemplo


Ambiente de llamada

Procedimiento QUERY_EMP

p_id

171
SMITH

INGENIERA
DE SOFTWARE

p_name

7400

p_salary

0.15

p_comm

BASE DE
DATOS II

Ver Parmetros OUT

Cree el procedimiento QUERY_EMP


Declare variables host, ejecute el
procedimiento QUERY_EMP e imprima el
valor en la variable G_NAME
VARIABLE g_name VARCHAR2(25)
VARIABLE g_sal NUMBER
VARIABLE g_comm NUMBER
EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)
PRINT g_name

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Parmetros IN OUT
Ambiente de llamada
'8006330575'

Procedimiento format_phone
'(800)633-0575'

p_phone_no

CREATE OR REPLACE PROCEDURE format_phone


(p_phone_no IN OUT VARCHAR2)
IS
BEGIN
p_phone_no := '(' || SUBSTR(p_phone_no,1,3) ||
')' || SUBSTR(p_phone_no,4,3) ||
'-' || SUBSTR(p_phone_no,7);
END format_phone;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ver Parmetros IN OUT


VARIABLE g_phone_no VARCHAR2(15)
BEGIN
:g_phone_no := '8006330575';
END;
/
PRINT g_phone_no
EXECUTE format_phone (:g_phone_no)
PRINT g_phone_no

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Mtodos para pasar Parmetros

Posicional: Listar los parmetros reales


en el mismo orden que los parmetros
formales.
Nombrado: Listar los parmetros reales
en cualquier orden asocindoles sus
parmetros correspondientes.
Combinacin: Listar algunos de los
parmetros reales como posicionales y
otros como nombrados.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Opcin DEFAULT para Parmetros


CREATE OR REPLACE PROCEDURE add_dept(
p_name IN departments.department_name%TYPE
DEFAULT 'unknown',
p_loc IN departments.location_id%TYPE
DEFAULT 1700)
IS
BEGIN
INSERT
INTO departments(department_id,
department_name, location_id)
VALUES (departments_seq.NEXTVAL,
p_name, p_loc);
END add_dept;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ejemplo de paso de Parmetros

BEGIN
add_dept;
add_dept('TRAINING', 2500);
add_dept(p_loc => 2400, p_name => 'EDUCATION');
add_dept(p_loc => 1200);
END;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Declarar Sub-Programas
CREATE OR REPLACE PROCEDURE leave_emp2
(p_id IN employees.employee_id%TYPE)
IS
PROCEDURE log_exec
IS
BEGIN
INSERT INTO log_table (user_id, log_date)
VALUES (USER, SYSDATE);
END log_exec;
BEGIN
DELETE FROM employees
WHERE employee_id = p_id;
log_exec;
END leave_emp2;
/

INGENIERA
DE SOFTWARE

Invocar a un Sub-Programa desde un


Bloque PL/SQL annimo
DECLARE
v_id NUMBER := 163;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Invocar a un Procedimiento desde


otro Procedimiento
CREATE OR REPLACE PROCEDURE process_emps
IS
CURSOR emp_cursor IS
SELECT employee_id
FROM employees;
BEGIN
FOR emp_rec IN emp_cursor
LOOP
raise_salary(emp_rec.employee_id);
END LOOP;
COMMIT;
END process_emps;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Eliminar Procedimientos

Eliminar un procedimiento de la base de datos


Sintaxis:
DROP PROCEDURE nombre_procedimiento

Ejemplo:
DROP PROCEDURE raise_salary;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Funciones almacenadas
Una funcin es un bloque PL/SQL
nombrado que retorna un valor.
Una funcin se puede almacenar en
la base de datos como un objeto de
esquema para su ejecucin
frecuente.
Una funcin es invocada como parte
de una expresin.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Sintaxis para crear Funciones


CREATE [OR REPLACE] FUNCTION function_name
[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
. . .)]
RETURN datatype
IS|AS
PL/SQL Block;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ejemplo de Creacin de Funciones


CREATE OR REPLACE FUNCTION get_sal
(
p_id IN employees.employee_id%TYPE
)
RETURN NUMBER
IS
v_salary employees.salary%TYPE :=0;
BEGIN
SELECT
salary
INTO
v_salary
FROM
employees
WHERE
employee_id = p_id;
RETURN v_salary;
END get_sal;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ejecutar funciones
Invoque a una funcin como parte
de una expresin PL/SQL.
Cree una variable para almacenar
el valor retornado.

Ejecute

la funcin. La variable
recibir el valor retornado a
travs de una sentencia RETURN.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Parmetros IN y Parmetos OUT


Ambiente de llamada

Procedimiento get_sal
p_id

117
RETURN v_salary

VARIABLE g_salary NUMBER


EXECUTE :g_salary := get_sal(117)
PRINT g_salary

INGENIERA
DE SOFTWARE

Ventajas de usar Funciones de


usuario en expresiones PL/SQL

BASE DE
DATOS II

Extender SQL cuando las actividades


sean muy complejas, tediosas o no
disponibles en SQL.
Puede incrementar la eficiencia cuando
se utiliza en la clusula WHERE para
filtrar los datos, en vez de filtrar los datos
en la aplicacin.
Puede manipular cadenas de
caracteres.

INGENIERA
DE SOFTWARE

Invocar Funciones en expresiones


SQL: Ejemplo
CREATE OR REPLACE FUNCTION tax(p_value IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_value * 0.08);
END tax;
/
SELECT employee_id, last_name, salary, tax(salary)
FROM employees
WHERE department_id = 100;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Restricciones al invocar Funciones


en expresiones SQL

BASE DE
DATOS II

Para poder ser invocada en una expresin


SQL, una funcin debe:

Ser una funcin almacenada.

Aceptar slo parmetros IN.

Aceptar como parmetros slo tipos de datos


vlidos en SQL, no slo en PL/SQL.

Retornar tipos de datos vlidos en SQL, no tipos


que slo sean vlidos en PL/SQL.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Sintaxis para eliminar Funciones

Sintaxis:
DROP FUNCTION nombre_funcion

Ejemplo:
DROP FUNCTION get_sal;

Todos los privilegios concedidos sobre una


funcin se revocan si se elimina la funcin.

La sintaxis de CREATE OR REPLACE es


equivalente a la sintaxis de eliminar la funcin y
recrearla. Los privilegios concedidos sobre la
funcin permanecen igual cuando si usa esta
INGENIERA
DE SOFTWARE sintaxis.

BASE DE
DATOS II

Paquetes

Un paquete es un objeto de esquema que


agrupa de forma lgica: tipos, elementos y
subprogramas relacionados de PL/SQL.
Partes:

Especificacin (Specification)

Cuerpo (Body)

INGENIERA
DE SOFTWARE

Interfaz de la aplicacin, declara tipos,


variables, contantes, excepciones, cursores y
subprogramas disponibles.
Define completamente cursores y
subprogramas, implementa la especificacin.

BASE DE
DATOS II

CrearCREATE
especificaciones
de
paquetes
[OR REPLACE] PACKAGE package_name
[AUTHID {CURRENT_USER | DEFINER}]
{IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_spec ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[PRAGMA RESTRICT_REFERENCES(assertions) ...]
END [package_name];
INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Crear cuerpo de paquetes


[CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition ...]
[record_type_definition ...]
[subtype_definition ...]
[collection_declaration ...]
[constant_declaration ...]
[exception_declaration ...]
[object_declaration ...]
[record_declaration ...]
[variable_declaration ...]
[cursor_body ...]
[function_spec ...]
[procedure_spec ...]
[call_spec ...]
[BEGIN
sequence_of_statements]
END [package_name];]
INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ejemplo de especificacin
CREATE OR REPLACE PACKAGE emp_actions AS -- spec
TYPE EmpRecTyp IS RECORD (emp_id INT, salary REAL);
CURSOR desc_salary RETURN EmpRecTyp;
PROCEDURE hire_employee (
ename VARCHAR2,
job
VARCHAR2,
mgr
NUMBER,
sal
NUMBER,
comm
NUMBER,
deptno NUMBER);
PROCEDURE fire_employee (emp_id NUMBER);
END emp_actions;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ejemplo de cuerpo de paquete


CREATE OR REPLACE PACKAGE BODY emp_actions AS -- body
CURSOR desc_salary RETURN EmpRecTyp IS
SELECT empno, sal FROM emp ORDER BY sal DESC;
PROCEDURE hire_employee (
ename VARCHAR2,
job
VARCHAR2,
mgr
NUMBER,
sal
NUMBER,
comm
NUMBER,
deptno NUMBER) IS
BEGIN
INSERT INTO emp VALUES (empno_seq.NEXTVAL, ename, job,
mgr, SYSDATE, sal, comm, deptno);
END hire_employee;
PROCEDURE fire_employee (emp_id NUMBER) IS
BEGIN
DELETE FROM emp WHERE empno = emp_id;
END fire_employee;
END emp_actions;
INGENIERA
DE SOFTWARE

Hacer referencia a contenidos de


paquete

BASE DE
DATOS II

package_name.type_name
package_name.item_name
package_name.subprogram_name
package_name.call_spec_name

SQL> CALL emp_actions.hire_employee('TATE', 'CLERK', ...);

BEGIN

DBMS_OUTPUT.PUT_LINE('the message');

END;
INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Resumen

Los sub-programas locales son programas que


se definen dentro de la seccin de declaracin
de otro programa.
Los procedimientos se pueden invocar desde
cualquier herramienta o lenguaje que soporte
PL/SQL.
Debera estar atento del efecto de excepciones
controladas y no controladas sobre
transacciones y llamadas a procedimientos.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Resumen

Puede remover procedimientos de la base de


datos con el comando DROP PROCEDURE.
Los procedimientos pueden servir como
bloques de construccin para una aplicacin.
Una funcin es un bloque PL/SQL nombrado
que debe retornar un valor.
Una funcin se crea utilizando la sintaxis
CREATE FUNCTION.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Resumen

Una funcin se invoca como parte de una


expresin.
Una funcin almacenada en la base de datos
se puede utilizar en las sentencias SQL.
Una funcin se puede eliminar de la base de
datos con la sintaxis DROP FUNCTION.
Generalmente, se utiliza un procedimiento para
realizar una accin y una funcin para calcular
un valor.

INGENIERA
DE SOFTWARE

Vous aimerez peut-être aussi