Sei sulla pagina 1di 3

EXCEPCIONES Y PROCEDIMIENTOS ALMACENADOS

NOVIEMBRE 7, 2015 ADMIN DEJAR UN COMENTARIO


/* EJEMPLO CAPTURA DE EXCEPTION, por cursor implicito y exception explicita */
DECLARE
lname VARCHAR2(15);
exceptionLOCAL EXCEPTION;
BEGIN
RAISE exceptionLOCAL;
SELECT last_name INTO lname
FROM employees
WHERE first_name= John';
DBMS_OUTPUT.PUT_LINE( El apellido de John es : ||lname);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE( La setencia SELECT recupera multiples filas. Considere un cu
rsor explicito );
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE( Error desconocido );
END;
/* RAISE */
/* Ejemplo de error de violacion de integridad referencial */
DECLARE
ex_trabajo_invalido EXCEPTION;
PRAGMA EXCEPTION_INIT(ex_trabajo_invalido,-2291);
ex_mensaje VARCHAR2(50);
BEGIN
INSERT INTO employees
VALUES (210, Lorena , Lorca , llorca , 92938913', 23021987', AD_PREZZ , 2500,0.2,101,90);
EXCEPTION
WHEN ex_trabajo_invalido THEN
ex_mensaje := El trabajo no existe, asegura de crearlo primero';
DBMS_OUTPUT.PUT_LINE(ex_mensaje);
END;
/* RAISE_APPLICATION_ERROR(num_error, mensaje error) */
DECLARE
nombre_excepcion EXCEPTION;
PRAGMA EXCEPTION_INIT(nombre_excepcion, -20000);
numero NUMBER;
BEGIN
numero := 1;
IF numero = 1 THEN
RAISE_APPLICATION_ERROR(-20000, Mensaje personalizado );
END IF;
EXCEPTION
WHEN nombre_excepcion THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/* PROCEDIMIENTO ALMACENADO */
CREATE TABLE DEPT AS SELECT * FROM departments;
CREATE OR REPLACE PROCEDURE sp_add_dept IS
dept_id dept.department_id%TYPE;
dept_name dept.department_name%TYPE;
BEGIN
dept_id:=290;
dept_name:= SPT-Curriculum';
INSERT INTO dept(department_id, department_name) VALUES (dept_id, dept_name);

DBMS_OUTPUT.PUT_LINE( Fila insertadas: ||SQL%ROWCOUNT);


END;
EXECUTE sp_add_dept;
BEGIN
sp_add_dept;
END;
SELECT * FROM DEPT;
DROP PROCEDURE sp_add_dept;
/* USER_SOURCE, USER_OBJECTS, USER_ERRORS */
/* PROCEDIMIENTO CON PARAMETROS */
CREATE OR REPLACE PROCEDURE sp_aumenta_salario(p_id NUMBER, p_sal NUMBER)
IS
BEGIN
UPDATE employees
SET salary = p_sal
WHERE employee_id = p_id;
END sp_aumenta_salario;
BEGIN
sp_aumenta_salario(100,2000);
END;
SELECT * FROM employees WHERE employee_id = 100;
/* PROCEDIMIENTO PARAMETROS IN */
CREATE OR REPLACE PROCEDURE sp_aumentar_salario(p_id IN employees.employee_id%TY
PE, p_porcent NUMBER)
IS
BEGIN
UPDATE employees
SET salary = salary * (1+p_porcent/100)
WHERE employee_id = p_id;
END sp_aumentar_salario;
EXECUTE sp_aumentar_salario(176,10);
SELECT * FROM employees where employee_id = 176;
/* USANDO PARAMETROS OUT */
CREATE OR REPLACE PROCEDURE sp_selecciona_emp
(p_id IN employees.employee_id%TYPE,
p_nombre OUT employees.last_name%TYPE,
p_salario OUT employees.salary%TYPE)
IS
BEGIN
SELECT last_name, salary INTO p_nombre, p_salario
FROM employees
WHERE employee_id = p_id;
END sp_selecciona_emp;
DECLARE
v_apellido employees.last_name%TYPE;
v_salario employees.salary%TYPE;
BEGIN

sp_selecciona_emp(171,v_apellido, v_salario);
DBMS_OUTPUT.PUT_LINE( El apellido y salario del empleado 171 son :
_salario);
END;

||v_apellido||

SELECT * FROM employees WHERE employee_id = 171;


/* USO DE IN OUT */
CREATE OR REPLACE PROCEDURE sp_formato_telefono
(p_num_telefono IN OUT VARCHAR2)
IS
BEGIN
p_num_telefono := ( || SUBSTR(p_num_telefono,1,3)||
) ||SUBSTR(p_num_telefono,4,3)||
- ||SUBSTR(p_num_telefono,7);
END sp_formato_telefono;
DECLARE
v_num_telefono VARCHAR2(15):= 8006330575';
BEGIN
dbms_output.put_line( Valor de entrada al procedimiento : ||v_num_telefono);
sp_formato_telefono(v_num_telefono);
dbms_output.put_line( Valor de retorno del procedimiento : ||v_num_telefono);
END;

||v

Potrebbero piacerti anche