Vous êtes sur la page 1sur 59

Sistemas Gestores de Bases de Datos Tema 8: Fundamentos de PL/SQL

Ral Ruiz Padilla rruizp@gmail !om Fe"rero #$%%

& Ral Ruiz Padilla' Fe"rero de #$%%


Basado en un tra"a(o pre)io de Laura *ateos P+rraga , otros

-lgunos dere!.os reser)ados /ste art0!ulo se distri"u,e "a(o la li!en!ia 1Re!ono!imiento23ompartir4gual 5 $ /spa6a7 de 3reati)e 3ommons' disponi"le en .ttp://!reati)e!ommons org/li!enses/",2sa/5 $/es/deed es /ste do!umento 8o uno mu, similar9 esta disponi"le en 8o enlazado desde9 .ttp://in:ormati!a gonzalonazareno org

ndice del Tema

Caractersticas de PL/SQL Estructura de un bloque PL/SQL Operaciones bsicas en PL/SQL Estructuras de control en PL/SQL Subprogramas: unciones ! Procedimientos Cursores E"cepciones

Caractersticas de PL/SQL #$%

Es una e"tensi&n de SQL con caractersticas tpicas de los lengua'es de programaci&n( Procedural language / structured quer! language( Las sentencias SQL de consulta ! manipulaci&n de datos pueden ser incluidas en unidades procedurales de c&digo) pero no pueden usarse instrucciones **L ni *CL( Se e'ecuta en el lado del ser+idor ! los procedimientos ! ,unciones se almacenan en la -*( .o tiene instrucciones de entrada por teclado o salida por pantalla(

Caractersticas de PL/SQL #$$%

$nclu!e los tipos de datos ! operadores de SQL( Los programas se pueden compilar desde SQL/Plus #comando /% o usar SQL *e+eloper u otros $*Es( Los comentarios comien0an por 1 1 o se colocan entre // ! //( Trae unas librerias con ,unciones prede,inidas) se llaman paquetes( Para e'ecutar los procedimientos almacenados desde SQL/Plus se usa el comando e"ec(

Estructura de un bloque PL/SQL DECLARE opcional

variables, cursores, excepciones definidas por el usuario

BEGIN

obligatorio

sentencias S L sentencias de control !L"S L

E#CE!$I%N opcional
acciones a reali&ar cuando se producen errores

END'

obligatorio

Estructura de un bloque PL/SQL E'emplo


DECLARE v(usuario )ARC*AR+,-./' v(fec0a DA$E' BEGIN SELEC$ user(id, fec0a IN$% v(usuario, v(fec0a 1R%2 tabla' E#CE!$I%N 3*EN no4bre(excepcion t0en 5566' END'

*eclaraci&n de 2ariables en PL/SQL


Sintaxis Identificador 7C%NS$AN$8 tipo(dato 7N%$ N9LL8 7:; < DE1A9L$ expresion8' E=e4plos v(fec0a v(deptno v(localidad v(co4ision

DA$E' N92BER,+/ N%$ N9LL :; -.' )ARC*AR+,->/ :; ?A$LAN$A@' C%NS$AN$ N92BER :; -A..'

3tributos 4T5PE ! 46O7T5PE

B$C!E sirve para declarar una variable basada en:


%tras previa4ente declaradas6 9na colu4na de la BD6 La tabla D la colu4na de la BD6 El no4bre de la variable definida con anterioridad

!receder B$C!E por:


9sar BR%3$C!E para tipos de datos co4puestos ,filas co4pletas, registros666/6

3signaci&n de +alores a +ariables


Sintaxis: Ejemplos: identificador :; expresiEn' v(fec0a :; @>-F%C$F+..>@' v(apellido :; ?LEpe&@'

Desde consulta: SELEC$ sal G .6-. IN$% v(co4ision 1R%2 e4p 3*ERE e4pno ; H.I+'

*bms8output(put8line
9:todo de un paquete prede,inido de O63CLE que sir+e para que el ser+idor muestre in,ormaci&n por pantalla) se usa ,undamentalmente en la ,ase de depuraci&n de los procedimientos(

begin dbms8output(put8line #;9i <= bloque PL/SQL dise>ado por ;??user??; el dia ;??s!sdate%@ end@

Sentencias SQL en PL/SQL


Para recuperar datos de la -* con SELECT( Sintaxis: SELEC$ lista(colu4nas IN$% Jvariable(no4bre7, 56685 < no4bre(registroK 1R%2 no4bre(tabla 3*ERE condicion'

$nserci&n de datos en PL/SQL


E'(: Aadir informacin sobre un nuevo empleado en la tabla emp. BEGIN INSER$ IN$% e4p,e4pno, ena4e, =ob, deptno/ )AL9ES,e4pno(seLuence6nextval, ?*ARDING@, ?CLERM@, -./' END'

3ctuali0aci&n de datos en PL/SQL Aumenta el salario de todos los empleados de la tabla emp que son analistas. DECLARE v(incre(sal e4p6salB$C!E :; +...' BEGIN 9!DA$E e4p SE$ sal ; sal N v(incre(sal 3*ERE =ob ; ?ANALCS$@' 5566 END'

-orrado de datos en PL/SQL


Suprimir los empleados que trabajan en el DPT !". DECLARE v(deptno BEGIN DELE$E 1R%2 e4p 3*ERE deptno ; v(deptno' END' dept6deptnoB$C!E'

Estructuras de Control en PL/SQL Sentencias $


Sintaxis: I1 condicion $*EN instrucciones' 7ELSI1 condicion $*EN instrucciones'8 7ELSE instrucciones'8 END I1'

Estructuras de Control en PL/SQL Sentencias C3SE


Similar al sAitcB de C) e+alua cada condici&n Basta encontrar alguna que se cumpla( La sinta"is es: C3SE Ce"presionD 7EE. Ccondicion<?+alor<D TEE. bloque8instrucciones8< 7EE. CcondicionF?+alorFD TEE. bloque8instrucciones8F (((( ELSE bloque8instrucciones8por8de,ecto E.* C3SE@

Estructuras de Control en PL/SQL Sentencias C3SE( E'emplos


C3SE 7EE. +8salG<HHH TEE. +8sal:I+8salJ<HH@ 7EE. +8salKFHHH TEE. +8sal:I+8sal1<HH@ E.* C3SE@ C3SE tipo 7EE. < TEE. procesar8pedido8local@ 7EE. F TEE. procesar8pedido8domicilio@ 7EE. L TEE. procesar8pedido8e"tran'ero@ ELSE procesar8pedido8normal@ E.* C3SE@

Condiciones booleanas
#$u%l es el valor de v&result en cada caso' v(result :; v(variAND v(vari+'

v(result
$R9E 1ALSE N9LL 1ALSE

v(vari$R9E 1ALSE $R9E 1ALSE

v(vari+
$R9E 1ALSE N9LL N9LL

Estructuras repetiti+as en PL/SQL

Los bucles repiten una sentencia o un grupo de sentencias varias veces6 *aD > tipos de bucles:

Bucle bOsico6 L%%!6 Acciones repetitivas sin condiciones globales6 Co4o si no existiera6 Bucle 1%R6 Acciones repetitivas basOndose en un contador6 NP4ero conocido de vueltas6 Bucle 3*ILE6 BasOndose en una condiciEn6

Estructuras repetiti+as en PL/SQL -ucle 7E$LE

3*ILE condiciEn L%%! instrucciones' 556 END L%%!' Se utili&a este bucle para repetir sentencias 4ientras una condiciEn sea cierta6

Estructuras repetiti+as en PL/SQL -ucle 7E$LE( E'emplo(

DECLARE v(contador binarD(integer :; .' BEGIN 3*ILE v(contador Q; -. L%%! INSER$ IN$% prueba ,id, contador/ )AL9ES ,v(id, v(contador/' v(contador :; v(contador N -' END L%%!' C%22I$' END'

Estructuras repetiti+as en PL/SQL -ucle O6

O6 indice $. C6E2E6SED +alor8inicial (( +alor8,inal LOOP instrucciones@ MMMMMM(( E.* LOOP@ N Osar bucle O6 para n= ,i'o de repeticiones( N El ndice se declara implcitamente(

Estructuras repetiti+as en PL/SQL -ucle O6

El Rndice fuera del bucle no estO definido, por lo tanto no se puede referenciar6 9sa una expresiEn para 0acer referencia al valor actual de un Rndice6 No 0agas uso de un Rndice co4o ob=etivo de una asignaciEn6

Estructuras repetiti+as en PL/SQL -ucle O6( E'emplo

DECLARE valor(inicial valor(final 5555556 END L%%!' N92BER :; -' N92BER :; -..'

1%R i IN valor(inicial 66 valor(final L%%!

Estructuras repetiti+as en PL/SQL -ucle O6( E'emplo

(nserta las !" primeras filas del pedido )"!.


*ECL36E +8id prueba(id4T5PE :I PH<@ -EQ$. MMMMM O6 i $. < (( <H LOOP $.SE6T $.TO prueba #id) contador% 23LOES #+8id) i%@ E.* LOOP@ MMMMM E.*@

Programaci&n modular en PL/SQL


En PL/SQL se pueden escribir cuatro tipos de bloques de c&digo: -loques an&nimos: .o se almacenan en la -*( Se e'ecutan tras escribirlos(

Procedimientos: Se almacenan en el ** ! son in+ocados( Pueden recibir ! de+ol+er mRltiples parmetros(

unciones: Se almacenan en el ** ! son in+ocadas( Pueden recibir parmetros ! de+uel+en un +alor Sen su nombreT(

Triggers: Se almacenan en el ** ! se e'ecutan automticamente cuando ocurre algRn e+ento(

Procedimientos en PL/SQL
C6E3TE O6 6EPL3CE P6OCE*O6E CesquemaD(nomproc #nombre1parmetro U$.) OOT) $. OOTV tipo de dato) ((% U$S) 3SV *eclaraci&n de +ariables@ *eclaraci&n de constantes@ *eclaraci&n de cursores@ -EQ$. Cuerpo del subprograma PL/SQL@

EWCEPT$O. -loque de e"cepciones PL/SQL@ E.*@

unciones en SQL
C6E3TE O6 6EPL3CE O.CT$O. CesquemaD(nombre1,uncion #nombre1parmetro tipo1de1dato) ((% 6ETO6. tipo1de1dato U$S) 3SV *eclaraci&n de +ariables@ *eclaraci&n de constantes@ *eclaraci&n de cursores@ -EQ$. Cuerpo del subprograma PL/SQL@

EWCEPT$O. -loque de e"cepciones PL/SQL@ E.*@

3claraciones sinta"is procedimientos ! ,unciones


No4breFparO4etro: es el nombre que nosotros queramos dar al parmetro( Podemos utili0ar mRltiples parmetros( En caso de no necesitarlos podemos omitir los par:ntesis( IN: especi,ica que el parmetro es de entrada ! que por tanto dicBo parmetro tiene que tener un +alor en el momento de llamar a la ,unci&n o procedimiento( Si no se especi,ica nada) los parmetros son por de,ecto de tipo entrada( %9$: especi,ica que se trata de un parmetro de salida( Son parmetros cu!o +alor es de+uelto despu:s de la e'ecuci&n el procedimiento al bloque PL/SQL que lo llam&( Las ,unciones PLSQL no admiten parmetros de salida( IN %9$: Son parmetros de entrada ! salida a la +e0(

E'emplo de procedimiento PL/SQL


C6E3TE

O6 6EPL3CE P6OCE*O6E procedimiento< #a $. .O9-E6) b $. OOT .O9-E6% +ma" .O9-E6@

$S -EQ$. SELECT salario) ma"imo $.TO b) +ma" 6O9 empleados 7EE6E empleado8idIa@ $ b G +ma" TEE. b:IbJ<HH@ E.* $ @ EWCEPT$O. 7EE. .O8*3T38 OO.* TEE. b:I 1<@ 6ETO6.@ E.*@

E'emplo de llamada a un procedimiento PL/SQL

*ECL36E +salario .O9-E6@ -EQ$. procedimiento< #LF<L) +salario%@ dbms8output(put8line #;El salario del empleado LF<L es ;) +salario%@ E.*@

3cti+idades

6eali0a un procedimiento mostrar_defts que reciba un nombre de usuario ! muestre el nombre de su tablespace por de,ecto( 6eali0a un procedimiento que reciba un nRmero de departamento ! muestre su nombre ! localidad( 6eali0a una ,unci&n devolver_sal que reciba un nRmero de empleado ! de+uel+a su salario( 6eali0a un procedimiento que reciba un nRmero de departamento ! muestre una lista de sus empleados( XQue problema tienesY

Cursores Tipos Los cursores son reas de memoria que almacenan datos e"trados de la base de datos( Ea! dos tipos: $mplcitos: *eclarados implcitamente para todas las sentencias del *9L ! SELECT de PL/SQL) consultas que de+uel+en una sola ,ila( E"plcitos: *eclarados ! nombrados por el programador( 9anipulados por sentencias especi,icas en las instrucciones e'ecutables del bloque( Se usan para consultas que de+uel+en ms de < ,ila(

Cursores $mplcitos
a/ SELEC$ de una sola ,ila( Si no de+uel+e ninguna ,ila o de+uel+e ms de una se origina un error( Lo controlaremos en la 0ona E#CE!$I%N) mediante los mane'adores : N%(DA$A(1%9ND 5 $%%(2ANC(R%3S6 b/ Sentencias del D2L) de ms de una ,ila(

Cursores E"plcitos *eclaraci&n de Cursor


Sinta"is: CO6SO6 nombre8cursor $S Sentencia select @ // sin $.TO // E'emplo: *ECL36E +8empno +8ename

emp(empno4T5PE@ emp(empno4T5PE@ $S

CO6SO6 emp8cursor SELECT empno) ename 6O9 emp 7EE6E deptno I LH@ (((((((((

36

Cursores E"plcitos 3pertura del cursor


3l abrir el cursor se e'ecuta realmente la consulta( Si la consulta no de+uel+e ninguna ,ila no se producir ninguna EWCEPT$O.( Ea! que utili0ar los atributos del cursor para comprobar los resultados obtenidos tras una recuperaci&n( %!EN nombre8cursor@

Cursores E"plcitos 6ecuperar datos del cursor


1E$C* nombre8cursor IN$% C+ar<)+arF)MD ? nom8registro@ 6ecuperar la ,ila actual e introducir los +alores en las +ariables de salida( $ncluir el mismo n= de +ariables( 6elacionar posicionalmente +ariables ! columnas( Comprobar si el cursor tiene ,ilas

Sinta"is: CL%SE nombre8cursor *esacti+a el cursor ! libera la memoria reser+ada( Cerrar cursor tras el procesamiento de las ,ilas( 2ol+er a abrir el cursor si ,uese necesario( Ea! un m"imo nRmero de cursores que pueden estar abiertos a la +e0 en la -*( .o se pueden recuperar datos del cursor una +e0 cerrado(

Cursores E"plcitos Cierre del Cursor

Cursores E"plcitos E'emplo


*ECL36E CO6SO6 emp8cursor $S SELECT empno) ename 6O9 emp@ -EQ$. OPE. emp8cursor@ ETCE emp8cursor $.TO +8empno) +8ename@ 7E$LE emp8cursor4 OO.* LOOP // Procesar in,ormaci&n ETCE emp8cursor $.TO +8empno) +8ename@ E.* LOOP@ CLOSE emp8cursor@ E.*@

40

Cursores e"plcitos 3tributos 4$SOPE. 4.OT OO.* booleano booleano T6OE si est abierto T6OE si la recuperaci&n ms reciente no de+uel+e ,ila T6OE si la recuperaci&n ms reciente de+uel+e ,ila n= de ,ilas de+ueltas Basta ese momento

4 OO.*

booleano

46O7COO.T

nRmero

Cursores e"plcitos 3pertura( Comprobaci&n


-EQ$. $ .OT cursor8emp4$SOPE. TEE. *-9S8OOTPOT(POT8L$.E #ZEl cursor est cerrado( 2amos a abrirlo[%@ OPE. cursor8emp@ E.* $ @

Cursores e"plcitos Cierre del cursor CL%SE cursor(e4p' END'

13/03/11

43

Cursores e"plcitos Cursor con +ariable registro


*ECL36E CO6SO6 emp8cursor $S SELECT ename) sal 6O9 emp 7EE6E deptno I <H@ +8reg8cursor emp8cursor46O7T5PE@ -EQ$. OPE. emp8cursor@ // 3brir cursor ETCE emp8cursor $.TO +8reg8cursor@ // Leer primera ,ila 7E$LE emp8cursor4 OO.* LOOP // mientras Ba!a ,ilas *-9S8OOTPOT(POT8L$.E#+8reg8cursor(ename??[ / Z?? +8reg8cursor(sal%@ // procesar ETCE emp8cursor $.TO +8reg8cursor@ // leer siguiente E.* LOOP@ CLOSE emp8cursor@ // cerrar cursor // presentar resultados ,inales #si procede% E.*@

Cursores e"plcitos -ucles O6 de cursor

O6 nombre8registro $. nombre8cursor LOOP instrucci&n8<@ instrucci&n8F@ (((( E.* LOOP@ 3pertura) recuperaci&n ! cierre implcitos( La +ariable registro se declara implcitamente

Cursores e"plcitos -ucle O6 de cursor(E'emplo

*ECL36E CO6SO6 emp8cursor $S SELECT ename) sal) T6O.C##S5S*3TE \ Biredate%/LP]% as antiguedad 6O9 emp 7EE6E deptno I <H@ -EQ$. O6 +8reg8cursor $. emp8cursor LOOP *-9S8OOTPOT(POT8L$.E#+8reg8cursor(ename ??[ / Z?? +8reg8cursor(sal??[ / Z?? +8reg8cursor(antiguedad%@ E.* LOOP@ E.*@

E"cepciones en PL/SQL

S uT es una excepciEnU

$denti,icador PL/SQL que surge durante la e'ecuci&n pro+ocado por un error( Se produce un error Oracle( Es pro+ocado e"plcitamente por el programador(

SCE4o surgeU

SCo4o se gestionaU
- Tratndola con un mane'ador en el propio bloque( - Propagndola al proceso padre(

E"cepciones en PL/SQL Qesti&n de e"cepciones en PL/SQL


Captura de una e"cepci&n: Cuando se produce una e"cepci&n en la secci&n e'ecutable) esta se rami,ica a la 0ona de EWCEPT$O.) donde se puede capturar ! tratar programando su correspondiente mane'ador( Propagaci&n de una e"cepci&n: Cuando se produce una e"cepci&n en un bloque ! no Ba! el correspondiente mane'ador para ella) el bloque termina con un error( Podremos gestionarla en el entorno de llamada de dicBa bloque(

E"cepciones en PL/SQL Tipos de e"cepciones(

*el ser+idor Oracle( Pro+ocadas implcitamente(


Con nombre( E': .O8*3T38 OO.* Sin nombre( O631<F]PH

*e,inidas por el usuario( Pro+ocadas e"plictamente


Con nombre( #se declaran pre+iamente% Sin nombre( #63$SE83PPL$C3T$O.8E66O6%

E"cepciones en PL/SQL 9ane'adores de e"cepciones( Sinta"is(

E#CE!$I%N 3*EN e"ception< C%R e"ceptionFMD $*EN instruccion<@ instruccionF@ CMMMMMMMMMMMMMMMMMM(( 3*EN %$*ERS $*EN instruccionL@ instruccion^@D

E"cepciones en PL/SQL 6eglas para interrumpir e"cepciones

EWCEPT$O.) inicia la secci&n de gesti&n de e"cepciones( Se permiten +arios mane'adores de e"cepciones( Solo se procesa un mane'ador de e"cepciones antes de salir del bloque( 7EE. OTEE6S es la Rltima clusula

E"cepciones en PL/SQL Prede,inidas por Oracle ! con nombre( E'emplos(


E"cepcion N%(DA$A(1%9ND $%%(2ANC(R%3S IN)ALID(C9RS%R VER%(DI)IDE D9!()AL(%N(INDE# .= error O631H<^HL O631H<^FF O631H<HH< O631H<^aP O631H<H<a *escripci&n SELECT .O *E2OEL2E *3TOS SELECT *E2OEL2E 9_S *E < $L3 OPE63C$`. $LEQ3L *E CO6SO6 *$2$*$6 PO6 H $.SE6T36 O. 6EQ$ST6O *OPL$C3*O

E"cepciones en PL/SQL Prede,inidas de O63CLE) sin nombre( 9:todo <

declare

asociaci&n

re,erencia

secciEn declarativa declarar e"cepci&n codi,icar P63Q93 EWCEPT$O.8$.$T

sec6 gest6 excepciones gestionar la e"cepci&n

E"cepciones en PL/SQL Prede,inidas de O63CLE) sin nombre( 9:todo <(E'emplo


*ECL36E // declaraci&n ! asociaci&n de la e"cepci&n e8restri8integri8emp EWCEPT$O.@ P63Q93 EWCEPT$O.8$.$T#e8restri8integri8emp) 1FFbF%@ +8deptno dept(deptno4t!pe:I<H@ -EQ$. *ELETE 6O9 dept 7EE6E deptno I +8deptno@ CO99$T@ EWCEPT$O. 7EE. e8restri8integri8emp TEE. dbms8output(put8line#Zno se puede borrar depto) e"isten empleados[%@ E.*@

E"cepciones en PL/SQL Prede,inidas de O63CLE) sin nombre( 9:todo F


Cuando se produce una e"cepci&n sin nombre) Ba! dos pseudo+ariables que almacenan in,ormaci&n del error: SQLCO*E: .= del c&digo del error( SQLE669: 9ensa'e asociado al n= del error( 3s) se pueden gestionar en el mane'ador 7EE. OTEE6S: 7EE. OTEE6S TEE. $ SQLCO*EI 1 FFbF TEE. dbms8output(put8line #;Error de integridad re,erencial;%@ E.* $ @

E"cepciones en PL/SQL *e,inidas por el usuario) con nombre

declare

raise

re,erence

s( declarati+a

s( e'ecutable

s( e"cepciones

Se especi,ica la e"cepci&n

Se pro+oca e"plcitamente la e"cepci&n con 63$SE

Se gestiona la e"cepci&n

E"cepciones en PL/SQL *e,inidas por el usuario) con nombre( E'emplo


*ECL36E e8in+alid8product EWCEPT$O.@ -EQ$. OP*3TE product SET descript I p8descripcion8product 7EE6E prodid I p8product8number@ $ SQL4.OT OO.* TEE. 63$SE e8in+alid8product@ E.* $ @ CO99$T@ EWCEPT$O. 7EE. e8in+alid8product TEE. *-9S8OOTPOT(POT8L$.E#Zn= del producto in+alidado[%@ E.*@

E"cepciones en PL/SQL( *e,inidas por el usuario) sin nombre 63$SE83PPL$C3T$O.8E66O6

Procedimiento que permite emitir mensa'es de error de,inidos por el usuario desde subprogramas almacenados( Solo se puede llamar desde un subprograma almacenado( Se usa en la secci&n e'ecutable o en la de e"cepciones( *e+uel+e condiciones de error al usuario de ,orma consistente con otros errores del ser+idor Oracle(

Sinta"is: 63$SE83PPL$C3T$O.8E66O6# num8error) mensa'e %@ donde num8error entre 1FHHHH ! 1FHbbb

E"cepciones en PL/SQL *e,inidas por el usuario) sin nombre 63$SE83PPL$C3T$O.8E66O6( E'emplo(

MMMMMMMM( E#CE!$I%N 7EE. .O8*3T38 OO.* TEE. 63$SE83PPL$C3T$O.8E66O6 #1FHFH<) Zmanager) no es un empleo +lido)[%@ MMMMMMMM( *ELETE 6O9 emp 7EE6E mgr I +8mgr@ $ SQL4.OT OO.* TEE. 63$SE83PPL$C3T$O.8E66O6#1FHFHF) Zeste no es un 'e,e +lido[%@ E.* $ @ MM

Vous aimerez peut-être aussi