You are on page 1of 56

PL/SQL(Procedural Language/SQL)

BLOQUESPL/SQL / TIPOSDEDATOS TIPOS DE DATOS FUNCIONESYPROCEDIMIENTOS PAQUETES

PL/SQL(Procedural Language/SQL)
PL/SQL es el lenguaje de programacin que PL/SQLesellenguajedeprogramacinque proporcionaOracleparaextenderelSQL estndarconotrotipodeestructurase estndar con otro tipo de estructuras e instrucciones
1. Variablesytipos st uctu as de co t o 2. Estructurasdecontrol
BuclesysentenciasIFTHENELSE

3. Procedimientosyfunciones 3 Procedimientos y funciones 4. Tiposdeobjetosymtodos


2

PL/SQL(Procedural Language/SQL)
PL/SQL permite: PL/SQLpermite:
ManipularlosdatosdelaBD Manejar errores Manejarerrores
Definidosporelusuario(excepciones) Propios del sistema (predefinidos) Propiosdelsistema(predefinidos)

La unidad bsica de cualquier programa Launidadbsicadecualquierprograma PL/SQLeselbloque C d bl Cadabloquerealizaunaunidadlgicade li id d l i d trabajoenelprograma,separandoasunas tareasdeotras d


3

PL/SQL(Procedural Language/SQL)
Estructura bsica de un bloque: Estructurabsicadeunbloque:
DECLARE /* Declaracin de uso local: variables, cursores, excepciones de usuario, */ BEGIN /* Seccin ejecutable (obligatoria): rdenes SQL y procedimentales */ EXCEPTION /* Zona de control de errores */ END; END
4

PL/SQL Declaracindevariables
Seccin de Declaracin de Variables SeccindeDeclaracindeVariables
Contieneladeclaracinde:
tiposdedatos, i d d lasconstantes variables

Tambinsedeclarancursores yexcepciones definidasporelusuario. LasvariablesexternassedeclaranenSQL*Plusy seescribenprecedidasde:.


5

PL/SQL Declaracindevariables
Sintaxis nombre_variable nombre variable [CONSTANT] tipo [NOT NULL] [:= valor_inicial]; [ l i i i l] LaclusulaCONSTANTindicaladefinicindeuna l l i di l d fi i i d constantequedebeserinicializadaycuyovalorno puedesermodificado d difi d [NOTNULL]:Obligaatenervalor
6

PL/SQL Declaracindevariables
Sintaxis
nombre_variable [CONSTANT] tipo [NOT NULL] [:= valor_inicial];

Tipo:puedeser:
Tipo de datos: tipo de dato de la variable Tipodedatos:tipodedatodelavariable Identificador%TYPE Serefierealtipousadoporuna columnadelatabla columna de la tabla Identificador%ROWTYPE Esunafilavariableconlos mismosnombresytiposquelascolumnasdeunatablao mismos nombres y tipos que las columnas de una tabla o filarecuperadadeuncursor
7

PL/SQL Declaracindevariables
Variables y constantes. Ejemplo Variablesyconstantes.Ejemplo DECLARE
v_DNI v_Nombre c_Factor v_DNI2 v DNI2 v_precio NUMBER(8,0); VARCHAR(30); ( ); CONSTANTNUMBER(3,2):=0.10; cliente.DNI%TYPE; cliente DNI%TYPE; NUMBER:=300;

cur_Rcliente R li t

cliente%ROWTYPE; li t %ROWTYPE

PL/SQL Declaracindevariables
CURSORES Cursoresunreadetrabajodefinidaparalas consultasquedevuelvenmsdeunafila. Permitelamanipulacindedatos p Selepuedenpasarparmetros Tiposdecursores Cursorsimple Cursoresconpasodeparmetros p p Cursoresconactualizacin

PL/SQL Declaracindevariables
CURSOR simple. Sintaxis CURSORsimple.Sintaxis CURSOR nombre cursor IS sentencia_SELECT; Ejemplo
DECLARE . CURSORc_cliente IS SELECTcliente.DNI,cliente.nombre SELECT cliente DNI cliente nombre FROMcliente WHEREcliente.tipo_trabajo= jefe ; WHERE cliente tipo trabajo=jefe;
10

PL/SQL Declaracindevariables
CURSORES CON PASO DE PARMETROS. Sintaxis CURSORESCONPASODEPARMETROS.Sintaxis
CURSOR nombre cursor [PARAMETROS] IS sentencia_SELECT;

Los parmetros de un cursor se pueden utilizar para Losparmetrosdeuncursorsepuedenutilizarpara definirvariablesconvaloresdeentrada. La consulta SQL asociada se ejecuta utilizando esos LaconsultaSQLasociadaseejecutautilizandoesos valores PARAMETROS PARAMETROS> (nombre_parametro tipo_parametro,)
11

PL/SQL Declaracindevariables
CURSORES CON PASO DE PARMETROS. Sintaxis CURSORESCONPASODEPARMETROS.Sintaxis
CURSOR nombre cursor [PARAMETROS] IS sentencia_SELECT;

EJEMPLO:
CURSORcur_cliente (v_provincia cliente.provincia%TYPE)IS SELECTdni,nombre SELECT dni nombre FROMclientes WHEREclientes.provincia=v_provincia; WHERE clientes provincia= v provincia;

12

PL/SQL Declaracindevariables
CURSORES CON ACTUALIZACIN. Sintaxis CURSORESCONACTUALIZACIN.Sintaxis
CURSOR nombre cursor IS sentencia_SELECT FOR UPDATE [OF nombre columna] [ ]

S d j Sedejanpreparadosparamodificarlasfilas d difi l fil devueltasysegeneranbloqueosexclusivossobre lasfilasactivas l fil ti

13

PL/SQL Declaracindevariables
CURSORES CON ACTUALIZACIN. Sintaxis CURSORESCONACTUALIZACIN.Sintaxis
CURSOR nombre cursor IS sentencia_SELECT FOR UPDATE [OF nombre columna] [ ]

EJEMPLO:
CURSORcur_cliente IS l SELECTDNI,nombre FROMcliente WHEREtipo_trabajo=jefe FORUPDATEOFsalario;
14

PL/SQL Declaracindevariables
OPERACIONES CON CURSORES OPERACIONESCONCURSORES OPEN:abreloscursores FETCH l l d t FETCH:leelosdatos CLOSE:cierraloscursores Pasos:
1. Declararelcursor 2. Abrirelcursorenlazonadeprocedimiento 3. Leerelcursor.Esnecesarioejecutarunbucleparaleer j p todosloscursores 4. Cerrarelcursor
15

PL/SQL Declaracindevariables
ATRIBUTOS DE LOS CURSORES ATRIBUTOSDELOSCURSORES Seleaadenalnombredelcursor %NOTFOUND Seusaparadetectarelfinalde uncursor.DevuelveTRUEsilaultimalectura un cursor. Devuelve TRUE si la ultima lectura fallaporquenohayfilasdisponiblesyFALSEsi recupera %FOUND Elcontrariode%NOTFOUND %ROWCOUNT Devuelveelnmerodefilaleda %ROWCOUNT D l l d fil l d %ISOPEN DevuelveTRUEsielcursoresta abiertoyFALSEsinoloest
16

PL/SQL Declaracindevariables
Ejemplo uso cursor Ejemplousocursor
DECLARE CURSOR cur_emp IS SELECT DNI, nombre FROM empleado; emp registro cur emp%ROWTYPE; BEGIN OPEN cur_emp; LOOP FETCH cur_emp INTO emp_registro; EXIT WHEN cur emp%NOTFOUND; %NOTFOUND ... END LOOP; CLOSE cur_emp; END;

17

PL/SQL Declaracindevariables
EXCEPCIONES Excepcionespredefinidas enPL/SQLque informandeloserroresproducidosenla ejecucindelassentenciasSQLporpartedel sistemadegestindebasesdedatos. Ademsdestas,elprogramadorpuededefinir , p g p excepcionesdeusoespecfico. Controlan los errores de ejecucin de un Controlanloserroresdeejecucindeun programa,previstosporelprogramador El control de las excepciones de usuario es Elcontroldelasexcepcionesdeusuarioes enteramentegestionadoporl. 18

PL/SQL Declaracindevariables
EXCEPCIONES. Sintaxis EXCEPCIONES.Sintaxis nombre_excepcin EXCEPTION; Cadaexcepcintrataunerror No son variables y no se las puede tratar como Nosonvariablesynoselaspuedetratarcomo tal No pueden utilizarse como argumentos en Nopuedenutilizarsecomoargumentosen funcionesnienprocedimientos S SeactivanmediantelasentenciaRAISE ti di t l t i RAISE RAISE nombre_excepcin;
19

PL/SQL Seccindeexcepciones
Ejemplo
DECLARE
e_hay_emp e hay emp EXCEPTION; v_dep departamento.depnum%TYPE :=10;

BEGIN
IF(SELECTCOUNT(*)FROMempleados WHEREdepnum =v_dep)=0 THENRAISEe_dep_vacio; ELSEENDIF; ELSE END IF;

END;

20

PL/SQL Tiposdedatosestructurados
Entre los tipos de datos estructurados que Entrelostiposdedatosestructuradosque proporcionaPL/SQLestn:
losregistros(RECORD) g ( ) losvectores(TABLEyVARRAY).

SedeclaranenlaseccinDECLARE

21

PL/SQL Tiposdedatosestructurados
REGISTROS Sintaxis REGISTROS Sintaxis
TYPE nombre_tipo IS RECORD (campo tipo[, campo tipo] ...);

Ejemplo:
TYPEtipo_empleado_reg ISRECORD ( nombreVARCHAR2(10), ( ), puestoVARCHAR2(8), sueldoNUMBER(6) ( ) );

22

PL/SQL Tiposdedatosestructurados
REGISTROS creacin de variables REGISTROS creacindevariables
Nombre_variable tipo_reg; Ejemplo:

v_empleado_reg tipo_empleado_reg;

Referenciarlasvariables
Nombre_variable.campo:=valor
23

PL/SQL Tiposdedatosestructurados
VECTORES Y TABLAS Sintaxis VECTORESYTABLAS
TYPE nombre_tipo IS VARRAY (tamao_max) OF tipo_datos [NOT NULL]; TYPE nombre_tipo IS TABLE OF tipo_datos [NOT NULL];

Latablapuedecrecerilimitadamente El vector solo puede crecer hasta el tamao Elvectorsolopuedecrecerhastaeltamao mximodefinido

24

PL/SQL Tiposdedatosestructurados
VECTORES
TYPE nombre_tipo IS VARRAY (tamao_max) OF tipo_datos [NOT NULL];

Parapoderutilizarlosvectores,debenser previamentecreadosvacosoconelementos. Para insertar elementos adicionales se tienen que Parainsertarelementosadicionalessetienenque extendermediantelaclusulaEXTEND En los vectores no se pueden borrar elementos Enlosvectoresnosepuedenborrarelementos
25

PL/SQL Tiposdedatosestructurados
VECTORES
Ejemplo:
DECLARE TYPEt_varray ISVARRAY(50)OFempleado.nombre%TYPE; v_varray t_varray; v varray t varray; BEGIN ... v_varray :=t_varray(Ana,Lola); secreacondoselementos v_varray.EXTEND; v_varray(3):=Luis; v varray(3) Luis v_varray.EXTEND; v_varray(4):=Juan; y( ) ; .... END;

26

PL/SQL Tiposdedatosestructurados
TABLAS TABLAS
TYPE nombre_tipo IS TABLE OF tipo datos [NOT NULL] tipo_datos NULL];

EnlostipoTABLEsepuedenborrarelementoscon lainstruccinDELETE,pudiendoquedarhuecos intermediosvacos Sepuedenvolverallenarconunaasignacin.La funcinEXISTSnospermitesabersiunelemento sepuedereferenciarohasidoborrado


27

PL/SQL Tiposdedatosestructurados
TABLAS Ejemplo TABLAS
DECLARE TYPEt_table ISTABLEOFempleado.nombre%TYPE; p ; v_table t_table; BEGIN v_table :=t_table(Ana,Lola); v_table(2):=NULL;Dejarunaposicinvaca v_table1.DELETE(1);Asescomoseborraunaposicin v table1 DELETE(1); As es como se borra una posicin v_table1.EXTEND; v_table1(3):=Luis; ( ) ; IFv_table1(1).EXISTS THEN...; ELSEv_table1(1):=Pepe;ENDIF; END;

28

PL/SQL Tiposdedatosestructurados
VECTORES Y TABLAS Mtodos predefinidos VECTORESYTABLAS Mtodospredefinidos
COUNT Devuelveelnmerodefilasdelatabla DELETE (n) Borra las filas de una tabla DELETE(n) Borralasfilasdeunatabla EXITS(n) DevuelveTRUEsiexisteenlatablalafila especificada FIRST Devuelveelndicedelaprimerafila LAST Devuelve el ndice de la ltima fila LAST Devuelveelndicedelaltimafila NEXT Devuelveelndicedelafiladelatablaquesiguea lafilaespecificada la fila especificada PRIOR Devuelveelndicedelafiladelatablaque p precedealafilaespecificada p
29

PL/SQL SeccinEjecutable
Seccin Ejecutable SeccinEjecutable Tresclasesdeinstrucciones
Instruccionesdeasignacin g Instruccionesdecontroldeflujo Bucles

Instruccionesnopermitidasson: DROP,CREATE,ALTER, DROP CREATE ALTER


30

PL/SQL SeccinEjecutable
Instrucciones de asignacin Instruccionesdeasignacin
variable := expresin; p ;

Expresiones Expresiones:
Puedenincluirliterales,variablesyconstantes definidasenelbloque Tambinfuncionesaplicadassobreliterales, constantesyvariables.
31

PL/SQL SeccinEjecutable
Instrucciones de asignacin Asignacin de Instruccionesdeasignacin Asignacinde sentenciasSQL
Esposiblerealizarlaasignacindelresultadode unaSELECTaunalistadevariablesoauncursor. Siseasignaaunalistadevariables,laconsulta asociadaslodebedarcomoresultadounanica asociada slo debe dar como resultado una nica fila(encasocontrariosegeneraunaexcepcin) Cuando no se conoce a priori el nmero de filas Cuandonoseconoceapriorielnmerodefilas delresultado,resultamsconvenienteutilizar cursores. cursores
32

PL/SQL SeccinEjecutable
Literales:
Lascadenasdecaracteressedelimitanporla comillasimple. comilla simple Losnmerosrealespuedenespecificarsetanto enformatodecimalcomocientfico OperadoressobreNmeros:+,,*,/,**,MOD Operadores sobre cadenas: || (concatenacin) Operadoressobrecadenas:||(concatenacin). Operadoreslgicos:AND,OR,NOT.
33

PL/SQL SeccinEjecutable
Literales:
Operadores sobre cursores: %ROWCOUNT, %NOTFOUND, %FOUND, %ISOPEN. Comparadoresclsicos: <,<=,=,!=, =,<,= < <= = != ^= < = Comparadores SQL: [NOT]LIKE,IS[NOT]NULL, [ ] [ ] [NOT]BETWEEN..AND.., [NOT]IN

34

PL/SQL SeccinEjecutable
Funciones:
Funcionessobrecadenasdecaracteres: ASCII,CHR,LENGTH,LOWER,SUBSTR,UPPER, ASCII CHR LENGTH LOWER SUBSTR UPPER Funcionesnumricas:ABS,FLOOR,MOD,ROUND,SQRT, TRUNC, TRUNC Funciones sobre fechas:ADD_MONTHS,LAST_DAY, MONTHS_BETWEEN,NEXT_DAY,SYSDATE,TRUNC. MONTHS BETWEEN, NEXT DAY, SYSDATE, TRUNC. Funcionesdeconversin:TO_CHAR,TO_DATE, TO_NUMBER. _ Funcionesdecontroldeerrores:SQLCODE,SQLERRM
35

PL/SQL SentenciasdeControldeflujo
Sentencias de Control de flujo SentenciasdeControldeflujo
Realizanelcontroldelcomportamientodel bloque. bloque Tipos: Condicionales(IF) Bucles Losbuclespermitenrepetirunnmerode vecesunconjuntodeinstrucciones veces un conjunto de instrucciones PL/SQL. PararomperelbucleseusaEXIT,GOTOo Para romper el bucle se usa EXIT GOTO o RAISE 36

PL/SQL SentenciasdeControldeflujo
CONDICIONALES (IF) CONDICIONALES(IF)
Ejecutaunaovariassentenciasdependiendode unacondicin una condicin
IF condicin THEN instrucciones; [ELSIF condicin THEN instrucciones] [ELSE instrucciones]; EN DIF

37

PL/SQL SentenciasdeControldeflujo
BUCLES
Buclessimples(LOOP). Buclescondicionales(WHILE) Buclesnumricos(FOR) Buclessobrecursores Bucles sobre sentencias SELECT BuclessobresentenciasSELECT

38

PL/SQL SentenciasdeControldeflujo
BUCLES SIMPLES (LOOP) Sintaxis BUCLESSIMPLES(LOOP)
[nombre_bucle] LOOP sentencias; END LOOP LOOP;

Ejemplo
DECLARE v_contador BINARY_INTEGER:=1; BEGIN LOOP INSERT INTO tabla_temporal VALUES ( contador,ejemplo); S (v d j l ) v_contador:=v_contador+1; EXIT WHEN v_contador>50; END LOOP; END;

39

PL/SQL SentenciasdeControldeflujo
BUCLES CONDICIONALES (WHILE) CONDICIONALES(WHILE)
Lacondicinseevalaantesdeentrarenel bucle
[nombre_bucle] WHILE condicin LOOP sentencias; END LOOP;

40

PL/SQL SentenciasdeControldeflujo
BUCLES CONDICIONALES (WHILE) CONDICIONALES(WHILE)
Ejemplo
DECLARE v_contador BINARY_INTEGER:=1; BEGIN WHILEv_contador<=50LOOP INSERTINTOtabla_temporal VALUES(v_contador,ejemplo); v_contador:=v_contador+1; ENDLOOP; END;
41

PL/SQL SentenciasdeControldeflujo
BUCLES NUMRICOS (FOR) BUCLESNUMRICOS(FOR)
Seejecutanunasolavezporcadaelementode rangodefinido rango definido
[nombre_bucle] FOR indice IN [REVERSE] exp n1 e p e p n1..exp n2 LOOP sentencias; END LOOP; LOOP

indice:variablenumricadecontrolempiezaen exp_n1yterminaenexp_n2. 1 i 2 Sedeclaraimplcitamentecomoun BINARY_INTEGER


42

PL/SQL SentenciasdeControldeflujo
BUCLES NUMRICOS (FOR) BUCLESNUMRICOS(FOR)
Seejecutanunasolavezporcadaelementode rangodefinido rango definido
[nombre_bucle] FOR indice IN [REVERSE] e p n1 e p n2 LOOP exp n1..exp sentencias; END LOOP; LOOP

[ V S ] L [REVERSE]:Lacuentasehacealrevs h l Exp_n1,yexp_n2puedenserctes ocualquier expresinquedevuelvaunnmero


43

PL/SQL SentenciasdeControldeflujo
BUCLES NUMRICOS (FOR) BUCLESNUMRICOS(FOR)
Ejemplo
BEGIN FORv_contador IN1..50LOOP INSERTINTOtabla_temporal VALUES(v_contador,ejemplo); ENDLOOP; END;

44

PL/SQL SentenciasdeControldeflujo
BUCLES SOBRE CURSORES BUCLESSOBRECURSORES
Enunbuclesobrecursoressedeclarademodo implcitolavariablefilaasociada. Asimismo,serealizaunOPENdelcursoralentrar enelbucleyunCLOSEalsalir y SeproduceunFETCHimplcitoencadaiteracin delbucle. del bucle

45

PL/SQL SentenciasdeControldeflujo
BUCLES SOBRE CURSORES BUCLESSOBRECURSORES
Ejemplo:
DECLARE CURSORcur_emp IS SELECTnum_empleado,nomb_empleado FROM empleado; BEGIN FORemp_registro INcur_emp LOOP IFemp_registro.edad>30THEN... IF it d d 30 THEN ENDLOOP; END;
46

PL/SQL SentenciasdeControldeflujo
BUCLES SOBRE SENTENCIAS SELECT BUCLESSOBRESENTENCIASSELECT
Eselmismoconceptoanteriorperosin declaracindecursores declaracin de cursores [nombre_bucle] [nombre bucle] FORnombre_registro IN(sentencia_select) LOOPsentencias LOOP t i ENDLOOP; Cuandosesaleconexit oerrordelbucleel cursorinternoquegeneraORACLEsecierra cursor interno que genera ORACLE se cierra
47

PL/SQL SentenciasdeControldeflujo
BUCLES SOBRE SENTENCIAS SELECT BUCLESSOBRESENTENCIASSELECT
Ejemplo
BEGIN FORregistroIN(SELECTDNI,nombreFROMcliente) g ( , ) LOOP INSERTINTOtabla_temporal p (contador,texto) VALUES(registro.DNI,registro.nombre); VALUES (registro.DNI, registro.nombre); ENDLOOP; END;
48

PL/SQL SentenciasdeControldeflujo
GOTO y ETIQUETAS GOTOyETIQUETAS
transfiereelcontrolalasentenciaobloque siguientealaetiquetaindicada siguiente a la etiqueta indicada
<<etiqueta>> GOTO <<etiqueta>>;

Lasentenciapuedeiraotrobloqueosubbloque peronuncaalazonadeexcepciones. Lasentenciasiguientealaetiquetadebeserun ejecutable. No se puede realizar saltos al interior de un IF o NosepuederealizarsaltosalinteriordeunIFo deunbucle. 49

PL/SQL Seccindeexcepciones
Manejo de excepciones Manejodeexcepciones
Permite responder ante cualquier problema que Permiteresponderantecualquierproblemaque puedaocurrirenlaejecucindecualquier operacin Laejecucindelaaplicacinfinalizaal presentarsealgnerrorgrave t l Medianteelmanejodeexcepcionesesposible realizarunaseriedeaccionesycontinuarla ejecucindelaaplicacin.
50

PL/SQL Seccindeexcepciones
Manejo de excepciones Manejodeexcepciones
WHEN excepciones THEN instrucciones;

Dondeexcepciones: excep_mltiples |OTHERS Donde excep mltiples: Dondeexcep_mltiples: excepcin|excepcinORexcep_mltiples

51

PL/SQL Seccindeexcepciones
Manejo de excepciones Manejodeexcepciones
La activacin de una excepcin la realiza el Laactivacindeunaexcepcinlarealizael sistemaoelprogramamedianteutilizacindela sentenciaRAISE sentencia RAISE Cuandounaexcepcinseactiva,laejecucin continaenlapartedemanejadoresde ti l t d j d d excepciones Sinoexistelaexcepcinactivadaenlaseccinde excepciones,laexcepcinsigueactivaporsi tuvieraquesertratadaenotronivel.
52

PL/SQL Seccindeexcepciones
En la parte de manejadores la ejecucin se Enlapartedemanejadores,laejecucinse realizadelmodosiguiente:
S b Sebuscaunmanejadorquecorrespondaconlaexcepcin j d d l i activada, La clusula OTHERS corresponde a todas las excepciones LaclusulaOTHERScorrespondeatodaslasexcepciones EsconvenienteponerlaclusulaOTHERSlaltima Una vez encontrado el manejador se desactiva la Unavezencontradoelmanejador,sedesactivala excepcinyseejecutanlasinstruccionesasociadas Si se deseara mantener activa la excepcin o se desea Sisedesearamanteneractivalaexcepcin,osedesea activarcualquierotra,esposibleincluirlasentenciaRAISE q quefinalizaraelbloqueyactivaralaexcepcinasociada. q y p
53

PL/SQL Seccindeexcepciones
Excepciones predefinidas por Oracle: ExcepcionespredefinidasporOracle:
NO_DATA_FOUND TOO_MANY_ROWS Ocurrencuandounselect noseleccionanadao seleccionavariasfilascuandosloseesperabauna INVALID_NUMBER,VALUE_ERROR,ZERO_DIVIDE Seproducenporoperacionesinvalidasdetratamientode S d i i lid d t t i t d nmeros DUP VAL ON INDEX DUP_VAL_ON_INDEX Seproducecuandoseintentainsertarunaclaveprimaria duplicada. duplicada
54

PL/SQL Seccindeexcepciones
Excepciones predefinidas por Oracle: ExcepcionespredefinidasporOracle:
CURSOR_ALREADY_OPEN Ocurrealintentarabriruncursoryaabierto INVALID_CURSOR
Ocurrealintentarhacerunaoperacininvalidasobreuncursor

PROGRAM_ERROR,STORAGE_ERROR, TIMEOUT_ON_RESOURCE TIMEOUT ON RESOURCE Detectanerroresdealmacenamientoodeejecucin.


55

PL/SQL Seccindeexcepciones
Manejo de excepciones Ejemplo Manejodeexcepciones
DECLARE
e_hay_emp e hay emp EXCEPTION; v_dep departamento.depnum%TYPE :=10;

BEGIN
IF(SELECTCOUNT(*)FROMempleados WHEREdepnum =v_dep)=0 THENRAISEe_dep_vacio; ELSEENDIF; ELSE END IF;

EXCEPTION
WHENe_dep_vacio THENRAISE_APPLICATION_ERROR( 20001, El WHEN e dep vacio THEN RAISE APPLICATION ERROR(20001, El
dep.TO_CHAR(v_dep)notieneempleados.);

WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(abortadopor errordesconocido); d id )

END;

56