Está en la página 1de 36

SQL Dinmico y Metadatos

Copyright 2004, Oracle. Todos los Derechos Reservados.

Objetivos
Al finalizar esta leccin, debera estar capacitado para lo si !iente" Describir el fl!jo de ejec!cin de sentencias SQL #onstr!ir y ejec!tar sentencias SQL dinmicamente !tilizando SQL dinmico nativo $es decir, con sentencias EXECUTE IMMEDIATE% #omparar SQL dinmico nativo con el enfo&!e del pa&!ete DBMS_SQL 'tilizar el pa&!ete DBMS_METADATA para obtener metadatos del diccionario de datos como (ML o DDL de creacin &!e p!eden !tilizarse para recrear los objetos

Copyright 2004, Oracle. Todos los Derechos Reservados.

)l!jo de *jec!cin de SQL


+odas las sentencias SQL pasan por varias fases"
Analizar *nlazar *jec!tar ,ec!perar

-!ede &!e al !nas de estas etapas no sean relevantes para todas las sentencias, por ejemplo, la fase de rec!peracin se aplica a las cons!ltas. /ota" -ara sentencias SQL embebidas $SELECT, DML, COMMIT y ROLLBACK%, las fases de anlisis y enlace se realizan en tiempo de compilacin. -ara sentencias SQL dinmicas, todas las fases se realizan en tiempo de ejec!cin.
Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico
'tilice SQL dinmico para crear !na sentencia SQL c!ya estr!ct!ra p!ede cambiar en tiempo de ejec!cin. SQL Dinmico" Se constr!ye y almacena como !na cadena de caracteres dentro de la aplicacin *s !na sentencia SQL con datos de col!mna variables o diferentes condiciones con o sin variables pendientes de asi nacin $variables li adas% Activa sentencias de definicin y control de datos o sentencias de control de sesin para &!e se escriban y ejec!ten desde -L0SQL Se ejec!tan con sentencias SQL dinmicas nativas o con el pa&!ete DBMS_SQL
Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico /ativo


-roporciona soporte nativo para SQL dinmica directamente en el len !aje -L0SQL -roporciona la capacidad de ejec!tar sentencias SQL c!ya estr!ct!ra no se conoce 1asta el tiempo de ejec!cin Lo soportan las si !ientes sentencias -L0SQL"
EXECUTE IMMEDIATE OPEN-FOR FETCH CLOSE

Copyright 2004, Oracle. Todos los Derechos Reservados.

'so de la Sentencia EXECUTE IMMEDIATE


'tilice la sentencia EXECUTE IMMEDIATE para SQL dinmico nativo o para blo&!es -L0SQL annimos"
EXECUTE IMMEDIATE dynamic_string [INTO {define_variable [, define_variable] ... | record}] [USING [IN|OUT|IN OUT] bind_argument [, [IN|OUT|IN OUT] bind_argument] ... ]

INTO se !tiliza para cons!ltas de !na sola fila y especifica las variables o los re istros en los &!e los valores de col!mna se rec!peran. USING se !tiliza para contener todos los ar !mentos enlazados. *l modo de parmetro por defecto es IN, si no se especifica.
Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico con !na Sentencia DDL


#reacin de !na tabla" CREATE PROCEDURE !"#$%#_%$&'#( %$&'#_)$*# +ARCHAR,, !-'_./#!. +ARCHAR,0 IS BEGIN EXECUTE IMMEDIATE 1CREATE TABLE 1||%$&'#_)$*#|| 1 (1 || !-'_./#!. || 101 END 2 *jemplo de llamada"
BEGIN !"#$%#_%$&'#(1EMPLO3EE_NAMES1, 145 NUMBER(60 PRIMAR3 KE3, )$*# +ARCHAR,(67010 END 2

Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico con Sentencias DML


S!presin de filas de c!al&!ier tabla"
CREATE FUNCTION 5#'_"-8.(%$&'#_)$*# +ARCHAR,0 RETURN NUMBER IS BEGIN EXECUTE IMMEDIATE 1DELETE FROM 1||%$&'#_)$*# RETURN SQL9RO:COUNT END BEGIN DBMS_OUTPUT.PUT_LINE( 5#'_"-8.(1EMPLO3EE_NAMES10|| 1 "-8. 5#'#%#5.10 END

2nsercin de !na fila en !na tabla con dos col!mnas"


CREATE PROCEDURE $55_"-8(%$&'#_)$*# +ARCHAR,, 45 NUMBER, )$*# +ARCHAR,0 IS BEGIN EXECUTE IMMEDIATE 1INSERT INTO 1||%$&'#_)$*#|| 1 +ALUES (;<, ;,01 USING 45, )$*# END
Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico con !na #ons!lta de !na Sola )ila


*jemplo de cons!lta de !na sola fila"
CREATE FUNCTION =#%_#*/(#*/_45 NUMBER0 RETURN #*/'->##.9RO:T3PE IS .%*% +ARCHAR,(,770 #*/"#! #*/'->##.9RO:T3PE BEGIN .%*% ;? 1SELECT @ FROM #*/'->##. 1 || 1:HERE #*/'->##_45 ? ;451 EXECUTE IMMEDIATE .%*% INTO #*/"#! USING #*/_45 RETURN #*/"#! END 2 DECLARE #*/"#! #*/'->##.9RO:T3PE ;? =#%_#*/(<770 BEGIN DBMS_OUTPUT.PUT_LINE(1E*/; 1||#*/"#!.'$.%_)$*#0 END 2
Copyright 2004, Oracle. Todos los Derechos Reservados.

SQL Dinmico con !na #ons!lta de 3arias )ilas


'tilizar los procesamientos OPEN-FOR, FETCH y CLOSE"
CREATE PROCEDURE '4.%_#*/'->##.(5#/%45 NUMBER0 IS T3PE #*/_"#A!." IS REF CURSOR #*/_!B #*/_"#A!." #*/"#! #*/'->##.9RO:T3PE .%*% B$"!C$",(,770 ;? 1SELECT @ FROM #*/'->##.1 BEGIN IF 5#/%45 IS NULL THEN OPEN #*/_!B FOR .%*% ELSE .%*% ;? .%*% || 1 :HERE 5#/$"%*#)%_45 ? ;451 OPEN #*/_!B FOR .%*% USING 5#/%45 END IF LOOP FETCH #*/_!B INTO #*/"#! EXIT :HEN #*/_!B9NOTFOUND DBMS_OUTPUT.PUT_LINE(#*/"#!.5#/$"%*#)%_45|| 1 1 ||#*/"#!.'$.%_)$*#0 END LOOP CLOSE #*/_!B END
Copyright 2004, Oracle. Todos los Derechos Reservados.

Declaracin de 3ariables de #!rsor


Declarar !n tipo de c!rsor como REF CURSOR"
CREATE PROCEDURE /"-!#.._5$%$ IS T3PE "#A_!%>/# IS REF CURSOR -- 8#$D "#A !E".-" T3PE #*/_"#A_!%>/# IS REF CURSOR -- .%"-)= RETURN #*/'->##.9RO:T3PE ;

Declarar !na variable de c!rsor !tilizando el tipo de c!rsor"

; 5#/%_!."B$" "#A_!%>/# #*/_!."B$" #*/_"#A_!%>/# BEGIN OPEN #*/_!."B$" FOR SELECT @ FROM #*/'->##. OPEN 5#/%_!."B$" FOR SELECT @ A"-* 5#/$"%*#)%. -- TC#) E.# $. )-"*$' !E".-". END
Copyright 2004, Oracle. Todos los Derechos Reservados.

*jec!cin Dinmica de !n 4lo&!e -L0SQL


*jec!cin dinmica de !n blo&!e -L0SQL annimo"
CREATE FUNCTION $))E$'_.$'(#*/_45 NUMBER0 RETURN NUMBER IS /'.F' B$"!C$",(,770 ;? 1DECLARE 1|| 1 #*/"#! #*/'->##.9RO:T3PE 1|| 1BEGIN1|| 1 #*/"#! ;? =#%_#*/(;#*/450 1 || 1 ;"#. ;? #*/"#!..$'$"> @ <, 1 || 1END 1 "#.E'% NUMBER BEGIN EXECUTE IMMEDIATE /'.F' USING IN #*/_45, OUT "#.E'% RETURN "#.E'% END 2 EXECUTE DBMS_OUTPUT.PUT_LINE($))E$'_.$'(<7700
Copyright 2004, Oracle. Todos los Derechos Reservados.

'so de SQL Dinmico /ativo para #ompilar #di o -L0SQL


#ompilar cdi o -L0SQL con la sentencia ALTER" ALTER PROCEDURE )$*# COMPILE ALTER FUNCTION )$*# COMPILE ALTER PACKAGE )$*# COMPILE SPECIFICATION ALTER PACKAGE )$*# COMPILE BOD3
CREATE PROCEDURE !-*/4'#_/'.F'()$*# +ARCHAR,, /'.F'_%>/# +ARCHAR,, -/%4-). +ARCHAR, ;? NULL0 IS .%*% B$"!C$",(,770 ;? 1ALTER 1|| /'.F'_%>/# || 1 1|| )$*# || 1 COMPILE1 BEGIN IF -/%4-). IS NOT NULL THEN .%*% ;? .%*% || 1 1 || -/%4-). END IF EXECUTE IMMEDIATE .%*% END 2
Copyright 2004, Oracle. Todos los Derechos Reservados.

'so del -a&!ete DBMS_SQL


*l pa&!ete DBMS_SQL se !tiliza para escribir SQL dinmico en procedimientos almacenados y para analizar sentencias DDL. Al !nos de los procedimientos y f!nciones del pa&!ete son" OPEN_CURSOR PARSE BIND_+ARIABLE EXECUTE FETCH_RO:S CLOSE_CURSOR

Copyright 2004, Oracle. Todos los Derechos Reservados.

'so de DBMS_SQL con !na Sentencia DML


*jemplo de s!presin de filas"
CREATE OR REPLACE FUNCTION 5#'#%#_$''_"-8. (%$&'#_)$*# +ARCHAR,0 RETURN NUMBER IS !."_45 INTEGER "-8._5#' NUMBER BEGIN !."_45 ;? DBMS_SQL.OPEN_CURSOR DBMS_SQL.PARSE(!."_45, 1DELETE FROM 1||%$&'#_)$*#, DBMS_SQL.NATI+E0 "-8._5#' ;? DBMS_SQL.EXECUTE (!."_450 DBMS_SQL.CLOSE_CURSOR(!."_450 RETURN "-8._5#' END 2 BEGIN DBMS_OUTPUT.PUT_LINE(1R-8. D#'#%#5; 1 || 5#'#%#_$''_"-8.(1#*/'->##.100 END
Copyright 2004, Oracle. Todos los Derechos Reservados.

'so de DBMS_SQL con !na Sentencia DML con -armetros


CREATE PROCEDURE 4).#"%_"-8 (%$&'#_)$*# +ARCHAR,, 45 +ARCHAR,, )$*# +ARCHAR,, "#=4-) NUMBER0 IS !."_45 INTEGER .%*% +ARCHAR,(,770 "-8._$55#5 NUMBER BEGIN .%*% ;? 1INSERT INTO 1||%$&'#_)$*#|| 1 +ALUES (;!45, ;!)$*#, ;"4501 !."_45 ;? DBMS_SQL.OPEN_CURSOR DBMS_SQL.PARSE(!."_45, .%*%, DBMS_SQL.NATI+E0 DBMS_SQL.BIND_+ARIABLE(!."_45, 1;!451, 450 DBMS_SQL.BIND_+ARIABLE(!."_45, 1;!)$*#1, )$*#0 DBMS_SQL.BIND_+ARIABLE(!."_45, 1;"451, "#=4-)0 "-8._$55#5 ;? DBMS_SQL.EXECUTE(!."_450 DBMS_SQL.CLOSE_CURSOR(!."_450 DBMS_OUTPUT.PUT_LINE("-8._$55#5||1 "-8 $55#510 END 2
Copyright 2004, Oracle. Todos los Derechos Reservados.

#omparacin de SQL Dinmico /ativo y el -a&!ete DBMS_SQL


SQL Dinmico /ativo" *s ms fcil de !tilizar &!e DBMS_SQL /ecesita menos cdi o &!e DBMS_SQL Mejora el rendimiento por&!e el int5rprete de -L0SQL le proporciona soporte nativo Soporta todos los tipos soportados por SQL esttico en -L0SQL, incl!idos tipos definidos por el !s!ario -!ede rec!perar filas directamente en re istros -L0SQL

Copyright 2004, Oracle. Todos los Derechos Reservados.

-a&!ete DBMS_METADATA
*l pa&!ete DBMS_METADATA proporciona !na !tilidad centralizada para la e6traccin, manip!lacin y reenvo de los metadatos del diccionario.

Copyright 2004, Oracle. Todos los Derechos Reservados.

A-2 de Metadatos
*l procesamiento implica los si !ientes pasos" 7. La rec!peracin de los metadatos de !n objeto como (ML. 8. La transformacin de (ML de varias maneras $incl!ida s! transformacin en SQL DDL%. 9. La ejec!cin de (ML para recrear el objeto.

Copyright 2004, Oracle. Todos los Derechos Reservados.

S!bpro ramas en DBMS_METADATA


1o)&re
OPEN

Descripci*
(speci%ica el tipo de o&'eto !ue se de&e recuperar, la versi* de sus )etadatos y el )odelo de o&'eto. (l valor de retor o es u )a e'ador de co texto opaco para el 'uego de o&'etos. (speci%ica las restriccio es e los o&'etos !ue se de&e recuperar tales co)o el o)&re o el es!ue)a del o&'eto (speci%ica el /)ero )#xi)o de o&'etos !ue se de&e recuperar e u a sola lla)ada FETCH_xxx Devuelve el texto de las co sultas !ue utili"ar# FETCH_xxx $ctiva el a #lisis de la salida y especi%ica el atri&uto de u o&'eto para !ue se a alice y devuelva (speci%ica u a tra s%or)aci* !ue FETCH_xxx aplica a la represe taci* +,- de los o&'etos recuperados (speci%ica los par#)etros de la ho'a de estilo +.-T ide ti%icada por transform_hand ! Devuelve )etadatos para los o&'etos !ue cu)ple los criterios esta&lecidos por OPEN, SET_FI"TER 0 valida el )a e'ador devuelto por OPEN y li)pia el estado asociado

SET_FI"TER SET_COUNT GET_QUERY SET_PARSE_ITEM ADD_TRANSFORM SET_TRANSFORM_PARAM, SET_REMAP_PARAM FETCH_XXX C"OSE

Copyright 2004, Oracle. Todos los Derechos Reservados.

S!bpro ramas FETCH_GGG


1o)&re FETCH_#M" FETCH_DD" Descripci* (sta %u ci* devuelve los )etadatos +,- para u o&'eto co)o +,-Type. (sta %u ci* devuelve DD- 3ya sea para crear o para &orrar el o&'eto4 e u a ta&la a idada prede%i ida. (sta %u ci* devuelve los o&'etos, tra s%or)ados o o, co)o C-O2. (ste procedi)ie to devuelve )etadatos +,- para estos o&'etos co)o C-O2 e u par#)etro IN OUT NOCOPY para evitar costosas copias -O2.

FETCH_C"O$ FETCH_#M"_C"O$

Copyright 2004, Oracle. Todos los Derechos Reservados.

-rocedimiento SET_FILTER
Sinta6is"
PROCEDURE .#%_A4'%#" ( C$)5'# IN NUMBER, )$*# IN +ARCHAR,, B$'E# IN +ARCHAR,|BOOLEAN|NUMBER, -&H#!%_%>/#_/$%C +ARCHAR, 0

*jemplo"
... DBMS_METADATA.SET_FILTER (C$)5'#, 1NAME1, 1HR10 ...

Copyright 2004, Oracle. Todos los Derechos Reservados.

)iltros
:ay ms de ;< filtros or anizados por cate oras de tipos de objetos tales como" Objetos con nombre +ablas Objetos dependientes de tablas =ndice Objetos dependientes Objetos otor ados Datos de tabla *stadsticas de ndice ,estricciones +odos los tipos de objetos *6portacin de la base de datos
Copyright 2004, Oracle. Todos los Derechos Reservados.

*jemplos de Definicin de )iltros


-ara confi !rar el filtro para rec!perar los objetos del es&!ema HR e6cl!idos los tipos de objetos de las f!nciones, procedimientos y pa&!etes adems de c!al&!ier vista &!e conten a PA3ROLL al inicio del nombre de la vista"
DBMS_METADATA.SET_FILTER(C$)5'#, 1IN (11PA3ROLL11, 11HR11010 DBMS_METADATA.SET_FILTER(C$)5'#, 1?11FUNCTION1110 DBMS_METADATA.SET_FILTER(C$)5'#, 1?11PROCEDURE1110 DBMS_METADATA.SET_FILTER(C$)5'#, 1?11PACKAGE1110 DBMS_METADATA.SET_FILTER(C$)5'#, 1LIKE 11PA3ROLL9111, 1+IE:10 1SCHEMA_EXPR1, 1EXCLUDE_PATH_EXPR1, 1EXCLUDE_PATH_EXPR1, 1EXCLUDE_PATH_EXPR1, 1EXCLUDE_NAME_EXPR1,

Copyright 2004, Oracle. Todos los Derechos Reservados.

'so -ro ramtico" *jemplo 7


CREATE PROCEDURE #G$*/'#_-)# IS C NUMBER %C< NUMBER %C, NUMBER 5-! .>..DEI_55'. 7 BEGIN C ;? DBMS_METADATA.OPEN(1SCHEMA_EXPORT10 8 DBMS_METADATA.SET_FILTER (C,1SCHEMA1,1HR10 9 %C< ;? DBMS_METADATA.ADD_TRANSFORM (C, > 1MODIF31, NULL, 1TABLE10 DBMS_METADATA.SET_REMAP_PARAM(%C<, ? 1REMAP_TABLESPACE1, 1S3STEM1, 1TBS<10 %C, ;?DBMS_METADATA.ADD_TRANSFORM(C, 1DDL10 DBMS_METADATA.SET_TRANSFORM_PARAM(%C,, 1SQLTERMINATOR1, TRUE0 DBMS_METADATA.SET_TRANSFORM_PARAM(%C,, @ 1REF_CONSTRAINTS1, FALSE, 1TABLE10 LOOP 5-! ;? DBMS_METADATA.FETCH_DDL(C0 ; EXIT :HEN 5-! IS NULL END LOOP DBMS_METADATA.CLOSE(C0 A END
Copyright 2004, Oracle. Todos los Derechos Reservados.

Slo /otas

Copyright 2004, Oracle. Todos los Derechos Reservados.

'so -ro ramtico" *jemplo 8


CREATE FUNCTION =#%_%$&'#_*5 RETURN CLOB IS C NUMBER -- "#%E")#5 &> 1OPEN1 %C NUMBER -- "#%E")#5 &> 1ADD_TRANSFORM1 5-! CLOB BEGIN -- ./#!4A> %C# OBJECT T3PE C ;? DBMS_METADATA.OPEN(1TABLE10 -- E.# FILTERS %- ./#!4A> %C# -&H#!%. 5#.4"#5 DBMS_METADATA.SET_FILTER(C,1SCHEMA1,1HR10 DBMS_METADATA.SET_FILTER(C,1NAME1,1EMPLO3EES10 -- "#FE#.% %- &# TRANSFORMED 4)%- !"#$%4-) DDL %C ;? DBMS_METADATA.ADD_TRANSFORM(C,1DDL10 -- FETCH %C# -&H#!% 5-! ;? DBMS_METADATA.FETCH_CLOB(C0 -- "#'#$.# "#.-E"!#. DBMS_METADATA.CLOSE(C0 RETURN 5-! END 2
Copyright 2004, Oracle. Todos los Derechos Reservados.

Slo /otas

Copyright 2004, Oracle. Todos los Derechos Reservados.

A-2 de *6ploracin
1o)&re GET_XXX Descripci* -as %u cio es GET_#M" y GET_DD" devuelve )etadatos para u s*lo o&'eto co o)&re. (sta %u ci* devuelve )etadatos para u o&'eto depe die te. (sta %u ci* devuelve )etadatos para u o&'eto otorgado. DD" o #M"

GET_DEPENDENT_XXX GET_GRANTED_XXX

Do de xxx es5

Copyright 2004, Oracle. Todos los Derechos Reservados.

A-2 de *6ploracin" *jemplos


7. Obten a representacin (ML de HR.EMPLO3EES"
SELECT DBMS_METADATA.GET_XML (1TABLE1, 1EMPLO3EES1, 1HR10 FROM 5E$'

8. ,ec!pere el DDL para todos los objetos otor ados en HR.EMPLO3EES"


SELECT DBMS_METADATA.GET_DEPENDENT_DDL (1OBJECT_GRANT1, 1EMPLO3EES1, 1HR10 FROM 5E$'

9. ,ec!pere el DDL para todos los permisos del sistema otor ados a HR"
SELECT DBMS_METADATA.GET_GRANTED_DDL (1S3STEM_GRANT1, 1HR10 FROM 5E$'

Copyright 2004, Oracle. Todos los Derechos Reservados.

A-2 de *6ploracin" *jemplos

BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 1STORAGE1, A$'.#0 END 2 SELECT DBMS_METADATA.GET_DDL(1TABLE1,E.%$&'#_)$*#0 FROM E.#"_$''_%$&'#. E :HERE E.)#.%#5 ? 1NO1 AND (E.4-%_%>/# IS NULL OR E.4-%_%>/# ? 1IOT10 BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 1DEFAULT10; END 2

Copyright 2004, Oracle. Todos los Derechos Reservados.

,es!men
*n esta leccin, debe 1aber aprendido lo si !iente" *6plicar el fl!jo de ejec!cin de sentencias SQL #rear sentencias SQL dinmicamente y ejec!tarlas !tilizando sentencias SQL dinmicas nativas o el pa&!ete DBMS_SQL ,econocer las ventajas de !so de SQL dinmico nativo en comparacin con el pa&!ete DBMS_SQL 'tilizar s!bpro ramas DBMS_METADATA para obtener metadatos del diccionario de datos mediante pro ramacin

Copyright 2004, Oracle. Todos los Derechos Reservados.

-rctica @" 3isin Beneral


*n esta prctica se abordan los si !ientes temas" #reacin de !n pa&!ete &!e !tiliza SQL dinmico nativo para crear o borrar !na tabla y para rellenar, modificar y s!primir filas de !na tabla #reacin de !n pa&!ete &!e compile el cdi o -L0 SQL en el es&!ema 'so de DBMS_METADATA para mostrar la sentencia para re enerar !n s!bpro rama -L0SQL

Copyright 2004, Oracle. Todos los Derechos Reservados.

Copyright 2004, Oracle. Todos los Derechos Reservados.

Copyright 2004, Oracle. Todos los Derechos Reservados.

Copyright 2004, Oracle. Todos los Derechos Reservados.

También podría gustarte