MEGA GUIA DE PL SQL

download MEGA GUIA DE PL SQL

of 73

Transcript of MEGA GUIA DE PL SQL

  • 7/25/2019 MEGA GUIA DE PL SQL

    1/73

    PL /SQL

    SQL es un lenguaje de consulta para los sistemas de bases de datosrelacinales, pero que no posee la potencia de los lenguajes de programacin.

    Para abordar el presente tutorial con mnimo de garantas es necesarioconocer previamente SQL.

    Podemos acceder a un completo tutorial de SQL desde AQUI.

    PL/SQL amplia SQL con los elementos caractersticos de los lenguajes deprogramacin, variables, sentencias de control de flujo, bucles ...

    Cuando se desea realiar una aplicacin completa para el manejo de unabase de datos relacional, resulta necesario utiliar alguna !erramienta quesoporte la capacidad de consulta del SQL " la versatilidad de los lenguajes de

    programacin tradicionales. PL/SQL es el lenguaje de programacin queproporciona Oraclepara e#tender el SQL est$ndar con otro tipo deinstrucciones.

    Que vamos a necesitar?

    Para poder seguir este tutorial correctamente necesitaremos tener lossiguientes elementos%

    &na instancia de '()CL* +i o superior funcionando correctamente. erramientas cliente de '()CL*, en particular SQL-Plus para poder

    ejecutar los ejemplo. aber configurado correctamente una cone#in a '()CL*.

    Introduccin

    SQL es un lenguaje de consulta para los sistemas de bases de datosrelacinales, pero que no posee la potencia de los lenguajes de programacin.o permite el uso de variables, estructuras de control de flujo, bucles " dem$selementos caractersticos de la programacin. o es de e#traar, SQL es unlenguaje de consulta no un lenguaje de programacin.

    Sin embargo, SQL es la !erramienta ideal para trabajar con bases dedatos. Cuando se desea realiar una aplicacin completa para el manejo deuna base de datos relacional, resulta necesario utiliar alguna !erramienta quesoporte la capacidad de consulta del SQL " la versatilidad de los lenguajes deprogramacin tradicionales. PL/SQL es el lenguaje de programacin queproporciona 'racle para e#tender el SQL est$ndar con otro tipo deinstrucciones " elementos propios de los lenguajes de programacin.

    http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=8http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=8
  • 7/25/2019 MEGA GUIA DE PL SQL

    2/73

    Con PL/SQL vamos a poder programar las unidades de programa de la basede datos '()CL*, est$n son%

    Procedimientos almacenados 0unciones 1riggers Scripts

    Pero adem$s PL/SQL nos permite realiar programas sobre las siguientes!erramientas de '()CL*%

    'racle 0orms 'racle (eports 'racle 2rap!ics 'racle )plication Server

    Primeros pasos con PL/SQL

    Para programar en PL/SQL es necesario conocer sus fundamentos.

    Como introduccin vamos a ver algunos elementos " conceptos b$sicos dellenguaje.

    PL/SQL no es C)S*3S*S4145*, es decir, no diferencia ma"6sculas de

    min6sculas como otros lenguajes de programacin como C o 7ava.Sinem!argo de!emos recordar "ue O#A$L% es $AS%&S%'SI(I)% en las!*s"uedas de te+to.

    &na lnea en PL/SQL contiene grupos de caracteres conocidos como&48)8*S L*94C)S, que pueden ser clasificadas como%

    o 8*L4:41)8'(*So 48*1404C)8'(*So L41*()L*So C':*1)(4'So *9P(*S4'*So

    8*L4:41)8'(% *s un smbolo simple o compuesto que tiene una funcinespecial en PL/SQL. *stos pueden ser%

    o 'peradores )ritm;ticoso 'peradores Lgicoso 'peradores (elacionaleso

    48*1404C)8'(% Son empleados para nombrar objetos de programas en

    PL/SQL as como a unidades dentro del mismo, estas unidades " objetosinclu"en%

  • 7/25/2019 MEGA GUIA DE PL SQL

    3/73

    o Constanteso Cursoreso 5ariableso Subprogramaso *#cepcioneso Paquetes

    L41*()L%*s un valor de tipo num;rico, car$cter, cadena o lgico norepresentado por un identificador de ellas decimales. *s decir, BE enteros" dos decimales -/

    $A# GG " cu"o valor de longitud por default es B

  • 7/25/2019 MEGA GUIA DE PL SQL

    4/73

    33 C)( @I

    posiciones -/

    )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    5/73

    Sint6+is

    dec7p e8

    La precisin m$#ima es

    de F+ dgitos.

    La precisin m$#ima es

    de F+ dgitos.

    8onde pes laprecisin " ela escala.Por ejemplo9dec dgitos antesdel decimal " un dgitodespu;s del decimal.

    decimal7pe8

    La precisin m$#ima esde F+ dgitos.

    La precisin m$#ima esde F+ dgitos.

    8onde pes laprecisin " ela escala.Porejemplo9decimal dgitos antesdel decimal " un dgito

    despu;s del decimal.dou!leprecision

    :loat

    int

    integer

    numeric7pe8

    La precisin m$#ima esde F+ dgitos.

    La precisin m$#ima esde F+ dgitos.

    8onde pes laprecisin " ela escala.

    Porejemplo9numeric=es un n6mero quetiene J dgitos antesdel decimal " > dgitosdespu;s del decimal.

    num!er7pe8

    La precisin m$#ima esde F+ dgitos.

    La precisin m$#ima esde F+ dgitos.

    8onde pes laprecisin " ela escala.Porejemplo9number=es un n6mero quetiene J dgitos antesdel decimal " > dgitosdespu;s del decimal.

    real

    smallint

    c;ar7tamaGG b"tes enPLSQL.asta >III b"tes en

    'racle +i.

    asta F>GG b"tes enPLSQL.asta >III b"tes en

    'racle Ki.

    8onde tama

  • 7/25/2019 MEGA GUIA DE PL SQL

    6/73

    varc;ar7tamaGG b"tes enPLSQL.asta EIII b"tes en'racle +i.

    asta F>GG b"tes enPLSQL.asta EIII b"tes en'racle Ki.

    8onde tama gigab"tes. asta > gigab"tes.Son cadenas de anc!ovariable.

    ra=

    asta F>GG b"tes enPLSQL.asta >III b"tes en'racle +i.

    asta F>GG b"tes enPLSQL.asta >III b"tes en'racle Ki.

    Son cadenas binariasde anc!o variable.

    long ra= asta > gigab"tes. asta > gigab"tes.Son cadenas binariasde anc!o variable.

    date

    &na fec!a entre el B de

    *nero de EGB> ).C. " elFB de 8iciembre de KKKK8.C.

    &na fec!a entre el B de

    *nero de EGB> ).C. " elFB de 8iciembre de KKKK8.C.

    timestamp7fractionalsecondsprecision8

    o soportado por 'racle+i.

    :ractional secondsprecisiondebe ser unn6mero entre I " K.

  • 7/25/2019 MEGA GUIA DE PL SQL

    7/73

    da 7dayprecision8to second7fractional

    secondsprecision8

    +i.

    un n6mero entre I " K.=:ractional secondsprecisiondebe ser un

    n6mero entre I " K.

  • 7/25/2019 MEGA GUIA DE PL SQL

    8/73

    apuntan a un granobjeto LS decaracteres dentro de labase de datos.

    Operadores en PL/SQL

    La siguiente tabla ilustra los operadores de PL/SQL.

    (ipo de operador Operadores

    Operador deasignacin

    %M

  • 7/25/2019 MEGA GUIA DE PL SQL

    9/73

    33 4nstrucciones%'0ICD

    &n aspecto a tener en cuenta es que la instruccin condicional anidada

    es ELSIF" no "ELSEIF".

    Sentencia DO(O

    PL/SQL dispone de la sentencia 2'1'. La sentencia 2'1' desva el flujode ejecucin a una determinada etiqueta.

    *n PL/SQL las etiquetas se indican del siguiente modo% OO etiqueta

    *l siguiente ejemplo ilustra el uso de 2'1'.

    0%$LA#% flag 'U,-%#D-%DI' flag %MB D IC

  • 7/25/2019 MEGA GUIA DE PL SQL

    10/73

    *l bucle 3IL% se repite mientras que se cumpla exre!ion.

    3IL%

  • 7/25/2019 MEGA GUIA DE PL SQL

    11/73

    Cada una de las partes anteriores se delimita por una palabra reservada, demodo que un bloque PL/SQL se puede representar como sigue%

    @ declare F is F as

    /-Parte declarativa-/!egin

    /-Parte de ejecucion-/@ e+ception

    /-Parte de e#cepciones-/endG

    8e las anteriores partes, 6nicamente la seccin de ejecucin es obligatoria,que quedara delimitada entre las cl$usulas -%DI'"%'0. 5eamos un ejemplode bloque PL/SQL mu" gen;rico. Se trata de un bloque annimos, es decir no

    lo identifica ning6n nombre. Los bloques annimos identifican su partedeclarativa con la palabra reservada 0%$LA#%.

    0%$LA#%/-Parte declarativa-/nombreHvariable 0A(%D

    -%DI'/-Parte de ejecucion

    - *ste cdigo asigna el valor de la columna TnombreHcolumnaT- a la variable identificada por TnombreHvariableT

    -/S%L%$(SUS8)1*I'(OnombreHvariableC#O,8&)LD

    %E$%P(IO'/-Parte de e#cepciones-/3%' O(%#S (%'d!msHoutput.putHline7Se ;a producido un error8D

    %'0G

    ) continuacin vamos a ver cada una de estas secciones

    Seccin de 0eclaracin de )aria!les

    *n esta parte se declaran las variables que va a necesitar nuestro programa.&na variable se declara asignandole un nombre o TidentificadorT seguido deltipo de valor que puede contener. 1ambi;n se declaran cursores, de granutilidad para la consulta de datos, " e#cepciones definidas por el usuario.1ambi;n podemos especificar si se trata de una constante, si puede contenervalor nulo " asignar un valor inicial.

    La sinta#is gen;rica para la declaracin de constantes " variables es%

  • 7/25/2019 MEGA GUIA DE PL SQL

    12/73

    nombreHvariable @$O'S(A'(A #tio$dato%@'O( 'ULLA@%MvalorHinicialA

    donde%

    tipoHdato% es el tipo de dato que va a poder almacenar la variable, estepuede ser cualquiera de los tipos soport$ndoos por '()CL*, esdecir 'U,-%#, 0A(%, $A#, )A#$A#)A#$A#-OOL%A' ...)dem$s para algunos tipos de datos

  • 7/25/2019 MEGA GUIA DE PL SQL

    13/73

    la tabla tablaHempleados identificada por vHnombre " no se le asigna ning6n valor -/

    vHnombre tablaHempleados.nombre1(2P%D

    /-Se declara la variable del tipo registro correspondiente a unsupuesto cursor, llamado micursor, identificada por regHdatos-/ regHdatos micursor1#O3(2P%D

    -%DI'/-Parte de ejecucion-/

    %E$%P(IO'/-Parte de e#cepciones-/

    %'0G

    *structura de un subprograma%

    $#%A(% P#O$%0U#% simpleHprocedureIS

    /- Se declara la variable de tipo 5)(C)(>

  • 7/25/2019 MEGA GUIA DE PL SQL

    14/73

    Introduccin a cursores PL/SQL

    PL/SQL utilia cursores para gestionar las instrucciones S%L%$(. &n cursores un conjunto de registros devuelto por una instruccin SQL. 1;cnicamentelos cursores son fragmentos de memoria que reservados para procesar los

    resultados de una consulta S%L%$(.

    Podemos distinguir dos tipos de cursores%

    $ursores implJcitos. *ste tipo de cursores se utilia paraoperaciones S%L%$( I'(O. Se usan cuando la consulta devuelve un 6nicoregistro.

    $ursores e+plJcitos. Son los cursores que son declarados "controlados por el programador. Se utilian cuando la consulta devuelve unconjunto de registros. 'casionalmente tambi;n se utilian en consultas quedevuelven un 6nico registro por raones de eficiencia. Son m$s r$pidos.

    &n cursor se define como cualquier otra variable de PL/SQL " debenombrarse de acuerdo a los mismos convenios que cualquier otra variable. Loscursores implcitos no necesitan declaracin

    *l siguiente ejemplo declara un cursor e#plicito%

    declarecursorcHpaises is

    S%L%$(C'HP)4S, 8*SC(4PC4' C#O,P)4S*SD!egin&' Sentencia! del bloque ...'&endD

    Para procesar instrucciones S*L*C1 que devuelvan m$s de una fila, sonnecesarios cursores e#plcitos combinados con un estructura de bloque.

    &n cursor admite el uso de par$metros. Los par$metros deben declararse

    junto con el cursor.

    *l siguiente ejemplo muestra la declaracin de un cursor con un par$metro,identificado por pHcontinente.

    declarecursorcHpaises

  • 7/25/2019 MEGA GUIA DE PL SQL

    15/73

    &' Sentencia! del bloque ...'&endD

    *l siguiente diagrama representa como se procesa una instruccin SQL a

    trav;s de un cursor.

    0ases para procesar una instruccin SQL

    $ursores ImplJcitos

    0eclaracin de cursores implJcitos.

    Los cursores implcitos se utilian para realiar consultas S%L%$( quedevuelven un 6nico registro.

    8eben tenerse en cuenta los siguientes puntos cuando se utilian cursoresimplcitos%

    Con cada cursor implcito debe e#istir la palabra clave I'(O. Las variables que reciben los datos devueltos por el cursor tienen que

    contener el mismo tipo de dato que las columnas de la tabla. Los cursores implcitos solo pueden devolver una 6nica fila. *n caso de

    que se devuelva m$s de una fila

  • 7/25/2019 MEGA GUIA DE PL SQL

    16/73

    dbmsHoutput.putHline

  • 7/25/2019 MEGA GUIA DE PL SQL

    17/73

    1ambi;n debemos declarar los posibles par$metros que requiera el cursor%

    $U#SO#nombre_cursor*aram+ tio+, ..., aramN tioN-IS in!truccin$SELEC)

    Para abrir el cursor

    OP%' nombre_cursor o bien

  • 7/25/2019 MEGA GUIA DE PL SQL

    18/73

    0%$LA#%$U#SO#cpaisesIS

    S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD

    registro cpaisesX#O3(2P%D

    -%DI' OP%'cpaisesD C%($cpaises I'(OregistroD $LOS%cpaisesD%'0D

    *l mismo ejemplo, pero utiliando par$metros%

  • 7/25/2019 MEGA GUIA DE PL SQL

    19/73

    0%$LA#%$U#SO#cpaises

  • 7/25/2019 MEGA GUIA DE PL SQL

    20/73

    Atri!utos de cursores

    1oman los valores 1(&*, 0)LS* o &LL dependiendo de la situacin%

    Atri!uto Antes de a!rir Al a!rir 0urante la recuperacinAl :inali>ar la recuperacin 0espuBs de cerrar

    1'O(COU'0 '()3BIIB &LL 0)LS* 1(&* '()3BIIB1COU'0 '()3BIIB &LL 1(&* 0)LS* '()3BIIB

    1ISOP%' 0)LS* 1(&* 1(&* 1(&* 0)LS*1#O3$OU'( '()3BIIB I - -- '()3BIIB

    - 6mero de registros que !a recuperado !asta el momento -- 6mero de total de registros

    ,anejo del cursor

    Por medio de ciclo L''P podemos iterar a trav;s del cursor. 8ebe tenerse cuidado de agregar una condicin para salir delbucle%

  • 7/25/2019 MEGA GUIA DE PL SQL

    21/73

    5amos a ver varias formas de iterar a trav;s de un cursor. La primera esutiliando un bucle L''P con una sentencia *941 condicionada%

    OP%'nombreHcursorD

    LOOP C%($nombreHcursor I'(OlistaHvariablesD %EI(3%'nombreHcursorX'O(COU'0D /- Procesamiento de los registros recuperados -/ %'0 LOOPD $LOS%nombreHcursorD

    )plicada a nuestro ejemplo anterior%

    0%$LA#%$U#SO#cpaisesIS

    S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O, P)4S*SD

    coHpais )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    22/73

    3IL% nombreHcursorXCOU'0LOOP

    /- Procesamiento de los registros recuperados -/ C%($nombreHcursor I'(OlistaHvariablesD %'0 LOOPD

    $LOS%nombreHcursorD

    Por 6ltimo podemos usar un bucle 0'( L''P. *s la forma m$s corta "a queel cursor es implcitamente se ejecutan las instrucciones 'P*, 0*C1 "CL'S*.

    CO#variable I'nombreHcursor LOOP /- Procesamiento de los registros recuperados -/ %'0 LOOPD

    -%DI' CO#(*2 I'

  • 7/25/2019 MEGA GUIA DE PL SQL

    23/73

    1ambi;n debemos declarar los posibles parametros que requiera el cursor%

    $U#SO#nombre_cursor*aram+ tio+, ..., aramN tioN-IS in!truccin$SELEC)

    Para abrir el cursor

    OP%' nombre_cursor o bien

  • 7/25/2019 MEGA GUIA DE PL SQL

    24/73

    Podemos simplificar el ejemplo utiliando el atributo detipo 1#O3(2P%sobre el cursor.

    0%$LA#%$U#SO#cpaisesIS

    S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD

    registro cpaisesX#O3(2P%D

    -%DI' OP%'cpaisesD C%($cpaises I'(OregistroD $LOS%cpaisesD%'0D

    *l mismo ejemplo, pero utiliando par$metros%

    0%$LA#%$U#SO#cpaises

  • 7/25/2019 MEGA GUIA DE PL SQL

    25/73

    Atri!uto Antes de a!rir Al a!rir 0urante la recuperacinAl :inali>ar la recuperacin 0espuBs de cerrar

    1'O(COU'0 '()3BIIB &LL 0)LS* 1(&* '()3BIIB1COU'0 '()3BIIB &LL 1(&* 0)LS* '()3BIIB1ISOP%' 0)LS* 1(&* 1(&* 1(&* 0)LS*1#O3$OU'( '()3BIIB I - -- '()3BIIB

    - 6mero de registros que !a recuperado !asta el momento -- 6mero de total de registros

    ,anejo del cursor

    Por medio de ciclo L''P podemos iterar a trav;s del cursor. 8ebe tenerse cuidado de agregar una condicin para salir delbucle%

    5amos a ver varias formas de iterar a trav;s de un cursor. La primera es utiliando un bucle L''P con una sentencia *941condicionada%

    OP%'nombreHcursorD

    LOOP

    C%($nombreHcursor I'(OlistaHvariablesD %EI(3%'nombreHcursorX'O(COU'0D /- Procesamiento de los registros recuperados -/ %'0 LOOPD $LOS%nombreHcursorD

    )plicada a nuestro ejemplo anterior%

  • 7/25/2019 MEGA GUIA DE PL SQL

    26/73

    0%$LA#%$U#SO#cpaisesIS

    S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O, P)4S*SD

    coHpais )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    27/73

    'tra forma es por medio de un bucle 4L* L''P. La instruccin 0*C1aparece dos veces.

    OP%'nombreHcursorD

    C%($nombreHcursor I'(OlistaHvariablesD 3IL% nombreHcursorXCOU'0

    LOOP /- Procesamiento de los registros recuperados -/ C%($nombreHcursor I'(OlistaHvariablesD %'0 LOOPD $LOS%nombreHcursorD

    0%$LA#%$U#SO#cpaisesIS

    S%L%$(C'HP)4S, 8*SC(4PC4', C'14*1*C#O,P)4S*SD

    coHpais )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    28/73

    -%DI' CO#(*2 I'

  • 7/25/2019 MEGA GUIA DE PL SQL

    29/73

    %'0D

    Como "a !emos dic!o cuando ocurre un error, se ejecuta el

    bloque %E$%P(IO', transfiri;ndose el control a las sentencias del bloque. &nave finaliada la ejecucin del bloque de %E$%P(IO' no se contin6aejecutando el bloque anterior.

    Si e#iste un bloque de e#cepcin apropiado para el tipo de e#cepcin seejecuta dic!o bloque. Si no e#iste un bloque de control de e#cepcionesadecuado al tipo de e#cepcin se ejecutar$ el bloque de e#cepcin 3%'O(%#S (%'

  • 7/25/2019 MEGA GUIA DE PL SQL

    30/73

    A$$%SSHI'(OH'ULL*l programa intent asignar valoresa los atributos de un objeto noinicialiado

    3JFI

    $OLL%$(IO'HISH'ULL*l programa intent asignar valoresa una tabla anidada a6n no

    inicialiada

    3JFB

    $U#SO#HAL#%A02HOP%'

    *l programa intent abrir un cursorque "a se encontraba abierto.(ecuerde que un cursor de ciclo0'( autom$ticamente lo abre " ellono se debe especificar con lasentencia 'P*

    3JBB

    0UPH)ALHO'HI'0%E

    *l programa intent almacenarvalores duplicados en una columnaque se mantiene con restriccin deintegridad de un ndice 6nico

    P#OD#A,H%##O# PL/SQL tiene un problema interno 3JIB

    #O3(2P%H,IS,A($

    Los elementos de una asignacin

  • 7/25/2019 MEGA GUIA DE PL SQL

    31/73

    en una posicin m$s grande que eln6mero real de elementos de lacoleccin

    SU-S$#IP(HOU(SI0%HLI,I(

    *l programa est$ referenciando unelemento de un arreglo utiliando

    un n6mero fuera del rangopermitido

    S2SHI')ALI0H#O3I0

    La conversin de una cadena decaracteres !acia un tipo roid fallporque la cadena no representa unn6mero

    3BEBI

    (I,%OU(HO'H#%SOU#$%Se e#cedi el tiempo m$#imo deespera por un recurso en 'racle

    3JB

    (OOH,A'2H#O3S&na sentencia S*L*C1 41'

    devuelve m$s de una fila

    3BE>>

    )ALU%H%##O#

    'curri un error aritm;tico, deconversin o truncamiento. Porejemplo, sucede cuando se intentacalar un valor mu" grande dentrode una variable m$s pequea

    3JI>

    K%#OH0I)I0%*l programa intent efectuar unadivisin por cero

    3BEG

    %+cepciones de:inidas por el usuario

    PL/SQL permite al usuario definir sus propias e#cepciones, las que deber$nser declaradas " lanadas e#plcitamente utiliando la sentencia #AIS%.

    Las e#cepciones deben ser declaradas en el segmento 0%$LA#%de unbloque, subprograma o paquete. Se declara una e#cepcin como cualquier otravariable, asign$ndole el tipo %E$%P(IO'. Las mismas reglas de alcanceaplican tanto sobre variables como sobre las e#cepciones.

    0%$LA#%

    33 8eclaraciones :"*#cepcion %E$%P(IO'D-%DI' 33 *jecucion%E$%P(IO' 33 *#cepcion%'0D

    #eglas de Alcance

    &na e#cepcin es v$lida dentro de su $mbito de alcance, es decir el bloque oprograma donde !a sido declarada. Las e#cepciones predefinidas son siemprev$lidas.

  • 7/25/2019 MEGA GUIA DE PL SQL

    32/73

    Como las variables, una e#cepcin declarada en un bloque es local a esebloque " global a todos los sub3bloques que comprende.

    La sentencia #AIS%

    La sentencia #AIS%permite lanar una e#cepcin en forma e#plcita.*s posible utiliar esta sentencia en cualquier lugar que se encuentre dentrodel alcance de la e#cepcin.

    0%$LA#%33 8eclaramos una e#cepcion identificada por 5)L'(H*2)145'

    5)L'(H*2)145' %E$%P(IO'D

    valor 'U,-%#D-%DI' 33 *jecucion

    valor %M 3BD

    ICvalor O I(%'

    #AIS%5)L'(H*2)145'D

    %'0 ICG

    %E$%P(IO' 33 *#cepcion

    3%' )ALO#H'%DA(I)O(%'

    dbmsHoutput.putHline

  • 7/25/2019 MEGA GUIA DE PL SQL

    33/73

    )l manejar una e#cepcin es posible usar las funcionespredefinidas SQL$ode" SQL%##, para aclarar al usuario la situacin deerror acontecida.

    SQLcodedevuelve el n6mero del error de 'racle " un I

  • 7/25/2019 MEGA GUIA DE PL SQL

    34/73

    #AIS%HAPPLI$A(IO'H%##O#

    *n ocasiones queremos enviar un mensaje de error personaliado alproducirse una e#cepcin PL/SQL.Para ello es necesario utiliar la instruccion #AIS%HAPPLI$A(IO'H%##O# D

    La sinta#is general es la siguiente%

    #AIS%HAPPLI$A(IO'H%##O#IIIB " 3>IKKK. mensaje la descripcion del error.

    0%$LA#% vHdiv 'U,-%#D-%DI'

    S%L%$(B/I I'(OvHdiv C#O,8&)LD%E$%P(IO'

    3%'O(%#S(%' #AIS%HAPPLI$A(IO'H%##O#IIIB,Ro se puede dividir por ceroR=D%'0D

    Propagacin de e+cepciones en PL/SQL

    &na de las caractersticas m$s interesantes de la e#cepciones es lapropagacin de e#cepciones.

    Cuando se lana una e#cepcin, el control se transfiere !asta laseccin %E$%P(IO'del bloque donde se !a producido la e#cepcin. *ntoncesse busca un manejador v$lido de la e#cepcin

  • 7/25/2019 MEGA GUIA DE PL SQL

    35/73

    CU'$(IO'fnHfec!a #%(U#'0A(% IS fec!a 0A(%D -%DI' S%L%$(S2S0A(%I'(Ofec!a

    C#O,8&)L 3%#%BM>D #%(U#'fec!aD %E$%P(IO'

    3%'K%#OH0I)I0%(%'dbmsHoutput.putHline

  • 7/25/2019 MEGA GUIA DE PL SQL

    36/73

    Procedimientos almacenados

    &n procedimiento es un subprograma que ejecuta una accin especfica "que no devuelve ning6n valor. &n procedimiento tiene un nombre, un conjuntode par$metros

  • 7/25/2019 MEGA GUIA DE PL SQL

    37/73

    1ambi;n podemos asignar un valor por defecto a los par$metros, utiliandola cl$usula 0%CAUL( o el operador de asignacin aHSaldoIIJIB,neHsaldo M >JII=D

    $O,,I(G

    %'0D

  • 7/25/2019 MEGA GUIA DE PL SQL

    38/73

    Cunciones en PL/SQL

    &na funcin es un subprograma que devuelve un valor.

    La sinta#is para construir funciones es la siguiente%

    $#%A(% @'( #%PLA$%CU'$(IO'#n$name%0

  • 7/25/2019 MEGA GUIA DE PL SQL

    39/73

    &na ve creada " compilada la funcin podemos ejecutarla de la siguienteforma%

    0%$LA#%

    5alor 'U,-%#D-%DI'

    5alor %M:nHO!tenerHPrecio, ..., col @'(0%L%(%FI'S%#(FUP0A(% @OC colB, col>, ..., col...O' #nombre$tabla%@CO# %A$ #O3 @3%' 7

  • 7/25/2019 MEGA GUIA DE PL SQL

    40/73

    *l uso de '( (*PL)C* permite sobrescribir un trigger e#istente. Si seomite, " el trigger e#iste, se producir$, un error.

    Los triggers pueden definirse para las operaciones 4S*(1, &P8)1* o8*L*1*, " pueden ejecutarse antes o despu;s de la operacin. *l

    modificador ?*0'(* )01*( indica que el trigger se ejecutar$ antes o despu;sde ejecutarse la sentencia SQL definida por 8*L*1* 4S*(1 &P8)1*. Siincluimos el modificador '0 el trigger solo se ejecutar$ cuando la sentenciaSQL afecte a los campos incluidos en la lista.

    *l alcance de los disparadores puede ser la fila o de orden. *l modificador0'( *)C (' indica que el trigger se disparar$ cada ve que se realianoperaciones sobre una fila de la tabla. Si se acompaa del modificador *,se establece una restriccinD el trigger solo actuar$, sobre las filas quesatisfagan la restriccin.

    La siguiente tabla resume los contenidos anteriores.

    )alor 0escripcinI'S%#( 0%L%(% UP0A(%

    8efine qu; tipo de orden 8:L provoca la activacin deldisparador.

    -%CO#% AC(%#8efine si el disparador se activa antes o despu;s deque se ejecute la orden.

    CO# %A$ #O3

    Los disparadores con nivel de fila se activan una vepor cada fila afectada por la orden que provoc eldisparo. Los disparadores con nivel de orden seactivan slo una ve, antes o despu;s de la orden. Losdisparadores con nivel de fila se identifican por lacl$usula 0'( *)C (' en la definicin del

    disparador.

    La cl$usula * slo es v$lida para los disparadores con nivel de fila.

    8entro del $mbito de un trigger disponemos de las variables 'L8 "* . *stas variables se utilian del mismo modo que cualquier otra variablePL/SQL, con la salvedad de que no es necesario declararlas,son detipo1#O3(2P% " contienen una copia del registro antes

  • 7/25/2019 MEGA GUIA DE PL SQL

    41/73

    *l siguiente ejemplo muestra un trigger que inserta un registro en la tablaP(*C4'SHP('8&C1'S cada ve que insertamos un nuevo registro en latabla P('8&1'S%

    $#%A(% O# #%PLA$% (#IDD%#1(HP('8&C1'SHIB AC(%# I'S%#( O'P('8&C1'S

    CO# %A$ #O30%$LA#% 33 local variables-%DI' I'S%#( I'(OP(*C4'SHP('8&C1'S

  • 7/25/2019 MEGA GUIA DE PL SQL

    42/73

    #estricciones de los triggers

    *l cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legalen un bloque PL/SQL, es legal en el cuerpo de un disparador, con lassiguientes restricciones%

    &n disparador no puede emitir ninguna orden de control detransacciones% $O,,I(, #OLL-A$o SA)%POI'(. *l disparador seactiva como parte de la ejecucin de la orden que provoc el disparo, "forma parte de la misma transaccin que dic!a orden. Cuando la ordenque provoca el disparo es confirmada o cancelada, se confirma ocancela tambi;n el trabajo realiado por el disparador.

    Por raones id;nticas, ning6n procedimiento o funcin llamado por eldisparador puede emitir rdenes de control de transacciones.

    *l cuerpo del disparador no puede contener ninguna declaracin devariables L'2 o L'2 ().

    Utili>acin de 9OL0 9'%3

    8entro del $mbito de un trigger disponemos de las variables 'L8 "* . *stas variables se utilian del mismo modo que cualquier otra variable

    PL/SQL, con la salvedad de que no es necesario declararlas,son detipo1#O3(2P% " contienen una copia del registro antes

  • 7/25/2019 MEGA GUIA DE PL SQL

    43/73

    Utili>acin de predicados de los triggers9 I'S%#(I'D UP0A(I'D 0%L%(I'D

    8entro de un disparador en el que se disparan distintos tipos de rdenes8:L D returnresultD %'0fnHmultiplicaH#>D-%DI' CO#id# I'B..BI LOOP

    dbmsHoutput.putHline

  • 7/25/2019 MEGA GUIA DE PL SQL

    44/73

    %'0 LOOPD%'0D

    otese que se utilia la funcion 1'HC)( para convertir el resultado de lafuncin fnHmultiplicaH#>

  • 7/25/2019 MEGA GUIA DE PL SQL

    45/73

    %'0O2gNameD

    *l cuerpo el la implementacin del paquete. *l cuerpo del paquete debeimplementar lo que se declar inicialmente en la especificacin. *s el donde

    debemos escribir el cdigo de los subprogramas. *n el cuerpo de un pac`agepodemos declarar nuevos subprogramas " tipos, pero estos ser$n privadospara el propio pac`age.

    La sinta#is general para crear el cuerpo de un paquete es mu" parecida a lade la especificacin, tan solo se aade la palabra clave -O02, " s eimplementa el cdigo de los subprogramas.

    $#%A(%@'( #%PLA$%A PA$AD% -O02O2gNameIS

    33 8eclaraciones de tipos " registros privados

    ^@(2P%O)(eName ISO3atat(eDA_

    33 8eclaraciones de variables " constantes privadas 33 1ambi;n podemos declarar cursores ^@OCon!tantName $O'S(A'(O3atat(e %M OvalorDA_

    ^@O4ariableName O3atat(eDA_ 33 4mplementacion de procedimientos " funciones

    CU'$(IO'OFunctionName

  • 7/25/2019 MEGA GUIA DE PL SQL

    46/73

    $#%A(% O# #%PLA$% PA$AD%PDH$O'(A-ILI0A0IS

    33 8eclaraciones de tipos " registros p6blicas

    (2P%CuentaHcontable IS #%$O#0 < codigoHcuenta )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    47/73

    -%DI' OP%'c8atos

  • 7/25/2019 MEGA GUIA DE PL SQL

    48/73

    =D

    *l siguiente ejemplo crea un tipo P)4S, que tiene como campos el cdigo, elnombre " el continente.

    (2P%P)4S IS #%$O#0JFI BI >III B>FEJG+KIRD cta8estino %M R>JF> BI >IBI IK+GJEF>BRD UP0A(%C&*1)S S%(S)L8' M S)L8' 3 importe 3%#%C&*1) M cta'rigenD UP0A(%C&*1)S S%(S)L8' M S)L8' N importe 3%#%C&*1) M cta8estinoD I'S%#(I'(O:'54:4*1'S

  • 7/25/2019 MEGA GUIA DE PL SQL

    60/73

    PL/SQL permite marcar un bloque con P#AD,AAU(O'O,OUSH(#A'SA$(IO' . Con esta directiva marcamos elsubprograma para que se comporte como transaccin diferente a la delproceso principal, llevando el control de $O,,I(o #OLL-A$independiente.

    'bs;rvese el siguiente ejemplo. Primero creamos un procedimiento " lomarcamos con P#AD,A AU(O'O,OUSH(#A'SA$(IO'.

    $#%A(% O# #%PLA$% P#O$%0U#%2rabarHLog

  • 7/25/2019 MEGA GUIA DE PL SQL

    61/73

    SQL 0in6mico

    Sentencias 0,L con SQL din6mico

    PL/SQL ofrece la posibilidad de ejecutar sentencias SQL a partir de cadenas

    de caracteres. Para ello debemos emplear la instruccin %E%$U(%I,,%0IA(%.

    Podemos obtener informacin acerca de n6mero de filas afectadas por lainstruccin ejecutada por %E%EU(% I,,%0IA(% utiliando SQL1#O3$OU'(.

    *l siguiente ejemplo muestra la ejecucin de un comando SQL din$mico.

    0%$LA#% ret 'U,-%#D CU'$(IO'fnHe#ecute #%(U#' 'U,-%# IS sqlHstr )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    62/73

    %E%$U(% I,,%0IA(%sqlHstr USI'Dnombre, codigoD#%(U#' SQL1#O3$OU'(D

    %'0fnHe#ecute D-%DI' ret %M fnHe#ecute

  • 7/25/2019 MEGA GUIA DE PL SQL

    63/73

    Las varibles !ost tambi;n se pueden utiliar en los cursores.

    0%$LA#% (2P%curHt"p IS #%C $U#SO#D

    cHcursor $U#H(2PD fila P)4S*S1#O3(2P%D vHquer" )A#$A#JJ=D codigoHpais )A#$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    64/73

    ')L

  • 7/25/2019 MEGA GUIA DE PL SQL

    65/73

    S%L%$( (OH0A(%/>IIR, R88/::/UUUUR=C#O,8&)LD

    *ste otro ejemplo muestra la conversin con formato de da " !ora.

    S%L%$( (OH0A(%/>II >F%JK%JKR, R88/::/UUUU >E%:4%SSR=C#O,8&)LD

    (OH$A#

    Convierte una e#presin al tipo C)(. *l par$metro opcional formato indicael formato de salida de la e#presin.

    (OH$A#

  • 7/25/2019 MEGA GUIA DE PL SQL

    66/73

    Si el par$metro es un n6mero devuelve la parte entera.

    S%L%$((#U'$

  • 7/25/2019 MEGA GUIA DE PL SQL

    67/73

    'btiene una parte de una e#presin, desde una posicin de inicio !asta unadeterminada longitud.

    SU-S(#

  • 7/25/2019 MEGA GUIA DE PL SQL

    68/73

    S%L%$(#PA0

  • 7/25/2019 MEGA GUIA DE PL SQL

    69/73

    ,O0I/BJC#O, 8&)L

    Secuencias

    '()CL* proporciona los objetos de secuencia para la generacin decdigos num;ricos autom$ticos.

    Las secuencias son una solucin f$cil " elegante al problema de los cdigosautogenerados.

    L) sinta#is general es la siguiente%

    $#%A(% S%QU%'$%#!ecuence$name%@,I')ALU%Omin$valA@,AE)ALU%#max$val%1@S(A#( 3I(#ini$val%1@I'$#%,%'( -2#inc$val%1@'O$A$% $A$%#cache$val%1@$2$L%A

    @O#0%#AD

    *l siguiente ejemplo crea una secuencia S=$5>83?C)8S.

    $#%A(% S%QU%'$%SQHP('8&C1'S,I')ALU%B,AE)ALU%KKKKKKKKKKKKKKKKKKKKKKKKKKKS(A#( 3I(BI'$#%,%'( -2B

    $A$%>ID

    Se puede simplificar la orden, tomando los valores por defecto. *l ejemploanterior quedara del siguiente modo%

    $#%A(% S%QU%'$%SQHP('8&C1'SD

    Para obtener el siguiente valor de una secuencia debemos utiliar lafuncin '%E()AL. '%E()ALse puede utiliar el cualquier sentencia

    SQL 0,L

  • 7/25/2019 MEGA GUIA DE PL SQL

    70/73

    S%L%$( SQHP('8&C1'S.'%E()ALC#O, 8&)LD

    Podemos obtener el 6ltimo valor generado por la secuencia con lafuncin $U##)AL. Para poder ejecutar la funcin C&((5)L debemos !aberejecutado previamente la funcin '%E()AL.

    S%L%$(SQHP('8&C1'S.$U##)ALC#O, 8&)LD

    Para eliminar una secuencia definitivamente de la base de datos debemosutiliar la sentencia 0#OP.

    0#OP S%QU%'$%SQHP('8&C1'S D

    PL/SQL Rava

    'tra de la virtudes de PL/SQL es que permite trabajar conjuntamente con7ava.

    PL/SQL es un e#celente lenguaje para la gestin de informacin pero enocasiones, podemos necesitar de un lenguaje de programacin m$s potente.Por ejemplo podramos necesitar consumir un servicio eb, conectar a otroservidor, trabajar con Soc`ets para estos casos podemos trabajarconjuntamente con PL/SQL " 7ava.

    Para poder trabajar con 7ava " PL/SQL debemos realiar los siguientespasos%

    Crear el programa 7ava " cargarlo en la base de datos. Crear un programa de recubrimiento

  • 7/25/2019 MEGA GUIA DE PL SQL

    71/73

    Para crear objetos 7ava en la base de datos podemos utiliar la uitlidadLoad7ava de O#A$L%desde lnea de comandos o bien crear objetos RA)ASOU#$%en la propia base de datos.

    La sinta#is para la creacin de RA)A SOU#$%en O#A$L%es la siguiente.

    $#%A(% @O##%PLA$%A'0 $O,PIL%RA)A SOU#$%'A,%0O@avaSourceNameASpublic class Ocla!!Name^

    #Aava code%...

    _D

    *l siguiente ejemplo crea " compila una clase 7ava 'racle7avaClass en elinterior de RA)A SOU#$%0uentes7ava. Un aspecto mu a tener en cuentaes "ue los mBtodos de la clase java "ue "ueramos invocar desde PL/SQLde!en ser estaticos.

    $#%A(%O# #%PLA$% A'0 $O,PIL%RA)A SOU#$%'A,%00uentes7avaASpublicclassOracleRava$lass^ publicstaticStringSaluda

  • 7/25/2019 MEGA GUIA DE PL SQL

    72/73

    return

  • 7/25/2019 MEGA GUIA DE PL SQL

    73/73

    ASLA'DUAD% RA)A 'A,%R'racle7avaClass.Saluda