Вы находитесь на странице: 1из 17

PL/SQL

GENERACION DE OUTPUT DESDE PROGRAMAS PL/SQL

DBMS_OUTPUT
El package DBMS_OUTPUT provee mecanismos para desplegar informacin desde un programa PL/S L so!re la pan"alla# Puede$ por lo mismo$ proveer de modos al"erna"ivos de depuracin de programas PL/S L$ %ue sean e&ecu"ados en am!ien"es S L'Plus#

La siguiente tabla muestra los PROCEDURES del paquete DBMS_OUTPUT

Procedure DISABLE ENABLE GET_LINE NE-_LINE PUT PUT_LINE

Descripci ! Des"#i$i%" $" s"$id"& N"d" se 'ue$c" so#re $" p"!%"$$" ("#i$i%" s"$id" de$ p")ue%e To*" u!" $+!e" de$ Bu,,er To*" u! !.*ero de $+!e"s de$ Bu,,er / $"s p"s" " u!" %"#$" PL/SQL Co$oc" i!,o e! e$ Bu,,er Co$oc" i!,or*"ci ! de!%ro de$ Bu,,er / "dicio!" u! E!d0o,0Li!e&

(ada usuario %ue invoca el pa%ue"e DBMS_OUTPUT "iene acceso al !uffer de es"e package %ue alcan)a *as"a +,---$--- !."es de "ama/o# Usando el pa%ue"e DBMS_OUTPUT se puede accesar al !uffer$ escri!ir a 0l . leer del mismo# Es"e !uffer es capa) de almacenar "res "ipos de da"os1 234(5346$ 7UMBE4 . D3TE 8en sus represen"aciones in"ernas9# 7o"e %ue no sopor"a el "ipo BOOLE37#

Roberto Mercado S.

Pag 1

PL/SQL

El siguien"e !lo%ue annimo u"ili)a DBMS_OUTPUT para desplegar el nom!re . salario de cada empleado en el el depar"amen"o +-# DECLARE CURSOR emp_ ur !S SELECT ename" sal #ROM emp $%ERE deptno & '( ORDER B) sal DESC * BE+!, #OR emp_re !, emp_ ur LOOP DBMS_OUTPUT-PUT_L!,E ./ El Empleado /00emp_re -ename001 gana /00 TO_C%AR.emp_re -sal200 / dolares12 * E,D LOOP* E,D * 3 3l e&ecu"arse se genera la siguien"e salida1 El Empleado 4!,+ gana 5((( dolaresEl Empleado SCOTT gana 6((( dolaresEl Empleado 7O,ES gana 85(( dolaresEl Empleaso ADAMS gana 8(( dolares -------------------------------------------------------------------

El pa%ue"e DBMS_OUTPUT no con"iene sus propias e:cepciones declaradas# Pero e:is"en dos ;Oracle Error 7um!ers en el rango <6-7771 < 6---- O4U<+--6=1 Buffer Overflo>$ ####### De!e incremen"ar el "ama/o de su !uffer# <6---- O4U<+--6?1 Line leng"* Overflo>$ ###### De!e res"ringir la can"idad de da"a %ue es"@ pasando al !uffer en la llamada al PUT_LA7E Procedure#

Roberto Mercado S.

Pag 2

PL/SQL

PodrBa "am!i0n reci!ir el error 1 O43<-CD-61 7umeric or 2alue Error Seguramen"e "ra"o de pasar m@s de 6DD !."es de da"a en el PUT_LA7E procedure#

Des'e!%"1"s de$ DBMS_OUTPUT& +# Slo sopor"a los "res "ipos !@sicos de Da"aT.pes# 7o puede desplegar BOOLE37s o com!inaciones de Da"aT.pes# De!er@ efec"uar manualmen"e las conversiones . las conca"enaciones# 6# Slo ver@ la ;salida, al final de la e&ecucin de su programa# 7o puede e:aminar el !uffer mien"r@s su programa se es"@ e&ecu"ando# E# 7o puede mane&ar cadenas ma.ores a 6DD !."es# F# 7o es la me&or opcin para generar repor"es de!ido a lo pe%ue/o de su !uffer 8+,---$--- !."es9# D# Si u"ili)a DBMS_OUTPUT en el am!ien"e S L'Plus ver@ %ue los ;!lancos, al inicio de la cadena se "runcan# Los in"en"os por desplegar !lancos o 7ULLs son ignorados# Por supues"o e:is"en ;Gork3rounds, para es"as desven"a&as#

Roberto Mercado S.

Pag 3

PL/SQL

E$ procedure ENABLE& Es"e procedure *a!ili"a la posi!ilidad de llamar a los o"ros mdulos# De!e ser invocado con an"erioridad# En el se declara el "ama/o del !uffer %ue con"endr@ la informacin para los Procedures PUT . PUT_LA7E# Puede ser llamado varias veces en la misma seccin PL/S L# Su sin"@:is es 1 DBMS_OUTPUT#E73BLE 8+-----9H Es e%uivalen"e al comando S L1 S LI SET SE42E4OUTPUT O7 SAJE +----- H E$ procedure DISABLE& Es"e procedure des!ili"a cual%uier invocacin al pa%ue"e DBMS_OUTPUT# Tam!ien ;purga, el !uffer# Su sin"@:is es 1 DBMS_OUTPUT#DAS3BLEH Es e%uivalen"e al comando S L1 S LI SET SE42E4OUTPUT OKK H

Roberto Mercado S.

Pag 4

PL/SQL

E$ procedure PUT Use una llamada a es"e procedure si desea colocar informacin den"ro del Buffer 8usualmen"e median"e mas de una llamada a PUT9# 3cep"a cual%uier da"a".pe# Procedure DBMS_OUTPUT#PUT 8;(oloca es"a lBnea en el !uffer,9H

E$ procedure PUT_LINE Es"e procedure es uno de los mas usados para depurar programas PL/S LH coloca informacin en el !uffer . . le a/ade un 7e>Line c*arac"er# Su sin"@:is es similar a la del PUT procedure# Procedure DBMS_OUTPUT#PUT_LA7E 8;(oloca es"a lBnea . la vuelca,9H como en el siguien"e e&emplo1 SQL 2 e3ec d#*s_ou%pu%&pu% 4Es%o/ escri#ie!do5 6 SQL 2 e3ec d#*s_ou%pu%&pu% 4 U!" Ru%i!" 5 6 SQL 2 e3ec d#*s_ou%pu%&pu%_$i!e 4 e! PL/SQL 5 6 SQL 2 Es%o/ escri#ie!do U!" Ru%i!" e! PL/SQL

E$ procedure GET_LINE / GET_LINES LET_LA7E cap"ura una linea de da"a del !uffer# Su especificacin es como sigue1 PROCEDURE DBMS_OUTPUT-+ET_L!,E .line OUT 9ar :ar8" status OUT !,TE+ER2 * donde line es el "e:"o a recuperarH . status es el es"ado del ;ge" re%ues",# 4ecuerde %ue la longi"ud m@:ima del "e:"o es de 6DD !."es#

Roberto Mercado S.

Pag 5

PL/SQL

LET_LA7ES cap"ura mMl"iples lBneas del !uffer con una sola llamada# Lee el !uffer en una varia!le "ipo "a!la del PL/S L# PROCEDURE DBMS_OUTPUT-+ET_L!,ES .lines OUT DBMS_OUTPUT-C%ARARR" numlines !, OUT !,TE+ER2* Donde lines es el arreglo PL/S L 8colleccin9 donde se colocan las lBneas cap"uradasH . numlines es el nMmero de lBneas individuales cap"uradas desde el !uffer$ . colocadas en el arreglo# 4ecuerde %ue aun%ue am!os$ PUT . PUT_LA7ES permi"en colocar informacin en el !uffer en su represen"acin original 8Da"aT.pes9$ LET_LA7ES la recupera en forma"o 234(5346# 3 con"inuacin podremos o!servar un e&emplo %ue *ace uso del procedure LET_LA7ES . la manera en como se llena la "a!la PL/S L1 DECLARE 3; Tabla<arreglo a llenar ;3 output_table DBMS_OUTPUT-C%ARARR* a_line =ARC%AR8.'(2 >& RPAD.?;?"'("?;?2* status !,TE+ER* ma@_lines CO,STA,T ,UMBER >& '5* BE+!, output_table .(2 >& ?ABC?* output_table .'82 >& ?DE#?* 3; Muestra '( lAneas ;3 #OR linenum !, '--'( LOOP DBMS_OUTPUT-PUT_L!,E .a_line 00 TO_C%AR .linenum2* E,D LOOP* 3; aptura '5 lAneas" status re ibe el onteo de lAneas ;3 status >& ma@_lines* DBMS_OUTPUT-+ET_L!,ES . output_table" status2* DBMS_OUTPUT-PUT_L!,E .?lines retrie9ed& ? 00 status22*

Roberto Mercado S.

Pag 6

PL/SQL

#OR linenum in (--ma@_lines LOOP BE+!, DBMS_OUTPUT-PUT_L!,E .linenum 00 ?>? 00 ,=L .output_table.linenum2"?BnullC?2 2* EDCEPT!O, $%E, OT%ERS T%E, DBMS_OUTPUT-PUT_L!,E .linenum 00 ?>? 00 sqlerrm 2* E,D* E,D LOOP* EDCEPT!O, $%E, OT%ERS T%E, DBMS_OUTPUT-PUT_L!,E .?E@ eption" status&? 00 status2* DBMS_OUTPUT-PUT_L!,E .SELERRM 2* E,D*
/

La salida de es"e procedure es como se ve a con"inuacin1 lines re"rievedN +-1O43<-+F-E1 no da"a found +1''''''''''+ 61''''''''''6 E1''''''''''E F1''''''''''F D1''''''''''D C1''''''''''C =1''''''''''= ?1''''''''''? O1''''''''''O +-1''''''''''+++1PnullI +61O43<-+F-E1 no da"a found +E1O43<-+F-E1 no da"a found +F1O43<-+F-E1 no da"a found +D1O43<-+F-E1 no da"a found

Roberto Mercado S.

Pag 7

PL/SQL

De la visuali)acin de es"e ;ou"pu", en"onces$ deducimos lo siguien"e1


La "a!la<arra. PL/S L se llena empe)ando con la fila +# Si el procedure LET_LA7ES encuen"ra 7 lBneas de da"a para pasar a la "a!la PL/S L$ define la fila 7Q+ en la "a!la como 7ULL# Todas las o"ras filas en la "a!la PL/S L %uedan como ;undefined,# En o"ras pala!ras cual%uier o"ra fila %ue pueda *a!er sido definida an"es de la llamada a LET_LA7ES es !orrada#

Roberto Mercado S.

Pag 8

PL/SQL

UTL_7ILE
LECTURA 8 ESCRITURA DE ARC(I9OS EN EL LADO SER9IDOR

Es"e pa%ue"e se crea duran"e la ins"alacin . creacin de la !ase de da"os$ median"e el scrip" ;u"lfile#s%l,$ el cual es a su ve) invocado desde el scrip" ;ca"proc#s%l,# En a%uel se crea el sinnimo UTL_KALE para el pa%ue"e . se le o"orga privilegios de e&ecucin a PUBLA(# El mane&o de arc*ivos es muc*o mas amplio . fle:i!le %ue con el package DBMS_OUTPUT#
La tabla muestra los pro edures que lo omponen F sus des rip iones-

Procedure 7CLOSE 7CLOSE_ALL 77LUS( 7OPEN GET_LINE IS_OPEN NE-_LINE PUT PUT_LINE PUT7

Descripci ! Cierr" $os "rc;i'os especi,ic"dos Cierr" %odos $os "rc;i'os E$i*i!" %od" $" d"%" de$ #u,,er UTL_7ILE A#re e$ ,i$e especi,ic"do To*" $" si:uie!%e $+!e" de$ Arc;i'o Re%or!" TRUE si e$ "rc;i'o 8A es%< "#ier%o I!ser%" u!" Ne=_$i!e "$ ,i!"$ de $" $+!e" "c%u"$ Co$oc" %e3%o e! e$ #u,,er Co$oc" u!" $+!e" e! e$ Arc;i'o Co$oc" %e3%o co! ,or*"%o e! e$ #u,,er

A$:u!"s co!sider"cio!es especi"$es 3n"es de empe)ar a usar es"e package 8asB como o"ros Buil"<An Packages es preciso efec"uar una serie de configuraciones . definiciones# 4ecuerde %ue se va a in"erac"uar con el Sis"ema Opera"ivo . no podrBa *acerse uso de arc*ivos . direc"orios mu. indiscriminadamen"e# 3lguien podrBa "ra"ar de escri!ir so!re arc*ivos de la !ase de da"os o so!re arc*ivos del sis"ema# Es por eso %ue la seguridad es un componen"e crB"ico#

Roberto Mercado S.

Pag 9

PL/SQL

Por e&emplo$ la invocacin del UTL_KALE package podrBa re"ornar1 DECLARE onGig_Gile UTL_#!LE-#!LE_T)PE* BE+!, onGig_Gile >& UTL_#!LE-#OPE, .?3tmp?" ?neHdata-t@t?" ?$?2* --- es ribimos F pro esamos----- no :aF una /E@ eption Se tion1 --E,D* 3 Lo mas pro!a!le es %ue solo alcance Ud# a ver1 DECLARE ; ERROR at line '> ORA<(I5'(> PL3SEL> un:andled user<deGined e@ eption ORA<(I5'8> at JS)S-UTL_#!LEJ" line K' ORA<(I5'8> at JS)S-UTL_#!LEJ" line 'LI ORA<(I5'8> at line L

Procedi*ie!%o de Mo!%"1e pre'io 3 fin de man"ener la seguridad$ "odos los direc"orios donde se podrBa even"ualmen"e escri!ir o desde se podrBa leer$ de!en ser e:plici"amen"e declarados en el ini"#oraH "ales direc"orios de!en "ener los permisos necesarios para %ue el due/o de la ins"ancia Oracle pueda escri!ir . leer# M :mod NN5 .nombre_del_dire torio2

3/ada el par@me"ro UTL_KALE_DA4 a su ini"#ora fileH si son varios direc"orios es"os pueden ser separados por comas1 -------utl_Gile_dir & 3:ome3output" 3tmp" 3:ome3rmer ado --------8Si u"ili)a ;comodines, O43(LE los in"erpre"ar@ como los in"erpre"a el sis"ema opera"ivo# Tenga cuidado9

Roberto Mercado S.

Pag 10

PL/SQL

EJEMPLO Para el e&emplo %ue sigue usaremos los o!&e"os 1 Una "a!la ;TESTT3B, 7ame <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< (+ (6 7ullR <<<<<<<< T.pe <<<< 7UMBE4 7UMBE4

ue con"ienen la siguien"e da"a1 (+ (6 <<<<<<<<<< <<<<<<<<<< +6D 6D-

(4E3TE O4 4EPL3(E P4O(EDU4E "es"+ AS file_*andle UTL_KALE#KALE_TSPEH << Kile<5andle del 3rc*ivo col+ 7UMBE4H << (+ re"rieved from "es""a! "a!le re"rieved_!uffer 234(53468+--9H << Linea cap"urada del arc*ivo plano BELA7 << 3!re el arc*ivo . asigna el Kile<5andle# file_*andle 1N UTL_KALE#KOPE78T/u-D/*ome/ou"pu"/m.dirT$Tm.file#":"T$TGT9H << Anser"a una lBnea de "e:"o en el 3rc*ivo# UTL_KALE#PUT_LA7E8file_*andle$ ;es"a es una prue!a,9H << Selecciona c+ en "es""a! para el empno N =O--# SELE(T c+ A7TO col+ K4OM "es""a! G5E4E c6 N 6DH << Usando PUTK inser"a "e:"o con el argumen"o (+ al arc*ivo# UTL_KALE#PUTK 8file_*andle$ TEs"e es el c+ Us (uendo el (6 es Us#VnT$ col+$T6DT9H << (ierra el 3rc*ivo UTL_KALE#K(LOSE8file_*andle9H << 3!re el mismo arc*ivo para leer de 0l# file_*andle 1N UTL_KALE#KOPE78T/u-D/*ome/ou"pu"/m.dirT$Tm.file#":"T$T4T9H << Lee una linea del arc*ivo# UTL_KALE#LET_LA7E 8file_*andle$ re"rieved_!uffer9H << Amprime la lBnea cap"urada al am!ien"e S L'Plus# DBMS_OUTPUT#PUT_LA7E8re"rieved_!uffer9H

Roberto Mercado S.

Pag 11

PL/SQL

<< (ierra el arc*ivo UTL_KALE#K(LOSE8file_*andle9H EW(EPTAO7 G5E7 7O_D3T3_KOU7D T5E7 DBMS_OUTPUT#PUT_LA7E8Tno_da"a_foundT9H UTL_KALE#K(LOSE8file_*andle9H G5E7 UTL_KALE#A723LAD_P3T5 T5E7 DBMS_OUTPUT#PUT_LA7E8TUTL_KALE#A723LAD_P3T5T9H UTL_KALE#K(LOSE8file_*andle9H G5E7 UTL_KALE#4E3D_E44O4 T5E7 DBMS_OUTPUT#PUT_LA7E8T UTL_KALE#4E3D_E44O4T9H UTL_KALE#K(LOSE8file_*andle9H G5E7 UTL_KALE#G4ATE_E44O4 T5E7 DBMS_OUTPUT#PUT_LA7E8TUTL_KALE#G4ATE_E44O4T9H UTL_KALE#K(LOSE8file_*andle9H G5E7 OT5E4S T5E7 DBMS_OUTPUT#PUT_LA7E8To"*er s"uffT9H UTL_KALE#K(LOSE8file_*andle9H E7DH / (ompile o Encapsule su procedure en un pa%ue"e . e&ecu"elo# Las especificaciones para declarar sus direc"orios en el ini"#ora son1 u"l_file_dir N /"emp u"l_file_dir N /rmercado/ru"inas/demo u"l_file_dir N (1VcursoVdemo u"l_file_dir N 51VmisfilesVrmercadoVpls%l

Roberto Mercado S.

Pag 12

PL/SQL

Excepciones UTL_FILE En la par"e del SPE( del pa%ue"e UTL_KALE se definen sie"e e:cepciones# 3un%ue las causas pueden ser variadas . los nom!res au"oe:plica"ivos$ O43(LE provee algunas e:plicaciones al respec"o1 +# A723LAD P3T5 1 Locali)acin del arc*ivo es invalida# no es"@ lis"ado en el par@me"ro u"l_file_dir# ui)as el direc"orio

6# A723LAD_MODE 1 El modo de aper"ura de!e ser ;3,$ ;4,$ o ;G,# E# A723LAD_KALE537DLE 1 De!e invocar el procedure KOPE7 para o!"ener un file<*andle v@lido# F# A723LAD_OPE43TAO7 1 Por e&emplo si "ra"a de escri!ir a un arc*ivo ;4ead< Onl.,# (asi siempre es cues"in de permisos so!re un arc*ivo# D# 4E3D_E44O4 1 Leneralmen"e es"o es produc"o de o"ro error del Sis"# Opera"ivo# C# G4ATE_E44O4 1 Adem al an"erior# =# A7TE473L_E44O4 1 Dice el Manual %ue de!e con"ac"ar ;O43(LE SUPPO4T, en Orlando$ Klorida# 3par"e de es"os errores$ el UTL_KALE puede producir o"ros "ipos de e:cepciones1 ?# 7O_D3T3_KOU7D O# 23LUE_E44O4 +-# A723LAD_M3WLA7ESAJE

Roberto Mercado S.

Pag 13

PL/SQL

Co!sider"cio!es p"r" e$ uso de$ UTL_7ILE (uando a!re un arc*ivo con UTL_KALE de!e declarar un ;file<*andle, para su uso en el programa# Es"e elemen"o de!e ser declarado$ pero *a sido definido como sigue1 TSPE UTL_KALE#KALE_TSPE AS 4E(O4D 8id BA734S_A7TELE49 H Sin"@:is1 DECLARE #ile_%andle(' UTL_#!LE-#!LE_T)PE * BE+!, ----------

Uso, declaracin e inicializacin de los packages Mos"raremos los procedures m@s M"iles . pr@c"icos de es"e pa%ue"e con un declaracin para cada caso$ en donde se o!serva la sin"@:is$ par@me"ros . da"a".pes#

P4O(EDU4E UTL_KALE#LET_LA7E 8file A7 UTL_KALE#KALE_TSPE$ !uffer OUT 234(53469H P4O(EDU4E UTL_KALE#PUT 8file A7 UTL_KALE#KALE_TSPE$ !uffer OUT 234(53469H P4O(EDU4E UTL_7EG_LA7E 8file A7 UTL_KALE#KALE_TSPE$ lines OUT 234(53469H

Roberto Mercado S.

Pag 14

PL/SQL

P4O(EDU4E UTL_PUT_LA7E 8file A7 UTL_KALE#KALE_TSPE$ !uffer A7 234(53469H P4O(EDU4E UTL_KALE#K(LOSE 8file A7 OUT KALE_TSPE 9H

E>EMPLO Usualmen"e se escri!e un procedure %ue efec"ue la accin %ue deseamos . se le encapsula en un Package#

CREATE OR REPLACE PAC4A+E miutl is PROCEDURE emp8Gile* End* / CREATE OR REPLACE PAC4A+E BOD) miutl is PROCEDURE emp8Gile !S Gile!D UTL_#!LE-#!LE_T)PE * BE+!, Gile!D >& UTL_#!LE-#OPE,.?3tmp?" ?emp-t@t?" ?$?2 * #OR emp_reg !, .SELECT ; #ROM EMP2 LOOP UTL_#!LE-PUT_L!,E.Gile!D" emp_reg-empno00 ?"?00emp_reg-ename00?"? 00emp_reg-sal2* E,D LOOP* UTL_#!LE-#CLOSE.Gile!D2 * E,D* end* 3

Roberto Mercado S.

Pag 15

PL/SQL

3*ora puede compilar el package . e&ecu"arlo1 S LI e:ec miu"l#emp6file H

Luego de!e ver el resul"ado de su operacin$ desde el sis"ema opera"ivo# X cd / "mp X ca" emp#":" =ECO$SMAT5$?-=FOO$3LLE7$+C-=D6+$G34D$+6D=DCC$YO7ES$6O=D =CDF$M34TA7$+6D=CO?$BL3ZE$6?D==?6$(L34Z$6FD==??$S(OTT$E--=?EO$ZA7L$D--=?FF$TU47E4$+D-=?=C$3D3MS$++-=O--$Y3MES$OD=O-6$KO4D$E--=OEF$MALLE4$+E--

Roberto Mercado S.

Pag 16

PL/SQL

(omo corolario a es"e "ema$ agregaremos %ue es !@sico %ue Ud# mane&e "odas las e:cepciones posi!les desde su procedure$ como en es"e e&emplo1 EW(EPTAO7 G5E7 UTL_KALE#A723LAD_P3T5 T5E7 DBMS_OUTPUT#PUT_LA7E 8Tinvalid_pa"*T9H 43ASEH G5E7 UTL_KALE#A723LAD_MODE T5E7 DBMS_OUTPUT#PUT_LA7E 8Tinvalid_modeT9H 43ASEH G5E7 UTL_KALE#A723LAD_KALE537DLE T5E7 DBMS_OUTPUT#PUT_LA7E 8Tinvalid_file*andleT9H 43ASEH G5E7 UTL_KALE#A723LAD_OPE43TAO7 T5E7 DBMS_OUTPUT#PUT_LA7E 8Tinvalid_opera"ionT9H 43ASEH G5E7 UTL_KALE#4E3D_E44O4 T5E7 DBMS_OUTPUT#PUT_LA7E 8Tread_errorT9H 43ASEH G5E7 UTL_KALE#G4ATE_E44O4 T5E7 DBMS_OUTPUT#PUT_LA7E 8T>ri"e_errorT9H 43ASEH G5E7 UTL_KALE#A7TE473L_E44O4 T5E7 DBMS_OUTPUT#PUT_LA7E 8Tin"ernal_errorT9H 43ASEH E7DH

Bi#$io:r",+"? Oracle?i Supplied Packages 4eference Using UTL_KALE for Kile A/O Oracle Buil"<An Packages Oracle Press Me"alink $ 7o"a FFE-=#+ S"even Keuers"ein$ +OO?

Roberto Mercado S.

Pag 17

Вам также может понравиться