Sei sulla pagina 1di 19

TAREAS ADMINISTRACIÓN DE BASE DE DATOS II

CONSULTAS DML, BASICOS Y ABANZADOS


--Visualizar el nombre y el número de teléfono.

SELECT first_name,phone_number FROM EMPLOYEES;

-- Visualizar el nombre y el tipo de trabajo de los empleados (FIRST_NAME, JOB_ID). Debe


aparecer en la cabecera NOMBRE Y Tipo de Trabajo.

SELECT FIRST_NAME AS NOMBRE, JOB_ID AS "TIPO DE TRABAJO" FROM EMPLOYEES;

--Selecciona todas las columnas de la tabla REGIONS.

SELECT * FROM REGIONS;

--Indicar los nombres de los países de la tabla COUNTRIES.

SELECT COUNTRY_NAME FROM COUNTRIES;

--Seleccionar las columnas STREET_ADDRESS, CITY, STATE_PROVINCE de la table LOCATIONS.

SELECT STREET_ADSRESS, CITY,STATE_PROVINCE FROM LOCATIONS;

--Debemos poner las columnas como dirección, Ciudad y Estado

SELECT STREET_ADDRESS AS DIRECCION, CITY AS CIUDAD, STATE_PROVINCE AS ESTADO FROM


LOCATIONS;

--Realizar una SELECT para visualizar el siguiente resultado. El impuesto es el 20% del salario.

SELECT salary*0.2 AS IMPUESTO FROM EMPLOYEES;

--Visualizar el salario anual de cada empleado, por 14 pagas.

--Debemos visualizar las columnas como Nombre, Salario y Salario Anual.

SELECT first_name AS Nombre, salary AS salarios, salary*14 AS "SALARIO ANUAL" FROM


EMPLOYEES;

--Crear la consulta para visualizar los siguientes datos, usando el operador de concatenación ||

SELECT ' EL EMPLEADO '|| UPPER (FIRST_NAME)|| ' DEL DEPARTAMENTO '|| DEPARTMENT_ID
|| ' GANA UN SALARIO DE' ||SALARY

FROM EMPLOYEES;

-- Crear la siguiente consulta

SELECT ' LA CALLE ' || STREET_ADDRESS || ':' ||CITY FROM LOCATIONS;

--Visualizar las ciudades donde hay departamentos, de la tabla locations.

--No deben salir repetidos

SELECT CITY FROM LOCATIONS WHERE STATE_PROVINCE IS NOT NULL;


--Visualizar los distintos tipos de JOB_ID por departamento de la tabla Employees.

SELECT DISTINCT DEPARTMENT_ID, JOB_ID FROM EMPLOYEES;

--Averigua los empleados que trabajen en el departamento 100

SELECT first_name FROM employees WHERE department_id = 100;

--Usando la tabla LOCATIONS, averigua el nombre de la Ciudad (city) y la dirección


(Street_address)

--de los departamentos situados en Estados Unidos (COUNTRY_ID=US)

/*SELECT CITY, STREET_ADDESS FROM LOCATIONS WHERE department_id IN country_id = US;*/

--Visualiza los países que están en la región 3. (REGION_ID de la tabla COUNTRIES

SELECT * FROM countries WHERE REGION_ID=3;

--Averiguar el nombre y salario de los empleados que NO tengan como jefe al MANAGER 114

--(columna MANAGER_ID)

SELECT first_name, salary FROM employees WHERE NOT MANAGER_ID=114;

SELECT first_name, salary,MANAGER_ID FROM employees WHERE NOT MANAGER_ID=114;

--Visualizar los empleados que empezaron a trabajar a partir del año 2006

SELECT * FROM employees WHERE HIRE_DATE BETWEEN '01/01/2006' AND '31/12/2006';

SELECT * FROM employees WHERE hire_date>='01/01/2000' AND hire_date<'31/12/2000';

--Seleccionar los empleados que tenga como tipo de trabajo ‘ST_CLERK’

SELECT first_name FROM EMPLOYEES WHERE JOB_ID = 'ST_CLERK';

--Indicar los datos de los empleados que tengan como apellidos “Smith” (LAST_NAME)

SELECT first_name, last_name FROM EMPLOYEES WHERE LAST_NAME = 'Smith';

--Averiguar los empleados que están entre el departamento 40 y el 60

SELECT first_name, last_name, department_id from employees where department_id in


(40,60);

--Visualizar los empleados que entraron entre 2002 y 2004

SELECT * FROM employees WHERE HIRE_DATE BETWEEN '01/01/2002' AND '31/12/2004';

--Indica los apellidos de los empleados que empiezan desde ‘D’ hasta ‘G’

select * from employees where last_name Like'D%';

select * from employees where last_name Like'E%';

select * from employees where last_name Like'F%';


select * from employees where last_name Like'G%';

--Averiguar los empleados de los departamentos 30,60 y 90. Hay que usar la cláusula IN

SELECT * FROM employees WHERE department_id IN(30,60,90);

SELECT first_name FROM employees WHERE department_id IN(30,60,90);

--Averiguar los empleados que tienen el tipo de trabajo IT_PROG y PU_CLERK.

SELECT * FROM EMPLOYEES WHERE JOB_ID IN ('IT_PROG', 'PU_CLERK');

--Indica las ciudades que están en Inglaterra (UK) y Japón (JP).. Tabla LOCATION

SELECT CITY FROM LOCATIONS WHERE IN (INGLATERRA=UK);

--Indicar los datos de los empleados cuyo FIRST_NAME empieza por ‘J’

select * from employees where first_name Like'J%';

--Averiguar los empleados que comienzan por ‘S’ y terminan en ‘n’

select * from employees where first_name Like'S%';

select * from employees where first_name Like'_N%';

SELECT * FROM employees WHERE first_name LIKE '_e%';

SELECT * FROM employees WHERE first_name LIKE '%te%';

--Indicar los países que tienen una “r” en la segunda letra (Tabla COUNTRIES

SELECT * FROM COUNTRIES WHERE country_id_name LIKE 'R%';

--Listar las ciudades de la tabla LOCATIONS no tienen STATE_PROVINCE

SELECT CITY FROM LOCATIONS WHERE STATE_PROVINCE IS NULL;

SELECT CITY,STATE_PROVINCE FROM LOCATIONS WHERE STATE_PROVINCE IS NULL;

--Averiguar el nombre, salario y comisión de aquellos empleados que tienen


comisión.

--También debemos visualizar una columna calculada denominada “Sueldo Total”,

--Que sea el sueldo más la comisión

SELECT first_name AS NOMBRE, SALARY AS SALARIO, COMMISSION_PCT AS COMISION,


SALARY+COMMISSION_PCT

FROM EMPLOYEES WHERE COMMISSION_PCT IS NOT NULL;

--Obtener el nombre y la fecha de la entrada y el tipo de trabajo de los empleados que sean
IT_PROG

--y que ganen menos de 6000 dólares


SELECT FIRST_NAME, HIRE_DATE FROM EMPLOYEES WHERE FIRST_MANE = IT_PROG AND
SALARY <6000;

SELECT FIRST_NAME, JOB_ID,

CASE JOB_ID

WHEN 'IT_PROG' THEN 'TIPO1'

END

FROM EMPLOYEES

WHERE SALARY <6000;

--Seleccionar los empleados que trabajen en el departamento 50 o 80,

--cuyo nombre comience por S y que ganen más de 3000 dólares.

SELECT first_name, department_id from employees

WHERE first_name like 'S%' AND department_id IN (50,80) AND salary > 3000;

--¿Qué empleados de job_id IT_PROG tienen un prefijo 5 en el teléfono y entraron en la empresa


en el año 2007?

SELECT * FROM EMPLOYEES WHERE HIRE_DATE BETWEEN '01/01/2007' AND '31/12/2007';

--Indicar el número de empleados del departamento 50.

SELECT COUNT(*) FROM EMPLOYEES WHERE DEPARTMENT_ID= 50;

--Indicar el número de empleados que entraron a trabajar el año 2007

SELECT * FROM EMPLOYEES WHERE HIRE_DATE>='01/01/2007' AND HIRE_DATE<'31/12/2007';

SELECT * FROM EMPLOYEES WHERE HIRE_DATE BETWEEN '01/01/2007' AND '31/12/2007';

--Visualizar la suma del salario del departamento 100.

SELECT SUM(SALARY) FROM EMPLOYEES WHERE DEPARTMENT_ID= 100 ;

--Indicar la diferencia entre el sueldo más alto y el minimo.

SELECT MAX(SALARY),MIN(SALARY)DIFFERENCE

FROM EMPLOYEES;

--Mostrar el salario medio por departamento, con dos decimales.

SELECT SALARI

--Mostrar el country_id y el número de ciudades que hay en ese país.

SELECT COUNTRY_ID, COUNT(*) FROM LOCATIONS GROUP BY COUNTRY_ID;


SELECT COUNT(COUNTRY_ID), COUNTRY_ID FROM COUNTRIES;

--Mostrar el promedio de salario de los empleados por departamentos que tengan comisión.

SELECT DEPARTMENT_ID, AVG(SALARY) FROM EMPLOYEES

WHERE COMMISSION_PCT IS NOT NULL GROUP BY DEPARTMENT_ID;

--Mostrar los año en que ingresaron más de 10 empleados.

SELECT TO_CHAR(HIRE_DATE,'YYYY') FROM EMPLOYEES

GROUP BY TO_CHAR(HIRE_DATE,'YYYY')

HAVING COUNT(EMPLOYEE_ID) > 10;

--Mostrar por departamento y año el número de empleados que ingresaron.

SELECT TO_CHAR(DEPARTMENT_ID), COUNT (*) FROM EMPLOYEES

WHERE TO_CHAR(HIRE_DATE,'YYYY') = TO_CHAR(SYSDATE,'YYYY')

GROUP BY TO_CHAR(DEPARTMENT_ID);

--Mostrar los departamentos_id de los departamentos que tienen managers que tienen a cargo
mas de 5 empleados.

/*ejercicios

Crea los siguientes ejemplos:

1- Crear una SELECT (no un cursor explícito) que devuelva el nombre de un empleado

pasándole el EMPLOYEE_ID en el WHERE,

Comprobar en primer lugar que funciona pasando un empleado existente

Pasar un empleado inexistente y comprobar que genera un error

Crear una zona de EXCEPTION controlando el NO_DATA_FOUND para que pinte

un mensaje como “Empleado inexistente”

SET SERVEROUTPUT ON

DECLARE

nombre employees.first_name%TYPE;

BEGIN
SELECT first_name INTO nombre

FROM

employees

WHERE

employee_id = 1000;

dbms_output.put_line(nombre);

EXCEPTION

WHEN no_data_found THEN

dbms_output.put_line('Empleado inexistente.');

WHEN OTHERS THEN

dbms_output.put_line('ERROR INDIFIDO');

END;

2-Modificar la SELECT para que devuelva más de un empleado, por ejemplo

poniendo EMPLOYEE_ID> 100. Debe generar un error. Controlar la excepción

para que genere un mensaje como “Demasiados empleados en la consulta”

SET SERVEROUTPUT ON

DECLARE

nombre_empleado employees.first_name%TYPE;

BEGIN

SELECT first_name INTO nombre_empleado FROM employees WHERE employee_id>100;

DBMS_OUTPUT.PUT_LINE(nombre_empleado);

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('No existe el empleado.');

WHEN OTHER THEN

DBMS_OUTPUT.PUT_LINE ('Demasiados empleados en la consulta')

END;

3-Modificar la consulta para que devuelva un error de división por CERO,

por ejemplo, vamos a devolver el salario en vez del nombre y lo dividimos por 0.
En este caso, en vez de controlar la excepción directamente,

creamos una sección WHEN OTHERS y pintamos el error con SQLCODE y SQLERR

SET SERVEROUTPUT ON

DECLARE

nombre_empleado employees.first_name%TYPE;

salary number;

div_cero number;

codigo_error varchar2 (20);

BEGIN

SELECT first_name INTO nombre, salario FROM employees WHERE employee_id>100;

div_cero:=salario/0;

DBMS_OUTPUT.PUT_LINE('div_cero');

EXCEPTION

WHEN OTHERS THEN

codigo error:= SQLCODE;

DBMS_OUTPUT.PUT_LINE('codigo error'||'codigo de error');

DBMS_OUTPUT.PUT_LINE (SQLERRM ||'NO SE PUEDE DIVIDIR ENTRE CERO')

END;

4-El error -00001 es clave primaria duplicada.

Aunque ya existe una predefinida (DUP_VAL_ON_INDEX) vamos a crear una excepción

no -predefinida que haga lo mismo. o Vamos a usar la tabla REGIONS para

hacerlo más fácil o Usamos PRAGMA EXCEPTION_INIT y creamos una

excepción denominada “duplicado”. Cuando se genere ese error debemos

pintar “Clave duplicada, intente otra”. o Insertamos una fila en la tabla REGIONS

que esté duplicada y vemos que se controla el error

SET SERVEROUT ON

BEGIN

INSERT INTO REGIONS ( región_id, región_name) VALUES (15, ‘San Matin’);

EXCEPTION

WHEN DUP_VAL_ON_INDEX THEN


DBMS_OUTPUT.PUT_LINE(‘Clave duplicada, intente otra vez’)
END;

/*ejerccio

Crear una Excepción personalizada denominada CONTROL_REGIONES.

*Debe dispararse cuando al insertar o modificar una región queramos

poner una clave superior a 200. Por ejemplo, usando una variable con ese valor.

*En ese caso debe generar un texto indicando algo así como “Codigo no permitido.

Debe ser inferior a 200”

*Recordemos que las excepciones personalizadas deben dispararse de forma manual

con el RAISE.

*/

RESPUESTA

SET SERVEROUT ON

DECLARE

reg_max EXCEPTION;

regn NUMBER;

regt VARCHAR2(200);

BEGIN

regn := 37;

regt := 'OFFISHE';

IF regn > 200 THEN

RAISE reg_max;

ELSE

INSERT INTO regions VALUES (regn,regt);

COMMIT;

END IF;

EXCEPTION
WHEN reg_max THEN

dbms_output.put_line('CODIGO NO PERMITIDO DEBE SER INFERIOR A 200');

WHEN OTHERS THEN

dbms_output.put_line('ERROR INDEFINIDO');

END;

--practica

/*Crear una variable CHAR(1) denominada TIPO_PRODUCTO.

Poner un valor entre "A" Y "E"

Visualizar el siguiente resultado según el tipo de producto

'A' --> Electronica

'B' --> Informática

'C' --> Ropa

'D' --> Música

'E' --> Libros

Cualquier otro valor debe visualizar "El código es incorrecto".

DECLARE

valor CHAR(1) := 'C';

tipo VARCHAR2(20);

BEGIN

IF valor = 'A' THEN

tipo := 'ELECTRONICA';

ELSIF valor = 'B' THEN

tipo := 'INFORMATICA';

ELSIF valor = 'C' THEN

tipo := 'ROPA';

ELSE

tipo := 'NO SE ENCUENTRA';

END IF;

dbms_output.put_line('VALOR=' || valor||',tipo='||tipo||'.');

END;
--practica: --Practica

/*

Vamos a crear una variable denominada "usuario", de tipo VARCHAR2(40)

Vamos a poner dentro el nombre del usuario que somos, usando la función USER de ORacle

que devuelve el nombre del usuario con el que estamos conectados (Recuerda que en Oracle

no hace falta poner paréntesis si una función no tiene argumentos)

usuario:=user

Luego hacermos un CASE para que nos pinte un mensaje del estilo:

Si el usuario es SYS ponemos el mensaje "Eres superadministrador"

Si el usuario es SYSTEM ponemos el mensaje "Eres un administrador normal"

Si el usuario es HR ponemos el mensaje "Eres de Recursos humanos"

Cualquier otro usuario ponemos "usuario no autorizado

*/

DECLARE

USUARIO VARCHAR2(40);

BEGIN

USUARIO := USER;

CASE USUARIO

WHEN 'SYS' THEN DBMS_OUTPUT.PUT_LINE('Excelente');

WHEN 'SYSTEM' THEN DBMS_OUTPUT.PUT_LINE('ERES UN ADMINSITRADOR NORMAL');

WHEN 'HR' THEN DBMS_OUTPUT.PUT_LINE('ERES DE RECURSOS HUMANOS');

ELSE DBMS_OUTPUT.PUT_LINE('USUARIO NO AUTORIZADO');

END CASE;

END;

EJERCICIOS :

/*Práctica 1

Vamos a crear la tabla de multiplicar del 1 al 10, con los tres tipos de bucles:

LOOP, WHILE y FOR

RESPUESTA

set serveroutput on;


declare

numero number:=0;

resultado number;

begin

while numero<=10 loop

resultado:=1*numero;

dbms_output.put_line('1*'||to_char(numero)||'='||to_char(resultado));

numero:=numero+1;

end loop;

end;

--Práctica 2-

Crear una variable llamada TEXTO de tipo VARCHAR2(100).

Poner alguna frase Mediante un bucle, escribir la frase al revés, Usamos el bucle WHILE

--Práctica 3

Usando la práctica anterior, si en el texto aparece el carácter "x" debe salir del bucle.

Es igual en mayúsculas o minúsculas.

Debemos usar la cláusula EXIT.

--Práctica 4

Debemos crear una variable llamada NOMBRE

Debemos pintar tantos asteriscos como letras tenga el nombre. Usamos un bucle FOR

Por ejemplo Alberto --> ***

--Práctica 5

Creamos dos variables numéricas, "inicio y fin" Las inicializamos con algún valor:

Debemos sacar los números que sean múltiplos de 4 de ese rango

*/

/*ejercicios

Crea los siguientes ejemplos:

1- Crear una SELECT (no un cursor explícito) que devuelva el nombre de un empleado

pasándole el EMPLOYEE_ID en el WHERE,


Comprobar en primer lugar que funciona pasando un empleado existente

Pasar un empleado inexistente y comprobar que genera un error

Crear una zona de EXCEPTION controlando el NO_DATA_FOUND para que pinte

un mensaje como “Empleado inexistente”

2-Modificar la SELECT para que devuelva más de un empleado, por ejemplo

poniendo EMPLOYEE_ID> 100. Debe generar un error. Controlar la excepción

para que genere un mensaje como “Demasiados empleados en la consulta”

3-Modificar la consulta para que devuelva un error de división por CERO,

por ejemplo, vamos a devolver el salario en vez del nombre y lo dividimos por 0.

En este caso, en vez de controlar la excepción directamente,

creamos una sección WHEN OTHERS y pintamos el error con SQLCODE y SQLERR

4-El error -00001 es clave primaria duplicada.

Aunque ya existe una predefinida (DUP_VAL_ON_INDEX) vamos a crear una excepción no


predefinida que haga lo mismo. o Vamos a usar la tabla REGIONS para hacerlo más fácil o
Usamos PRAGMA EXCEPTION_INIT y creamos una excepción denominada “duplicado”. Cuando
se genere ese error debemos pintar “Clave duplicada, intente otra”. o Insertamos una fila en la
tabla REGIONS que esté duplicada y vemos que se controla el error.

*/

DECLARE

duplicado EXCEPTION;

PRAGMA EXCEPTION_INIT(duplicado, -00001);

BEGIN

INSERT INTO REGIONS (REGION_ID, REGION_name)

VALUES (78, 'JJJ');

DBMS_OUTPUT.PUT_LINE('INSERTADO CORRECTAMENTE');

EXCEPTION

WHEN duplicado THEN

DBMS_OUTPUT.PUT_LINE('Clave duplicada, intente otra');


DBMS_OUTPUT.PUT_LINE(SQLERRM);

END;

/*ejerccio

Crear una Excepción personalizada denominada CONTROL_REGIONES.

*Debe dispararse cuando al insertar o modificar una región queramos poner una clave superior
a 200. Por ejemplo, usando una variable con ese valor.

*En ese caso debe generar un texto indicando algo así como “Código no permitido. Debe ser
inferior a 200”

*Recordemos que las excepciones personalizadas deben dispararse de forma manual con el
RAISE.

*/

RESPUESTA

SET SERVEROUT ON

DECLARE

reg_max EXCEPTION;

regn NUMBER;

regt VARCHAR2(200);

BEGIN

regn := 37;

regt := 'OFFISHE';

IF regn > 200 THEN

RAISE reg_max;

ELSE

INSERT INTO regions VALUES (regn,regt);

COMMIT;

END IF;

EXCEPTION

WHEN reg_max THEN

dbms_output.put_line('CODIGO NO PERMITIDO DEBE SER INFERIOR A 200');

WHEN OTHERS THEN

dbms_output.put_line('ERROR INDEFINIDO');

END;
Creamos un TYPE TABLE basado en el RECORD anterior
Mediante un bucle cargamos en la colección los empleados. El campo NAME debe contener
FIRST_NAME y LAST_NAME concatenado.
Para cargar las filas y siguiendo un ejemplo parecido que hemos
visto en el vídeo usamos el EMPLOYEE_ID que va de 100 a 206
A partir de este momento y ya con la colección cargada, hacemos las siguientes operaciones,
usando métodos de la colección.
Visualizamos toda la colección
Visualizamos el primer empleado
Visualizamos el último empleado
Visualizamos el número de empleados
Borramos los empleados que ganan menos de 7000 y visualizamos de nuevo la colección
Volvemos a visualizar el número de empleados para ver cuantos se han borrado
*/

RESPUESTA

DECLARE

TYPE EMPLE IS TABLE OF

employees%ROWTYPE

INDEX BY PLS_INTEGER;

emp EMPLE;

BEGIN

FOR I IN 100..206 LOOP

SELECT * INTO emp(I) FROM employees WHERE EMPLOYEE_ID=I;

dbms_output.put_line(emp(I).LAST_NAME ||' '||emp(I).first_NAME );

END LOOP;

END;

Excepciones en Oracle / PLSQL


Están nombrados en el paquete STANDARD en PL/SQL y no necesitan ser definidos por el
programador.
La sección de EXCEPTION es la encargada de recoger todas las anomalías que se puedan
producir dentro del bloque de código PL/SQL.
Este tutorial de Oracle explica cómo usar las Excepciones en Oracle / PLSQL con sintaxis y
ejemplos.
Oracle tiene un conjunto estándar de excepciones ya nombrado de la siguiente manera:
Listado de excepciones.

NOMBRE DE EXCEPCIÓN CÓDIGO EXPLICACIÓN


DE
ERROR

DUP_VAL_ON_INDEX ORA- Este error se debe a que se ha intentado


00001 ejecutar un INSERT o un UPDATE que
intenta crear una fila con un valor
duplicado en un campo restringido pon un
UNIQUE INDEX.

TIMEOUT_ON_RESOURCE ORA- Ha acabado el tiempo de espera


00051 destinado a la consecución de un
recurso.

TRANSACTION_BACKED_OUT ORA- La parte remota de la transacción ha


00061 hecho rollback..

INVALID_CURSOR ORA- Esta trantado de utilizar un CURSOR


01001 que ya no existe.

NOT_LOGGED_ON ORA- Está intentando ejecutar una llamada a


01012 Oracle antes de validarse.

LOGIN_DENIED ORA- Está tratando de validarse contra Oracle


01017 usando una combinación errónea de
usuario/clave.
NO_DATA_FOUND ORA- Está sucediendo una de las siguientes
01403 cosas:

1. Está ejecutando una


sentencia SELECT INTO y no
hay filas que devolver.
2. Está haciendo referencia a
una fila de un tabla que no
está inicializada.
3. Esta intentado leer pasado el
fin de fichero con el paquete
UTL_FILE.

TOO_MANY_ROWS ORA- Está tratando de ejecutar una consulta


01422 SELECT INTO que devuelve más de
una fila.

ZERO_DIVIDE ORA- Está tratando de dividir por cero.


01476

INVALID_NUMBER ORA- Está tratando de ejecutar una sentencia


01722 SQL que trata de convertir una cadena
en número, pero no ha funcionado.

STORAGE_ERROR ORA- Se ha producido un desbordamiento de


06500 la memoria y la memoria esta
corrompida.

PROGRAM_ERROR ORA- Respuesta genérica a un error interno


06501 de Oracle.

VALUE_ERROR ORA- Se ha producido un error de conversión,


06502 truncamiento, o restricción (constraint)
de un valor numérico o de carácter.
CURSOR_ALREADY_OPEN ORA- Está intentando abrir un cursor que ya
06511 está abierto.

Sintaxis
La sintaxis de las excepciones en procedimientos y funciones.
Sintaxis de procedimientos
La sintaxis para la excepción en un procedimiento es:

CREATE [OR REPLACE] PROCEDURE NOMBRE_PROCEDIMIENTO [(param1


|IN|OUT|IN OUT| TIPO_DATO,
param2 |IN|OUT|IN OUT| TIPO_DATO ), … ]
IS

--Declaración de variables locales

BEGIN

--Declaración de Sentencia

EXCEPTION

WHEN NOMBRE_EXCEPTION1 THEN


[Declaración de Sentencia]

WHEN NOMBRE_EXCEPTION2 THEN


[Declaración de Sentencia]

WHEN NOMBRE_EXCEPTION_N THEN


[Declaración de Sentencia]

WHEN OTHERS THEN


[Declaración de Sentencia]

END NOMBRE_PROCEDIMIENTO
Sintaxis para funciones
La sintaxis de la excepción en una función es:
CREATE [OR REPLACE] FUNCTION NOMBRE_FUNCION [(param1 |IN|OUT|IN OUT|
TIPO_DATO,
param2 |IN|OUT|IN OUT| TIPO_DATO ), … ]
RETURN TIPO_DATO IS | AS

--Declaración de variables locales

BEGIN

--Declaración de Sentencia

RETURN DATO;

EXCEPTION
WHEN NOMBRE_EXCEPTION1 THEN
[Declaración de Sentencia]

WHEN NOMBRE_EXCEPTION2 THEN


[Declaración de Sentencia]

WHEN NOMBRE_EXCEPTION_N THEN


[Declaración de Sentencia]

WHEN OTHERS THEN


[Declaración de Sentencia]

END NOMBRE_FUNCION

Ejemplo
A continuación, se muestra un ejemplo de un procedimiento que utiliza una excepción
CREATE OR REPLACE PROCEDURE P_INS_CLIENTES(P_CODIGOCLIENTE IN
CLIENTE.CODIGOCLIENTE%TYPE,
P_NOMBRECLIENTE IN
CLIENTE.NOMBRECLIENTE%TYPE) IS

BEGIN

INSERT INTO CLIENTE


(CODIGOCLIENTE,
NOMBRECLIENTE)
VALUES
(P_CODIGOCLIENTE,
P_NOMBRECLIENTE);

EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20001,
'Ha intentado insertar un duplicado codigocliente.');

WHEN OTHERS THEN


RAISE_APPLICATION_ERROR(-20002,
'Se ha producido un error al insertar un cliente.');

END;

En este ejemplo, estamos atrapando la Excepción llamada DUP_VAL_ON_INDEX. También


estamos usando la cláusula WHEN OTHERS para atrapar a todos los errores

En conclusión

Si existe un bloque de excepción apropiado para el tipo de excepción que esta ejecuta dicho
bloque. Si no existe un bloque de control de excepciones adecuado al tipo de excepción se
ejecutará el bloque de excepción WHEN OTHERS THEN (si existe!). WHEN OTHERS debe
ser el último manejador de excepciones.

Potrebbero piacerti anche