/* 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);
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;