Está en la página 1de 44

SolucionJava.

com

Ing. Cedric Simon Tel: 2268 0974 Cel: 8888 2387 Email: c e d r i c @ s o l u c i o n j a v a . c o m Web: www.solucionjava.com

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2

!anual del alu"no

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 2 / 44

ndice
ndice....................................................................................................................................................................................2 1 Introduccin al curso.........................................................................................................................................................4 1.1 Objetivo de este curso................................................................................................................................................4 1.2 Manual del alumno.....................................................................................................................................................4 1.3 Requisitos para atender a este curso........................................................................................................................4 1.4 Soporte despus del curso..........................................................................................................................................4 1.5 Herramienta de desarrollo........................................................................................................................................4 2 DML - Sentencias de manipulacin de datos...................................................................................................................5 2.1 Objetivo del cap tulo..................................................................................................................................................5 2.2 !nsert............................................................................................................................................................................5 2.3 "pdate.........................................................................................................................................................................5 2.4 #elete...........................................................................................................................................................................5 2.5 $ommit % rollbac&......................................................................................................................................................5 2.' Savepoint.....................................................................................................................................................................' 2.( Select............................................................................................................................................................................' 2.) *+ere..........................................................................................................................................................................( 2.8.1 Operadores SQL ...................................................................................................................................................7 2.8.2 La ausencia de valor: NULL ................................................................................................................................8 2., $ount...........................................................................................................................................................................) 2.1- Sum. av/. min. ma0.................................................................................................................................................., 2.11 #istinct......................................................................................................................................................................., 2.12 Order b%...................................................................................................................................................................., 2.13 "niones ....................................................................................................................................................................., 2.14 Subconsultas............................................................................................................................................................., 2.15 1/rupaciones..........................................................................................................................................................12.1' Rollup......................................................................................................................................................................12.1( $ube.........................................................................................................................................................................12.1) Rendimiento............................................................................................................................................................11 2.18.1 Indices...............................................................................................................................................................11 2.18.2 Diseo de la base de datos denor!ali"aci#n..................................................................................................11 2.18.$ Uso del %&'L(IN 'L(N.................................................................................................................................12 2.18.) Uso de *IN+S...................................................................................................................................................12 3 Creacin de ob etos..........................................................................................................................................................14 3.1 !ndices........................................................................................................................................................................14 $.1.1 ,reaci#n..............................................................................................................................................................1) $.1.2 -odi.icaci#n.......................................................................................................................................................1/ $.1.$ %li!inaci#n.........................................................................................................................................................10 $.1.) %1ercicios.............................................................................................................................................................10 3.2 2istas.........................................................................................................................................................................1( $.2.1 ,reaci#n..............................................................................................................................................................17 $.2.2 -odi.icaci#n.......................................................................................................................................................17
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 3 / 44

$.2.$ %li!inaci#n.........................................................................................................................................................17 $.2.) %1ercicios.............................................................................................................................................................17 3.3 2istas materiali3adas...............................................................................................................................................1( 3.4 Secuencias.................................................................................................................................................................1) $.).1 ,reaci#n..............................................................................................................................................................18 $.).2 -odi.icaci#n.......................................................................................................................................................18 $.).$ %li!inaci#n.........................................................................................................................................................18 $.).) %1ercicios.............................................................................................................................................................18 3.5 Sin4nimos..................................................................................................................................................................1) $./.1 ,reaci#n..............................................................................................................................................................18 $./.2 %li!inaci#n.........................................................................................................................................................12 $./.$ %1ercicios.............................................................................................................................................................12 3.' #5 6in&.....................................................................................................................................................................1, 4 !L"S#L b$sico.................................................................................................................................................................2% 4.1 !ntroducci4n..............................................................................................................................................................24.2 5loque an4nimo 768S96.........................................................................................................................................24.3 !denti:icadores..........................................................................................................................................................24.4 2ariables...................................................................................................................................................................2).).1 +ipos de variables................................................................................................................................................21 ).).2 3ariables locales.................................................................................................................................................21 ).).$ 3ariables 4lobales...............................................................................................................................................21 4.5 $ontrol de :lujo.........................................................................................................................................................21 4.5.1 !:..elsi:...else............................................................................................................................................................21 )./.2 ,ase.....................................................................................................................................................................22 )./.$ 5oto.....................................................................................................................................................................2$ 4.' 5ucles.........................................................................................................................................................................23 ).0.1 LOO'..................................................................................................................................................................2$ ).0.2 6*IL%................................................................................................................................................................2) ).0.$ 7O8.....................................................................................................................................................................2) 4.( ;0it.............................................................................................................................................................................24 4.) <"66.........................................................................................................................................................................24 4., ;=;$">; !MM;#!1>;.......................................................................................................................................24 4.1- $ursores..................................................................................................................................................................25 4.11 ;0cepciones.............................................................................................................................................................2' ).11.1 %9cepciones prede.inidas .................................................................................................................................27 ).11.2 %9cepciones de.inidas por el usuario ...............................................................................................................22 ).11.$ 8(IS%:(''LI,(+ION:%88O8....................................................................................................................$; 4.12 7rocedimientos. :unciones. paquetes. disparadores............................................................................................31 ).12.1 7unciones..........................................................................................................................................................$1 ).12.2 'rocedi!ientos..................................................................................................................................................$0 ).12.$ 'a<uetes.............................................................................................................................................................$7 ).12.) Disparadores......................................................................................................................................................$8 5 & ercicios..........................................................................................................................................................................43 ' Dise(o de la base de datos...............................................................................................................................................44

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 4 / 44

1 Introduccin al curso
1.1 Objetivo de este curso
Este curso brindar al alumno el conocimiento necesario para hacer programacin en PL/SQL en una base de datos Oracle 10g. Primero vamos a dar una repasadita al lenguaje SQL y ver alguna sentencias avanzadas del SQL. Luego veremos el PL/SQL.

1.2 Manual del alumno


Este manual del alumno es una ayuda para el alumno, para tenga un recuerdo del curso. Este manual contiene un resumen de las materias que se van a estudiar durante el curso, pero el alumno debera de tomar notas personales para completas este manual.

1.3 Requisitos para atender a este curso


Se requiere un conocimiento del lenguaje SQL.

1.4 Soporte despus del curso


Si tienes preguntas sobre la materia del curso en tus ejercicios prcticos, puedes escribir tus preguntas a cedric@solucionjava.com .

1.5 Herramienta de desarrollo


Existen muchas herramientas de desarrollo para el PL/SQL. Lo mas bsico es un editor de texto y SQL plus. Las herramientas mas populares son TOAD, SQL Navigator, PL/SQL Developper, SQL Developper. SQL Developper, desarrollado por Oracle es gratis, los dems necesitan comprar una licencia. Cualquier herramienta se puede usar en el curso. Lo ideal es usar la con la cual tiene mas experiencia (y licencia), o usar SQL Developper que es gratis.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 5 / 44

2 DML - Sentencias de manipulacin de datos


2.1 Objetivo del captulo
Al fin de este captulo el alumno ser capaz de hacer encuestas de la base de datos. No vamos a ver todas las opciones, ni las encuestas de otros objetos de la base de datos (vistas, funciones, secuencias,...) porque eso sale del cuadro de este curso de iniciacin. Existen muchas opciones (top, exists, cube,...) para cada tipo de accin, pero estas opciones dependen de la base de datos utilizadas y/o de su versin. Solo vamos a ver las sentencias bsicas. Existen muchos entornos que simplifican las encuestas sobre los datos.

2.2 Insert
La sentencia Insert permite de insertar datos en una tabla.
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) VALUES (<valor_campo_1>,<valor_campo_2>,<valor_...>);

Tambin existe:
INSERT INTO <nombre_de_tabla> (<campo_1>,<campo_2>,<...>) <SELECT STATEMENT>;

2.3 Update
La sentencia Update permite de modificar el valor de uno o varios datos en una tabla.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...>;

De costumbre se limita el cambio a ciertos registros, mencionados utilizando una clusula WHERE.
UPDATE <nombre_de_tabla> SET <campo_1>=<valor_campo_1>,<campo_2>=<valor_campo_2>,<...> WHERE <clusula_where>;

2.4 Delete
La sentencia Delete permite de borrar un uno o varios registros en una tabla.
DELETE FROM <nombre_de_tabla> ;

De costumbre se limita el borrado a ciertos registros, mencionados utilizando una clusula WHERE.
DELETE FROM <nombre_de_tabla> WHERE <clusula_where>;

2.5 Commit y rollback


Si la base de datos permite la gestin de transacciones, se puede utilizar Commit para confirmar una Insert, Update, o Delete, o `Rollback` para cancelarlos. Ciertas base de datos pueden ser configuradas
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 6 / 44

para autocommit, que hace un commit automaticamente despues de cada instruccin, a menos que se ha iniciado una transaccin de manera explicita (con 'begin transaction xxx;). Hasta que el Commit est ejecutado, las modificaciones no estn inscritas de manera permanente en la base de datos, y slo son visible para la sesin en curso del usuario autor de las acciones. Despus del Commit, los cambios son definitivos y visible para todos. Cuidado que ciertos objetos pueden quedar bloqueados (bloqueando otros usuarios) hasta que el commit sea hecho. El commit/rollback permite confirmar o de hacer un lote de transaccin, para que si una falle, todas las anteriores se anulan tambin. Cuando se necesita una integridad de transaccin, se utiliza en commit/rollback.
Ejemplo: SELECT emp_no,job_grade FROM employee update employee set job_grade=6 where SELECT emp_no,job_grade FROM employee rollback; SELECT emp_no,job_grade FROM employee update employee set job_grade=6 where SELECT emp_no,job_grade FROM employee commit; SELECT emp_no,job_grade FROM employee where emp_no=4; emp_no=4; where emp_no=4; where emp_no=4; emp_no=4; where emp_no=4; where emp_no=4;

2.6 Savepoint
Un savepoint permite identificar un punto en una transaccin al cual se podr eventualmente regresar (rollback).
SELECT emp_no,job_grade FROM employee START TRANSACTION; update employee set job_grade=5 where SELECT emp_no,job_grade FROM employee savepoint vale_cinco; SELECT emp_no,job_grade FROM employee update employee set job_grade=4 where SELECT emp_no,job_grade FROM employee rollback to savepoint vale_cinco; SELECT emp_no,job_grade FROM employee rollback; where emp_no=4; emp_no=45; where emp_no=4; where emp_no=4; emp_no=45; where emp_no=4; where emp_no=4;

2.7 Select
El Select permite de seleccionar datos en la base de datos, y visualizarlos. Se puede utilizar un alias para que el campo se pueda llamar con otro nombre.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla>; SELECT <campo_1> as <alias1>,<campo_2>,<...> FROM <nombre_tabla>;

Para seleccionar todos los campos de la tabla, se utiliza el asterisco en vez de los nombres de campo.
SELECT * FROM <nombre_tabla>; Ejemplo: SELECT emp_no,job_grade as nivel FROM employee; SELECT * FROM employee;

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 7 / 44

2.8 Where
La clusula Where permite de limitar la encuesta a ciertos datos. Se utiliza evaluando un campo versus una condicin. Se pueden utilizar varias condiciones, con el uso de Or, And, y/o parntesis. Para compara nmeros, se utiliza el signo '=', o '<', o'>', o'<=', o '>=', o 'between ... and ...'. Para comparar caracteres se utiliza la palabra 'like'. El wildcard es '%'. Para compara fecha, se utiliza el signo '=', o '<', o'>', o'<=', o '>=', o 'between ... and ...'. Para
SELECT * FROM <nombre_tabla> WHERE <campo_1> <operation> <condicin> AND <campo_2> <operation> <condicin>; Ejemplo: SELECT emp_no,job_grade FROM SELECT emp_no,job_grade FROM SELECT * FROM employee where SELECT * FROM employee where

employee where employee where emp_no between last_name like

emp_no>45; emp_no=46 or 1 and 2; 'P%';

emp_no=61;

2.8.1

Operadores SQL

Ya hemos visto anteriormente qu tipos de datos se pueden utilizar en Oracle. Y siempre que haya datos, habr operaciones entre ellos, as que ahora se describirn qu operaciones y con qu operadores se realizan: Los operadores se pueden dividir en TRES conjuntos: Aritmticos: utilizan valores numricos Lgicos (o booleanos o de comparacin): utilizan valores booleanos o lgicos. Concatenacin: para unir cadenas de caracteres. Operadores artmticos Retornan un valor numrico: Smbo lo + * / Significado Operacin suma Operacin resta Operacin multiplicacin Operador divisin Ejemplo 1+2 1-2 1*2 1/2

Operadores lgicos Retornan un valor lgico (verdadero o falso) Smbolo = != <> ^= > < >= <= IN (RS) Significado Igualdad Desigualdad Mayor que Menor que Mayor o igual que Menor o igual que Igual a algn elemento del arreglo de resultados.
Versin 1.1

Ejemplo 1=2 1 != 2 1 <> 2 1 ^= 2 1>2 1<2 1 >= 2 1 <= 2 1 IN (1,2)


Reproduccin prohibida

Copyright Cdric Simon, 2008

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 8 / 44

[TRUE] ANY SOME a algn elemento del arreglo de resultados (derecha). Debe ser 10 >= ANY (1,2,3,10) estar precedido por =, !=, <, <=, >, >= Hace un OR lgico entre [TRUE] todos los elementos. a todos los elementos del arreglo de resultados (derecha), Debe 10 <= ALL (1,2,3,10) ser estar precedido por =, !=, <, <=, >, >= Hace un AND lgico [TRUE] entre todos los elementos. 10 BETWEEN 1 AND 100 EXISTS( SELECT 1 FROM DUAL) 'pepe' LIKE 'pe%' IS NULL Si es nulo 1 IS NULL 1 IS NOT NULL NOT EXISTS NOT BETWEEN NOT IN NOT = 1=1 AND 2 IS NULL 1=1 OR 2 IS NULL IS NOT NULL Si es No nulo NOT cond. Niega la condicin posterios

ALL

BEETWEEN x Operando de la izquierda entre x e y. Equivalente a op >= x AND y AND op <= y EXISTS LIKE(*) Si la retorna al menos una fila Es como

cond AND cond Hace un Y lgico entre dos condiciones Cond OR cond Hace un O lgico entre dos condiciones Existen los siguientes comodines: %: Conjunto de N caracteres (de 0 a ) _: Un solo carcter Concatenacin

Oracle puede hacer una conversin automtica cuando se utilice este operador con valores numricos: 10 || 20 = '1020' Este proceso de denomina CASTING y se puede aplicar en todos aquellos casos en que se utiliza valores numricos en puesto de valores alfanumricos o incluso viceversa. 2.8.2

La ausencia de valor: NULL

Todo valor (sea del tipo que sea) puede contener el valor NULL que no es ms que la ausencia de valor. As que cualquier columna (NUMBER, VARCHAR2, DATE) puede contener el valor NULL, con lo que se dice que la columna est a NULL. Una operacin retorna NULL si cualquiera de los operandos es NULL. Para comprobar si una valor es NULL se utiliza el operador IS NULL o IS NOT NULL.

2.9 Count
Para contar un numero de registros, se utiliza la palabra Count.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 9 / 44

SELECT COUNT(<campo_1>) FROM <nombre_tabla>;

Ejemplo:
SELECT count(*) FROM employee where job_grade=4;

2.10Sum, avg, min, max


Para una suma, min, max,... de un campo, se utilizan la palabras Sum, Min, Max, Avg.
SELECT SUM(<campo_1>) FROM <nombre_tabla>; Ejemplo: SELECT avg(salary) FROM employee where job_grade=2;

2.11Distinct
Para tener la lista de valores distingas de un campo, se utiliza la palabra Distinct.
SELECT DISTINCT(<campo_1>) FROM <nombre_tabla>; Ejemplo: SELECT distinct(job_grade) FROM employee;

2.12Order by
Para ordenar los registros regresados, hay que utilizar la palabre Order by.
SELECT * FROM <nombre_tabla> ORDER BY <campo_1>,<....>; Ejemplo: SELECT first_name,last_name FROM employee order by first_name,last_name;

2.13Uniones
Uniones permiten de unir los resultados de dos consultas. Para poder unirlas, tienen que tener los mismos campos.
SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_1> UNION SELECT <campo_1>,<campo_2>,<...> FROM <nombre_tabla_2>; Ejemplo: select t.first_name,t.last_name from employee t where job_grade=5 union select t2.fname,t2.lname from patient t2;

2.14Subconsultas
Subconsultas son consultas sobre otras consultas. La subconsulta se puede utilizar el la cusula From, o el la condicin de la clsula Where. La subconsulta se pone entre parntesis. En MySQL, las subconsultas deben tener sus propios alias.
SELECT t3.<campo_1>, t3.<campo_2> FROM (SELECT t.<campo_1>, t.<campo_2> <where cluase>) t3 WHERE t3.<campo_1> IN (SELECT t2.<campo_1> FROM <nombre_tabla_2> t2); Ejemplo: SELECT t3.first_name,t3.last_name FROM ( FROM <nombre_tabla > t

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


select t.first_name,t.last_name from employee t where job_grade=5 union select t2.fname,t2.lname from patient t2 ) t3 where t3.last_name like 'RAMIREZ%'; SELECT t3.first_name,t3.last_name, t3.job_country FROM employee t3 where t3.job_country IN (select t.country from country t where t.currency='Euro');

Pagina 10 / 44

2.15Agrupaciones
Las agrupaciones permiten agrupar datos y saber cuantos datos hay de cada valor.
SELECT <campo_1>,<campo_2>, COUNT(*) FROM <nombre_tabla> GROUP BY <campo_1>,<campo_2>;

Las agrupaciones se pueden filtrar utilizando la clausula HAVING.


Ejemplo: SELECT job_grade, count(*) FROM employee where emp_no>45 group by job_grade; SELECT job_grade, sum(salary) FROM employee where emp_no>45 group by job_grade having sum(salary)<1000000;

2.16Rollup
Rollup de usa en un group by para agregar el total del sub grupo. Ejemplo:

select dept_no, job_code, count(*), sum(salary) FROM employee GROUP ! rollup(dept_no,job_code)" select dept_no, job_code, count(*), sum(salary) FROM employee GROUP ! dept_no, rollup(job_code)"

2.17Cube
Cube es parecido al rollup pero da los totales de todos los grupos posibles. Ejemplo:
select dept_no, job_code, count(*), sum(salary) FROM employee GROUP ! #U $(dept_no,job_code)"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 11 / 44

2.18Rendimiento
Un problema comn en las encuesta a base de datos es el rendimiento. Las causas de problema de rendimiento son numerosas. Las ms comunes son: Instruccin sin o con mala clausula WHERE Falta de indice sobre un campo utilizado como filtro Mal diseo de la base de datos Problema de hardware (falta de memoria, disco ocupado, cpu ocupado por otra aplicacin,...) Mala configuracin del servidor (mal uso de la memoria, disco, cpu,...) Mala programacin en el cliente. Falta de commit, conexin no cerrada, ... Red sobrecargada o muy lenta Cuando se enfrenta a un problema de rendimiento hay que probar primero de identificar la causa y los sntomas. Servidor sobrecargado en CPU, disco, memoria? Un cliente afectado o todos? Cuando aparece el problema? Para ayudar a investigar estos problemas existen herramientas. Algunos vienen con la base de datos, otros estn desarrollados aparte. 2.18.1

Indices

Los indices permiten mejorar el rendimiento de las consultas, y entonces del servidor. Un indice es un pequeo archivo que contiene los valores de uno o varios campos de manera ordenada, junto con la informacin de la ubicacin fsica del registro. Cuando la consulta usa el indice, primero lee el archivo del indice, y luego los datos en la tabla. Si todos los campos pedidos estn en el indice, solo lee el indice. Los indices se usan cuando se busca un valor exacto (= o like '...'), un rango de valores (between and , >, <,...) , o los valores que 'inician con' (like '...%'). Si se usan funciones (upper(campo), ) no se usara el indice (a menos que existe un indice basado en funcin). Los indices tan poco se usan con clausula is null, is not null, in (), not , !=, like '%...',.... 2.18.2

Diseo de la base de datos y denormalizacin

Si por lo general es mejor tener una base de datos normalizada (sin informacin repetida), a veces hay que denormalizar por razn de rendimiento, es decir copiar un valor en una tabla que no le pertenece directamente. Denormalizar tiene un costo a nivel de programacin (mantener la integridad de los datos), pero permite mejorar (en ciertos casos) el rendimiento.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 12 / 44

2.18.3

Uso del EXPLAIN PLAN

Oracle tiene un motor interno que, basndose en su conocimiento de los datos, su reparticin (cardinality), y los indices que existen, decide cual es, segn el, la mejor manera de recoger los datos: cuales indices usar, cual tablas, en cual orden, como filtrar, etc... El 'explain plan' es una herramienta de Oracle que permite conocer cual camino Oracle va usar para recoger los datos de una cierta consulta, en una cierta base de datos, en un cierto momento. La decisin de Oracle depende muchos factores, entre otros la configuracin lgica y fsica de la base de datos, como de los indices disponibles, de la validez de las estadsticas, de la cantidad de registros,... Lo ideal es de pasar todas las consultas que se van hacer en produccin primero por un explain plan (en el ambiente de desarrollo), para detectar temprano posible problemas de rendimiento. Los entornos de desarrollo para SQL traen por lo general un GUI para ejecutar/mostrar el explain plan. 2.18.4

Uso de HINTS

Los hints son indicadores que permiten influir en la decisin del motor de Oracle cuanto a la mejor manera de recuperar datos. Permiten 'forzar' el uso de un indice, o cambiar la manera de calculo de Oracle. Los HINTs se usan con los comandos SELECT, UPDATE, y DELETE, y se mencionan como un comentario con signo +.
%$&$#' (*) *+nt or te,t *( cuerpo de la consulta -- o -%$&$#' --) *+nt or te,t cuerpo de la consulta

Notas sobre el uso de HINTS: Si no estan bien formado, sern ignorado (= comentario). No generarn error. Cuando usar los Hints: NUNCA. O lo menos posible. Son la ltima opcin para mejorar el rendimiento de una consulta. En el 99,9% de los casos, Oracle escoge el mejor camino por si solo. El uso de los hints interfiere con el motor de Oracle, y por eso hay que usarlo con muchas precaucin. 2.18.4.1 Optimizer hint Los Optimizer hints afectan la manera de calcular el mejor camino de recuperacin de datos. - Fuerza a que se utilice el optimizador basado en costes y optimiza el plan de ejecucin de la sentencia DML para que devuelva todas las filas en el menor tiempo posible. Es la opcin por defecto del optimizador basado en costes y es la solucin apropiada para procesos en masa e informes, en los que son necesarias todas las filas para empezar a trabajar con ellas.
(*) .&&_RO/% *(

- Tambin fuerza a que se utilice el optimizador basado en costes y optimiza el plan de ejecucin de la sentencia DML para que devuelva las "n" primeras filas en el menor tiempo posible. Esto es idneo para procesos iterativos y bucles, en los que podemos ir trabajando con las primeras filas mientras se recuperan el resto de resultados. Obviamente este hint no ser considerado por el optimizador si se utilizan funciones de grupo como MAX, SUM, AVG, etc.
(*) F0R%'_RO/% (n) *(

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 13 / 44

2.18.4.2 Hint de mtodo de acceso a tablas - Fuerza a que se realice la bsqueda accediendo a todos los registros de la tabla indicada. Cuando las tablas tienen un nmero reducido de registros puede resultar bueno para el rendimiento de una sentecia DML el forzar un escaneado completo de la tabla en lugar de que el optimizador decida acceder a dicha tabla mediante un ndice, ya que, en estos casos, el acceso por ndice suele ser ms lento.
(*) FU&& (nombre_tabla) *(

- Fuerza a que se acceda a la tabla utilizando el ROWID (identificativo nico de los registros de una tabla). Este tipo de hint, por si solo, no es muy til.
(*) RO/01 (nombre_tabla) *(

- Fuerza a que se acceda a la tabla utilizando, en sentido ascendente, el ndice indicado. Muchos problemas de rendimiento vienen causados por el hecho de que el optimizador Oracle decide acceder a una tabla utilizando un ndice incorrecto. Mediante este hint podemos indicarle al optimizador que utilice el ndice que nosotros consideremos adecuado.
(*) 021$3 (nombre_tabla 4nombre_5nd+ce6 ...) *(

- Idntico al anterior hint pero en este caso el acceso a travs del ndice se hace en sentido descendente.
(*) 021$3_1$%# (nombre_tabla 4nombre_5nd+ce6 ...) *(

- Este hint se utiliza para forzar el uso de ms de un ndice (se utilizaran los ndices indicados como parmetros) y, despus, fusionar los ndices quedndose con los registros encontrados en todas las bsquedas por ndice realizadas.
(*) .21_$7U.& (nombre_tabla 4nombre_5nd+ce6 ...) *(

- Fuerza el acceso a los datos de la tabla mediante una bsqueda (Scan) rpida (Fast) y total (Full) sobre el ndice indicado. Es parecido a utilizar el hint FULL pero sobre un ndice en lugar de una tabla, lo cual, difcilmente, puede ser bueno para el rendimiento de una sentencia DML.
(*) 021$3_FF% (nombre_tabla 4nombre_5nd+ce6 ...) *(

- Indica al optimizador que no se utilicen los ndices indicados. Puede ser til cuando no tengamos claro cual es el mejor ndice que debe ser utilizado para acceder a una tabla pero, por contra, sepamos que podemos tener problemas de rendimiento si se accede a la tabla por un determinado ndice y queramos evitar que esto ocurra.
(*) 2O_021$3 (nombre_tabla 4nombre_5nd+ce6 ...) *(

Ejemplo:
select (*) FU&&(pat+ent) *( 8name 8rom pat+ent 9*ere 8name l+:e ;RO $R'O;

2.18.4.3 Otros hints Desde la versin 10g existen ms de 70 hints diferentes documentados, y otros (mas de 50) no documentados. Ver la documentacin de Oracle para ms detalles sobre los hints.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 14 / 44

3 Creacin de objetos
3.1 Indices
Los indices permiten aumentar el rendimiento en caso de bsqueda de datos. 3.1.1

Creacin

'able 0nde, #R$.'$ 4U207U$< 0'M.P6 021$3 4sc*ema.6+nde,_name O2 4sc*ema.6table_name 4tbl_al+as6 (col 4.%# < 1$%#6) +nde,_clause +nde,_attr+bs +tmap =o+n 0nde, #R$.'$ 4U207U$< 0'M.P6 021$3 4sc*ema.6+nde,_name O2 4sc*ema.6table_name 4tbl_al+as6 (col_e,press+on 4.%# < 1$%#6) FROM 4sc*ema.6table_name 4tbl_al+as6 />$R$ cond+t+on 4+nde,_clause6 +nde,_attr+bs #luster 0nde, #R$.'$ 4U207U$< 0'M.P6 021$3 4sc*ema.6+nde,_name O2 #&U%'$R 4sc*ema.6cluster_name +nde,_attr+bs +nde,_clauses? &O#.& %'OR$ 02 (tablespace) &O#.& %'OR$ 02 (tablespace) (P.R'0'0O2 4part+t+on 4&OGG02G<2O&OGG02G6 4'. &$%P.#$ @tablespace<1$F.U&'A6 4P#'FR$$ +nt6 4P#'U%$1 +nt6 4020'R.2% +nt6 4M.3'R.2% +nt6 4%'OR.G$ storaBe_clause6 4%'OR$ 02 @tablespace_name<1$F.U&'6 4%U P.R'0'0O2 4subpart+t+on 4'. &$%P.#$ tablespace6666) &O#.& (P.R'0'0O2 4part+t+on 4&OGG02G<2O&OGG02G6 4'. &$%P.#$ @tablespace<1$F.U&'A6 4P#'FR$$ +nt6 4P#'U%$1 +nt6 4020'R.2% +nt6 4M.3'R.2% +nt6 4%'OR.G$ storaBe_clause6 4%'OR$ 02 @tablespace_name<1$F.U&'6 4%U P.R'0'0O2 4subpart+t+on 4'. &$%P.#$ tablespace6666) G&O .& P.R'0'0O2 ! R.2G$ (col_l+st) ( P.R'0'0O2 part+t+on C.&U$% &$%% '>.2 (Dalue_l+st) 4&OGG02G<2O&OGG02G6 4'. &$%P.#$ @tablespace<1$F.U&'A6 4P#'FR$$ +nt6 4P#'U%$1 +nt6 4020'R.2% +nt6 4M.3'R.2% +nt6 4%'OR.G$ storaBe_clause6 ) 021$3'!P$ 0% +nde,type 4P.R.&&$& +nt<2OP.R.&&$&6 4P.R.M$'$R% (;O1#0_Params;)6 @'*+s 8or table +nde, only, not b+tmap jo+n 0nde,A +nde,_attr+bs? any comb+nat+on o8 t*e 8ollo9+nB 2O%OR'<%OR'

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


R$C$R%$ #OMPR$%% +nt 2O#OMPR$%% #OMPU'$ %'.'0%'0#% 42O6&OGG02G O2&02$ '. &$%P.#$ @tablespace<1$F.U&'A P#'FR$$ +nt P#'U%$1 +nt 020'R.2% +nt M.3'R.2% +nt %'OR.G$ storaBe_clause P.R.&&$& parallel_clause 08 t*e P.R.&&$& clause +s used +t s*ould be t*e last opt+on. For e,ample? 'o create a 8unct+on-based +nde, 9*+c* allo9s case-+nsens+t+De searc*es. #R$.'$ 021$3 +d,_case_+ns O2 my_table(UPP$R(empname))" %$&$#' * FROM my_table />$R$ UPP$R(empname) E ;F.R&;"

Pagina 15 / 44

3.1.2

Modificacin

.&'$R 021$3 4sc*ema.6+nde, opt+ons Opt+ons? '*e opt+ons used 9+t* t*+s command can be any comb+nat+on o8 t*e 8ollo9+nB $2. &$ 10%. &$ #O.&$%#$ U2U%. &$ R$2.M$ 'O ne9_+nde,_name 42O6&OGG02G P#'FR$$ +nt P#'U%$1 +nt 020'R.2% +nt M.3'R.2% +nt %'OR.G$ storaBe_clause .&&O#.'$ $3'$2' 4%0G$ +nt F < M6 .&&O#.'$ $3'$2' 41.'.F0&$ ;8+lename;6 .&&O#.'$ $3'$2' 402%'.2#$ +nt6 1$.&&O#.'$ U2U%$1 1$.&&O#.'$ U2U%$1 F$$P +nt F < M 42O6MO20'OR02G U%.G$ UP1.'$ &O#F R$F$R$2#$% 2OP.R.&&$& P.R.&&$& +nt MO10F! MO10F! MO10F! MO10F! MO10F! P.R'0'0O2 P.R'0'0O2 P.R'0'0O2 P.R'0'0O2 P.R'0'0O2 part+t+on part+t+on part+t+on part+t+on part+t+on #O.&$%#$ U2U%. &$ UP1.'$ &O#F R$F$R$2#$% P.R.M$'$R% (;alter_part+t+on_params;) part+t+on_opt+ons

part+t+on_opt+ons? .&&O#.'$ $3'$2' 4%0G$ +nt F < M6 .&&O#.'$ $3'$2' 41.'.F0&$ ;8+lename;6 .&&O#.'$ $3'$2' 402%'.2#$ +nt6 1$.&&O#.'$ U2U%$1 1$.&&O#.'$ U2U%$1 F$$P +nt F < M 42O6&OGG02G P#'FR$$ +nt P#'U%$1 +nt 020'R.2% +nt

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


M.3'R.2% +nt %'OR.G$ storaBe_clause R$2.M$ 4%U 6P.R'0'0O2 old_name 'O ne9_name 1ROP P.R'0'0O2 part+t+on %P&0' P.R'0'0O2 part+t+on .' (Dalue_l+st) 402'O (ptn_descrH, ptn_descrI)6 42OP.R.&&$&<P.R.&&$& +nt6 ptn_descr? P.R'0'0O2 4part+t+on attr+b_opt+ons6 MO10F! 1$F.U&' .''R0 U'$% 4FOR P.R'0'0O2 part+t+on6 attr+b_opt+ons attr+b_opt+ons? '. &$%P.#$ @tablespace<1$F.U&'A 42O6&OGG02G P#'FR$$ +nt P#'U%$1 +nt 020'R.2% +nt M.3'R.2% +nt %'OR.G$ storaBe_clause MO10F! %U P.R'0'0O2 subpart+t+on U2U%. &$ MO10F! %U P.R'0'0O2 subpart+t+on sub_part+t+on_opt+ons sub_part+t+on_opt+ons? .&&O#.'$ $3'$2' 4%0G$ +nt F < M6 .&&O#.'$ $3'$2' 41.'.F0&$ ;8+lename;6 .&&O#.'$ $3'$2' 402%'.2#$ +nt6 1$.&&O#.'$ U2U%$1 1$.&&O#.'$ U2U%$1 F$$P +nt F < M R$ R$ R$ R$ U0&1 U0&1 U0&1 U0&1 4rebu+ld_opt+ons6 2OR$C$R%$ 4rebu+ld_opt+ons6 R$C$R%$ 4rebu+ld_opt+ons6 4%U 6P.R'0'0O2 part+t+on 4rebu+ld_opt+ons6

Pagina 16 / 44

rebu+ld_opt+ons? O2&02$ #OMPU'$ %'.'0%'0#% '. &$%P.#$ tablespace_name 2OP.R.&&$& P.R.&&$& +nt 42O6&OGG02G #OMPR$%% +nt 2O#OMPR$%% P#'FR$$ +nt P#'U%$1 +nt 020'R.2% +nt M.3'R.2% +nt P.R.M$'$R% (;odc+_parameters;) %'OR.G$ storaBe_clause More t*an one .&&O#.'$ $3'$2' opt+on s*ould be spec+8+ed +n t*e same clause e.B. .&&O#.'$ $3'$2' %0G$ IJJF 1ata8+le ;MyF+le.+d,;

3.1.3

Eliminacin

1ROP 021$3 4sc*ema.6+nde, 4FOR#$6 FOR#$ can be used to drop doma+n +nde,es t*at are mar:ed as 02_PROGR$%% or are report+nB errors.

3.1.4

Ejercicios

1. Llena una tabla con miles de filas 2. Haga una consulta sobre un campo que no tenga indice. Nota el tiempo de ejecucin. 3. Repite la consulta.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 17 / 44

4. Crea un indice sobre el campo de bsqueda, y repite la consulta. 5. crea un indice bitmap sobre un campo que tenga pocas valores diferentes.

3.2 Vistas
La vista es una sentencia de seleccin de datos preparada. Permite facilitar las consultas futuras, especialmente cuando se juntan varias tablas. Permite tambin limitar el acceso a datos (seguridad). 3.2.1

Creacin

#R$.'$ 4OR R$P&.#$6 4FOR#$<2OFOR#$6 C0$/ 4sc*ema.6D+e9 4(al+as,...) +nl+ne_constra+nt(s)6 4out_o8_l+ne_constra+nt(s)6 43M&'ype_D+e9_clause6 .% subKuery opt+ons opt+ons? /0'> R$.1 O2&! /0'> #>$#F OP'0O2 4#O2%'R.02' constra+nt6

3.2.2
.&'$R .&'$R .&'$R .&'$R .&'$R .&'$R

Modificacin
C0$/ C0$/ C0$/ C0$/ C0$/ C0$/ 4sc*ema.6D+e9 4sc*ema.6D+e9 4sc*ema.6D+e9 4sc*ema.6D+e9 4sc*ema.6D+e9 4sc*ema.6D+e9 #OMP0&$" .11 out_o8_l+ne_constra+nt" MO10F! #O2%'R.02' constra+nt @R$&! < 2OR$&!A" 1ROP #O2%'R.02' constra+nt" 1ROP PR0M.R! F$! U207U$ (column 4,column,...6)

When a constraint is in NOVALIDATE mode, Oracle does not enforce it and does not take it into account for query rewrite. If you specify RELY Oracle will still not enforce the constraint but will take it into account for query rewrite. An alternative to ALTER VIEW COMPILE is the built-in pl/sql package DBMS_UTILITY 3.2.3

Eliminacin Ejercicios

1ROP C0$/ 4sc*ema.6D+e9 4#.%#.1$ #O2%'R.02'%6

3.2.4

1. Crea una vista sobre 2 tablas ligadas. 2. Usa la vista en una consulta.

3.3 Vistas materializadas


Una vista materializada es un conjunto de datos de una o varias tablas (como una vista) pero del cual el dato se guarda fsicamente. Aumenta el rendimiento de las consultas en comparacin de la vista normal, pero disminuye el rendimiento de las consultas DML sobre las tablas ligadas a la vista materializada, ya que tiene que mantener la vista materializada ademas de la tabla fuente. Debido al impacto que tiene sobre el rendimiento general de la base de datos debido a los recursos que usa, evala con su DBA la pertinencia de crear una vista materializada. Un Snapshot es sinnimo de una vista materializada.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 18 / 44

Para ms informacin sobre las vistas materializadas, ver en http://www.softics.ru/docs/oracle10r2/server.101/b10759/statements_6002.htm

3.4 Secuencias
Una secuencia es un contador que se incrementa automticamente y permite generar numero nicos. 3.4.1

Creacin

#R$.'$ %$7U$2#$ 4sc*ema.6seKuence_name opt+on(s) Opt+ons? 02#R$M$2' ! +nt %'.R' /0'> +nt M.3C.&U$ +nt < 2OM.3C.&U$ M02C.&U$ +nt < 2OM02C.&U$ #!#&$ < 2O#!#&$ #.#>$ +nt < 2O#.#>$ OR1$R < 2OOR1$R

3.4.2

Modificacin

.&'$R %$7U$2#$ 4sc*ema.6seKuence_name opt+on(s) Opt+ons? 02#R$M$2' ! +nt M.3C.&U$ +nt < 2OM.3C.&U$ M02C.&U$ +nt < 2OM02C.&U$ #!#&$ < 2O#!#&$ #.#>$ +nt < 2O#.#>$ OR1$R < 2OOR1$R

3.4.3

Eliminacin Ejercicios

1ROP %$7U$2#$ 4sc*ema.6seKuence_name

3.4.4

1. Crea una secuencia 2. Altera la secuencia para que el prximo numero generado sea 20

3.5 Sinnimos
Un sinnimo es un nombre de objeto que refiere a un objeto con otro nombre, o que se pueda encontrar en otro esquema. Un sinnimo public es disponible para todos los usuarios (segn sus privilegios). 3.5.1

Creacin

#R$.'$ 4OR R$P&.#$6 4PU &0#6 %!2O2!M 4sc*ema.6synonym FOR 4sc*ema.6object 4Ldbl+n:6 ;PU &0#; 9+ll create a publ+c synonym, access+ble to all users (9+t* t*e appropr+ate pr+D+leBes.) Unl+:e C+e9s, %ynonyms do not need to be recomp+led 9*en t*e underly+nB table +s rede8+ned. '*ere +s a small per8ormance *+t 9*en access+nB data t*rouB* a publ+c synonym. Oracle 9+ll resolDe object names +n t*e 8ollo9+nB order?

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


current user pr+Date synonym publ+c synonym .n alternat+De met*od to access data +n anot*er sc*ema +s to use? .&'$R %$%%0O2 set current_sc*ema E Ot*er_%c*ema

Pagina 19 / 44

3.5.2

Eliminacin

1ROP 4PU &0#6 %!2O2!M 4sc*ema.6synonym 4FOR#$6 FOR#$ 9+ll drop t*e synonym eDen t*ere are dependent tables or user-de8+ned types.

3.5.3

Ejercicios

1. Crea un sinnimo publico para un objeto. Luego conecta te como otro usuario y consulta el objeto via el sinnimo pblico.

3.6 DB Link
Un DB Link permite llamar a objetos que se encuentran en otra base de datos (onlcuido en un servidor remoto). Hay que tener cuidado son el rendimiento ligado a consultas remotas, ya que puede impactar de manera significativa en servidor remoto. Evala con su DBA la pertinencia de crear un DB Link.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 20 / 44

4 PL/SQL bsico
4.1 Introduccin
El PL/SQL es un lenguaje de programacin de Oracle, que permite que el cdigo sea ejecutado en el servidor Oracle mismo. Para cdigos que necesitan muchas manipulaciones de datos, el PL/SQL es muy eficiente ya que se ejecuta localmente, con acceso directo a los datos. El PL/SQL no es CASE-SENSITIVE, es decir, no diferencia maysculas de minsculas como otros lenguajes de programacin como C o Java. Sin embargo debemos recordar que ORACLE es CASESENSITIVE en la bsquedas de texto (hasta la versin 10.2R2 que lo permite mediante nuevas valores para variables NLS_SORT y NLS_COMP). Las instrucciones PL/SQL terminan con un punto-coma (;), excepto algunas instrucciones con 1$#&.R$, etc..
$G02,

Los comentarios de una lnea se inician con y los de varias lneas inician con /* y terminan con */

4.2 Bloque annimo PL/SQL


Un bloque PL/SQL es un conjunto de instrucciones PL/SQL relacionadas entre ellas. Un simple bloque PL/SQL inicia con
$jemplo? %$' %$RC$ROU'PU' O2" $G02 dbms_output.put_l+ne(;>ola;)" $21" ( $G02

y termina con $21"

4.3 Identificadores
Un identificador es el nombre de un objeto PL/SQL, como por ejemplo una constante, variable, excepcin, paquete, funcin, procedimiento, tabla, cursor,... Un identificador puede tener hasta 30 caracteres, debe iniciar con una letra. Puede contener los signos $ o #, pero no puede contener operadores (+-%=/*...) ni ser igual a una palabra reservada. La lista de palabras reservada se encuentra en la vista V$RESERVED_WORDS.

4.4 Variables
Las variables se declaran antes de la palabra BEGIN, y se preceden de la palabra DECLARE. La sintaxis es : nombre_de_variable [CONSTANT] tipo [NOT NULL] [DEFAULT valor_por_defecto]; Ejemplo:
1$#&.R$ counter pr+or+ty ... 02.R!_02'$G$R ?E J" C.R#>.RI(M) 1$F.U&' ;&O/;"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 21 / 44

4.4.1

Tipos de variables

Los tipos de variables que se pueden usar en PL/SQL son bsicamente los mismos que se usan para definir campos en una tabla, plus algunos especficos del PL/SQL. PLS_INTEGER: tipo numrico del PL/SQL, equivalente a NUMBER, pero ms eficiente si se necesita hacer clculos aritmticos. %TYPE: refiere de manera dinmica a otro objeto. %ROWTYPE: refiere de manera dinmica a una fila de una tabla. Ejemplo:

set serDeroutput on" 1$#&.R$ D_8name employee.8+rst_nameN'!P$" beB+n select 8+rst_name +nto D_8name 8rom employee 9*ere emp_noEI" dbms_output.put_l+ne(;2ombreE;<<D_8name)" end" (

4.4.1.1

Tipos personalizados

Es posible crear sus propios tipo de datos. Los tipos personalizados estn fuera del alcance de este curso ya que se miran en un curso de PL/SQL avanzado. 4.4.2

Variables locales

Por defecto, una variable solo est disponible en el bloque PL/SQL donde se encuentra, y los sub bloques dentro de este bloque. Ejemplo:

1$#&.R$ D_cnt_emp number" $G02 select count(*) +nto D_cnt_emp 8rom employee 9*ere salaryOHJJJ" $G02 dbms_output.put_l+ne (;$mpleados con salar+oOHJJJ ? ;<<D_cnt_emp)" $21" $21" (

4.4.3

Variables globales

Las variables globales son variables que se pueden llamar desde otro cdigo. Solo estn disponibles en paquetes, pero estn fuera del alcance de este curso ya que se miran en un curso de PL/SQL avanzado.

4.5 Control de flujo


4.5.1

If..elsif...else

Se usa el IF..ELSIF..ELSE para controlar el flujo en PL/SQL.


0F (e,pres+on) '>$2

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


-- 0nstrucc+ones $&%0F (e,pres+on) '>$2 -- 0nstrucc+ones $&%$ -- 0nstrucc+ones $21 0F"

Pagina 22 / 44

Ejemplo:
1$#&.R$ D_cnt_emp number" D_tot_emp number" $G02 select count(*) +nto D_tot_emp 8rom employee" dbms_output.put_l+ne (;>ay un total de ;<<D_tot_emp<<; empleados.;)" select count(*) +nto D_cnt_emp 8rom employee 9*ere salaryOHJJJ" dbms_output.put_l+ne (;>ay ;<<D_cnt_emp<<; empleados Kue Banan mas de HJJJ P.;)" dbms_output.put_l+ne (;Resultado de la anal+s+s.;)" 0F (D_tot_empED_cnt_emp) t*en dbms_output.put_l+ne (;&os empleados Banan todos mas de HJJJ P;)" $&%0F (D_tot_empQD_cnt_emp*I) t*en dbms_output.put_l+ne (;Mas de la m+tad empleados Banan todos mas de HJJJ P;)" $&%$ dbms_output.put_l+ne (;Menos de la m+tad empleados Banan todos mas de HJJJ P;)" $21 0F" $21" (

4.5.2

Case

Es parecido al IF...elsif...else. Se menciona la variable a evaluar y luego los valores posibles con su cdigo apropiado. Ejemplo:
1$#&.R$ D_salary employee.salaryN'!P$" beB+n select salary +nto D_salary 8rom employee 9*ere emp_noERS" dbms_output.put_l+ne(;%alar+o?;<< D_salary)" case 9*en D_salaryEJ '>$2 dbms_output.put_l+ne(;Grat+sT;)" 9*en D_salaryQHJJJJ t*en dbms_output.put_l+ne(;%aladoT;)" 9*en D_salaryQUJJJJ t*en dbms_output.put_l+ne(;Mas o menos;)" 9*en D_salaryOEUJJJJ t*en dbms_output.put_l+ne(;#orrecto;)" end case" end" ( 1$#&.R$ D_job_Brade employee.job_BradeN'!P$" beB+n select job_Brade +nto D_job_Brade 8rom employee 9*ere emp_noEI" dbms_output.put_l+ne(;job_Brade?;<< D_job_Brade)" case D_job_Brade 9*en H '>$2 dbms_output.put_l+ne(;=e8eT;)" 9*en I t*en dbms_output.put_l+ne(;=e8ec+to;)" 9*en 3 t*en dbms_output.put_l+ne(;$mpleado reBular;)" $&%$ dbms_output.put_l+ne(;$sclaDo o d+os;)" end case" end" (

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 23 / 44

4.5.3

Goto

El GOTO reenvia de manera indondicional hacia una etiqueta (otra parte del cdigo). No aconsejo el uso del GOTO ya que complica el flujo y puede llavar a bucles infinitas. Al meno una instruccin debe seguir el GOTO (NULL se puede usar). Ejemplo:

$G02 GO'O mas_adelante" 1 M%_OU'PU'.PU'_&02$(;2unca se ejecutarV.;)"

QQmas_adelanteOO 1 M%_OUPU'.PU'_&02$(;.Ku+ estamos.;)" $21"

Un GOTO tiene algunas restriciones: Puede salir de un IF, LOOP, o sub-bloque No puede entrar en un IF, LOOP, o sub-bloque No puede mover de una seccin de un IF hacia otra seccin del IF No puede entrar ni salir de un sub-programa No puede pasar de una seccin ejecutable a una seccin de excepcin, ni vice versa.

4.6 Bucles
Una bucle permite repetir una accin un sin nmero de veces. Hay que tener cuidado en no crear bucles infinitas. En PL/SQL tenemos a nuestra disposicin los siguientes iteradores o bucles: * LOOP * WHILE * FOR 4.6.1

LOOP

El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instruccin EXIT. Su sintaxis es la siguiente LOOP -- Instrucciones IF (expresion) THEN -- Instrucciones EXIT; END IF; END LOOP; Ejemplo:
1$#&.R$ D_cnt P&%_02'$G$R 1$F.U&' J" $G02 &OOP D_cnt?ED_cnt)H" dbms_output.put_l+ne (;#ontador E ;<<D_cnt)" 0F (D_cntOEHJ) t*en dbms_output.put_l+ne (;!a mer+toT;)" e,+t" $21 0F" $21 &OOP" $21"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 24 / 44

4.6.2

WHILE

El bucle WHILE, se repite mientras que se cumpla expresion. WHILE (expresion) LOOP -- Instrucciones END LOOP; Ejemplo:
1$#&.R$ D_cnt P&%_02'$G$R 1$F.U&' J" $G02 D_cnt?EHJ" />0&$ (D_cntOJ) &OOP dbms_output.put_l+ne (;#ontador E ;<<D_cnt)" D_cnt?ED_cnt-H" $21 &OOP" $21"

4.6.3

FOR

El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final.
FOR contador 02 4R$C$R%$6 +n+c+o..8+nal &OOP -- 0nstrucc+ones $21 &OOP"

En el caso de especificar REVERSE el bucle se recorre en sentido inverso. Ejemplo:


1$#&.R$ D_cnt P&%_02'$G$R 1$F.U&' J" $G02 FOR D_cnt 02 R$C$R%$ H..HJ &OOP dbms_output.put_l+ne (;#ontador E ;<<D_cnt)" $21 &OOP" $21"

4.7 Exit
Permite salir de una bucle. Se puede mencionar una condicin de salida con WHEN. Ejemplo:

1$#&.R$ D_cnt +nteBer ?EJ" beB+n loop dbms_output.put_l+ne(D_cnt)" D_cnt?ED_cnt)H" e,+t 9*en D_cntEHJ" end loop" end"

4.8 NULL
NULL es un comando que no hace nada. Sirve por ejemplo a documentar una condicin que no hace nada, o rellenar una condicin que se implementar ms tarde.

4.9 EXECUTE IMMEDIATE


El comando EXECUTE IMMEDIATE permite ejecutar un comando SQL de manera dinmica.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 25 / 44

Hay que tratar de usarlo lo menos posible ya que el SQL dinmico se tiene que recompilar a cada ejecucin.

4.10Cursores
PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto por una instruccin SQL. Tcnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT. Podemos distinguir dos tipos de cursores: Cursores implicitos. Este tipo de cursores se utiliza para operaciones SELECT INTO, que se usa cuando la consulta devuelve un nico registro. Tambin se pueden usar mencionando el SELECT en el FOR LOOP, devolviendo un conjunto de registros, o cuando se hace un insert/ uodate/delete. Cursores explicitos. Son los cursores que son declarados y controlados por el programador. Se utilizan cuando la consulta devuelve un conjunto de registros. Ocasionalmente tambin se utilizan en consultas que devuelven un nico registro por razones de eficiencia. Son ms rpidos. Un cursor se define como cualquier otra variable de PL/SQL y debe nombrarse de acuerdo a los mismos convenios que cualquier otra variable. Los cursores implicitos no necesitan declaracin. Para procesar instrucciones SELECT que devuelvan ms de una fila, son necesarios cursores explicitos combinados con un estructura de bloque. Un cursor admite el uso de parmetros. Los parmetros deben declararse junto con el cursor. El siguiente diagrama representa como se procesa una instruccin SQL a travs de un cursor.

4.10.1.1 Atributos de cursores SQL%ISOPEN : True si el cursor esta abierto (entre open y close), SQL%FOUND : NULL antes de ejecutar TRUE si uno o mas registros fueron inserted, merged, updated, o deleted o si solo 1 registro fue seleccionado. FALSE si ningn registro fue seleccionado, merged, updated, inserted, o deleted. SQL%NOTFOUND NULL antes de ejecutar TRUE si ningn registro fue seleccionado, merged, updated, inserted, o deleted. FALSE si uno o mas registros fueron inserted, merged, updated, deleted o seleccionado. SQL%ROWCOUNT Cantidad de registros afectados por el cursor.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 26 / 44

Ejemplo de cursor implicito:


1$#&.R$ D_sal 2UM $R" $G02 %$&$#' sal 02'O D_sal FROM employee />$R$ empnoEW3RU" dbms_output.put_l+ne(;$l empleado numero W3RU t+ene un salar+o de ;<<D_sal<<; P;)" end" ( 1$#&.R$ c employeeNRO/'!P$" beB+n 8or c +n (select * 8rom employee) loop dbms_output.put_l+ne(c.8+rst_name)" end loop" end" (

Ejemplo de cursor explicito:


1$#&.R$ #UR%OR c_emp 0% (*#UR%OR*( select ename, sal 8rom employee" $G02 FOR 8+la 02 c_emp &OOP (*no es necesar+o de8+n+r la Dar+able 8+la, serV de t+po NRO/ *( dbms_output.put_l+ne(8+la.ename<<; t+ene un salar+o de ;<<8+la.sal)" $21 &OOP" $21" (

4.10.1.2 SELECT ... FOR UPDATE / WHERE CURRENT OF ... Normalmente Oracle bloquea los registros al momento de modificarlos. Usando el select... for update genera un bloqueo sobre todos los registros de la consulta. Where current of permite modificar el registro corriente. Ejemplo:
1$#&.R$ emp_rec employeeNRO/'!P$" cursor c_emp +s select * 8rom employee 8or update" $G02 OP$2 c_emp" &OOP F$'#> c_emp +nto emp_rec" $30' />$2 c_empN2O'FOU21 OR c_empNRO/#OU2' O HJ" UP1.'$ employee %$' salary E salary)S 9*ere current o8 c_emp" $21 &OOP" #&O%$ c_emp" $21"

Existen otros tipo de curso explicitos. Se mira en el curso PL/SQL avanzado. BULK COLLECT permite cargar a alta velocidad los datos (en una tabla PL/SQL). Usando FORALL mejora el rendimiento de cursores que hacen insert/update/delete.

4.11Excepciones
En PL/SQL una advertencia o condicin de error es llamada una excepcin.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 27 / 44

Los bloques de excepciones permiten atrapar errores de ejecucin y darles eventualmente un tratamiento para evitar que se pare el programa de manera anormal. Las excepciones se controlan dentro de su propio bloque. La estructura de bloque de una excepcin se muestra a continuacin.
1$#&.R$ -- 1eclarac+ones $G02 -- $jecuc+on $3#$P'0O2 -- $,cepc+on $21"

Cuando ocurre un error, se ejecuta la porcin del programa marcada por el bloque EXCEPTION, transfirindose el control a ese bloque de sentencias. El siguiente ejemplo muestra un bloque de excepciones que captura las excepciones NO_DATA_FOUND y ZERO_DIVIDE. Cualquier otra excepcion ser capturada en el bloque WHEN OTHERS THEN.
1$#&.R$ -- 1eclarac+ones $G02 -- $jecuc+on $3#$P'0O2 />$2 2O_1.'._FOU21 '>$2 -- %e ejecuta cuando ocurre una e,cepc+on de t+po 2O_1.'._FOU21 />$2 G$RO_10C01$ '>$2 -- %e ejecuta cuando ocurre una e,cepc+on de t+po G$RO_10C01$ />$2 O'>$R% '>$2 -- %e ejecuta cuando ocurre una e,cepc+on de un t+po no tratado -- en los bloKues anter+ores $21"

Como ya hemos dicho cuando ocurre un error, se ejecuta el bloque EXCEPTION, transfirindose el control a las sentencias del bloque. Una vez finalizada la ejecucin del bloque de EXCEPTION no se continua ejecutando el bloque anterior. Si existe un bloque de excepcin apropiado para el tipo de excepcin se ejecuta dicho bloque. Si no existe un bloque de control de excepciones adecuado al tipo de excepcin se ejecutar el bloque de excepcin WHEN OTHERS THEN (si existe!). WHEN OTHERS debe ser el ltimo manejador de excepciones. Las excepciones pueden ser definidas en forma interna o explcitamente por el usuario. Ejemplos de excepciones definidas en forma interna son la divisin por cero y la falta de memoria en tiempo de ejecucin. Estas mismas condiciones excepcionales tienen sus propio tipos y pueden ser referenciadas por ellos: ZERO_DIVIDE y STORAGE_ERROR. Las excepciones definidas por el usuario deben ser alcanzadas explcitamente utilizando la sentencia RAISE. Con las excepciones se pueden manejar los errores cmodamente sin necesidad de mantener mltiples chequeos por cada sentencia escrita. Tambin provee claridad en el cdigo ya que permite mantener las rutinas correspondientes al tratamiento de los errores de forma separada de la lgica del negocio. 4.11.1

Excepciones predefinidas

PL/SQL proporciona un gran nmero de excepciones predefinidas que permiten controlar las condiciones de error ms habituales.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 28 / 44

Las excepciones predefinidas no necesitan ser declaradas. Simplemente se utilizan cuando estas son lanzadas por algn error determinado. 4.11.1.1 Excepciones asociadas a los cursores implcitos. Los cursores implicitos slo pueden devolver una fila, por lo que pueden producirse determinadas excepciones. Las ms comunes que se pueden encontrar son no_data_found y too_many_rows. La siguiente tabla explica brevemente estas excepciones. NO_DATA_FOUND Se produce cuando una sentencia SELECT intenta recuperar datos pero ninguna fila satisface sus condiciones. Es decir, cuando "no hay datos" TOO_MANY_ROWS Dado que cada cursor implicito slo es capaz de recuperar una fila , esta excepcion detecta la existencia de ms de una fila. Ejemplo:

1$#&.R$ D_sal 2UM $R" $G02 $G02 %$&$#' salary 02'O D_sal FROM employee />$R$ emp_noEH" dbms_output.put_l+ne(;$l empleado numero H t+ene un salar+o de ;<<D_sal<<; P;)" $3#$P'0O2 />$2 2O_1.'._FOU21 '>$2 dbms_output.put_l+ne(;$l empleado numero H no e,+steT;)" $21" $G02 %$&$#' emp_no 02'O D_sal FROM employee />$R$ salaryOHJJJ" dbms_output.put_l+ne(;$l empleado Kue t+ene un salar+oOHJJJ P es el empleado numero;<<D_sal)" $3#$P'0O2 />$2 too_many_ro9s '>$2 dbms_output.put_l+ne(;>.! M.% 1$ U2 $MP&$.1O 7U$ G.2. M.% 1$ HJJJ PT;)" $21" $21"

4.11.1.2 Lista de excepciones predefinidas ACCESS_INTO_NULL El programa intent asignar valores a los atributos de un objeto no inicializado -6530 COLLECTION_IS_NULL El programa intent asignar valores a una tabla anidada an no inicializada -6531 CURSOR_ALREADY_OPEN El programa intent abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automticamente lo abre y ello no se debe especificar con la sentencia OPEN -6511 DUP_VAL_ON_INDEX El programa intent almacenar valores duplicados en una columna que se mantiene con restriccin de integridad de un ndice nico (unique index) -1 INVALID_CURSOR El programa intent efectuar una operacin no vlida sobre un cursor 1001 INVALID_NUMBER En una sentencia SQL, la conversin de una cadena de caracteres hacia un nmero falla cuando esa cadena no representa un nmero vlido -1722 LOGIN_DENIED El programa intent conectarse a Oracle con un nombre de usuario o password invlido -1017 NO_DATA_FOUND Una sentencia SELECT INTO no devolvi valores o el programa referenci un elemento no inicializado en una tabla indexada 100 NOT_LOGGED_ON El programa efectu una llamada a Oracle sin estar conectado -1012 PROGRAM_ERROR PL/SQL tiene un problema interno -6501 ROWTYPE_MISMATCH Los elementos de una asignacin (el valor a asignar y la variable que lo contendr) tienen tipos incompatibles. Tambin se presenta este error cuando un parmetro pasado a un subprograma no es del tipo esperado -6504
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 29 / 44

SELF_IS_NULL El parmetro SELF (el primero que es pasado a un mtodo MEMBER) es nulo -30625 STORAGE_ERROR La memoria se termin o est corrupta -6500 SUBSCRIPT_BEYOND_COUNT El programa est tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posicin ms grande que el nmero real de elementos de la coleccin -6533 SUBSCRIPT_OUTSIDE_LIMIT El programa est referenciando un elemento de un arreglo utilizando un nmero fuera del rango permitido (por ejemplo, el elemento -1) -6532 SYS_INVALID_ROWID La conversin de una cadena de caracteres hacia un tipo rowid fall porque la cadena no representa un nmero -1410 TIMEOUT_ON_RESOURCE Se excedi el tiempo mximo de espera por un recurso en Oracle -51 TOO_MANY_ROWS Una sentencia SELECT INTO devuelve ms de una fila -1422 VALUE_ERROR Ocurri un error aritmtico, de conversin o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable ms pequea -6502 ZERO_DIVIDE El programa intent efectuar una divisin por cero -1476 4.11.2

Excepciones definidas por el usuario

PL/SQL permite al usuario definir sus propias excepciones, las que debern ser declaradas y lanzadas explcitamente utilizando la sentencia RAISE. Las excepciones deben ser declaradas en el segmento DECLARE de un bloque, subprograma o paquete. Se declara una excepcin como cualquier otra variable, asignandole el tipo EXCEPTION. Las mismas reglas de alcance aplican tanto sobre variables como sobre las excepciones.
1$#&.R$ -- 1eclarac+ones My$,cepc+on $3#$P'0O2" $G02 -- $jecuc+on $3#$P'0O2 -- $,cepc+on $21"

4.11.2.1 Reglas de Alcance Una excepcion es vlida dentro de su ambito de alcance, es decir el bloque o programa donde ha sido declarada. Las excepciones predefinidas son siempre vlidas. Como las variables, una excepcin declarada en un bloque es local a ese bloque y global a todos los subbloques que comprende. 4.11.2.2 La sentencia RAISE La sentencia RAISE permite lanzar una excepcin en forma explcita. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepcin.
1$#&.R$ -- 1eclaramos una e,cepc+on +dent+8+cada por C.&OR_2$G.'0CO C.&OR_2$G.'0CO $3#$P'0O2" Dalor 2UM $R" $G02 -- $jecuc+on Dalor ?E -H" 0F Dalor Q J '>$2 R.0%$ C.&OR_2$G.'0CO" $21 0F" $3#$P'0O2 -- $,cepc+on />$2 C.&OR_2$G.'0CO '>$2 dbms_output.put_l+ne(;$l Dalor no puede ser neBat+Do;)" $21"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 30 / 44

Con la sentencia RAISE podemos lanzar una excepcin definida por el usuario o predefinida, siendo el comportamiento habitual lanzar excepciones definidas por el usuario. Recordar la existencia de la excepcin OTHERS, que simboliza cualquier condicin de excepcin que no ha sido declarada. Se utiliza comnmente para controlar cualquier tipo de error que no ha sido previsto. En ese caso, es comn observar la sentencia ROLLBACK en el grupo de sentencias de la excepcin o alguna de las funciones SQLCODE SQLERRM, que se detallan en el prximo punto. 4.11.2.3 Uso de SQLCODE y SQLERRM Al manejar una excepcin es posible usar las funciones predefinidas SQLCode y SQLERRM para aclarar al usuario la situacin de error acontecida. SQLcode devuelve el nmero del error de Oracle y un 0 (cero) en caso de exito al ejecutarse una sentencia SQL. Por otra parte, SQLERRM devuelve el correspondiente mensaje de error. Estas funciones son muy tiles cuando se utilizan en el bloque de excepciones, para aclarar el significado de la excepcin OTHERS. Estas funciones no pueden ser utilizadas directamente en una sentencia SQL, pero s se puede asignar su valor a alguna variable de programa y luego usar esta ltima en alguna sentencia.
1$#&.R$ err_num 2UM $R" err_msB C.R#>.RI(ISS)" result 2UM $R" $G02 %$&$#' H(J 02'O result FROM 1U.&" $3#$P'0O2 />$2 O'>$R% '>$2 err_num ?E %7&#O1$" err_msB ?E %7&$RRM" 1 M%_OU'PU'.put_l+ne(;$rror?;<<'O_#>.R(err_num))" 1 M%_OU'PU'.put_l+ne(err_msB)" $21"

Tambin es posible entregarle a la funcin SQLERRM un nmero negativo que represente un error de Oracle y sta devolver el mensaje asociado.
1$#&.R$ msB C.R#>.RI(ISS)" $G02 msB ?E %7&$RRM(-HXJ3)" 1 M%_OU'PU'.put_l+ne(M%G)" $21"

4.11.3

RAISE_APPLICATION_ERROR

En ocasiones queremos enviar un mensaje de error personalizado al producirse una excepcin PL/SQL. Para ello es necesario utilizar la instruccion RAISE_APPLICATION_ERROR; La sintaxis general es la siguiente: RAISE_APPLICATION_ERROR(<error_num>,<mensaje>); Siendo: * error_num es un entero negativo comprendido entre -20001 y -20999 * mensaje la descripcion del error
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 31 / 44

Ejemplo:
1$#&.R$ D_d+D 2UM $R" $G02 %$&$#' H(J 02'O D_d+D FROM 1U.&" $3#$P'0O2 />$2 O'>$R% '>$2 R.0%$_.PP&0#.'0O2_$RROR(-IJJJH,;2o se puede d+D+d+r por cero;)" $21"

4.12Procedimientos, funciones, paquetes, disparadores


Son objetos PL/SQL residentes en el servidor PL/SQL. 4.12.1

Funciones

Una funcin es un cdigo compilados en el servidor, que se ejecutan en local, y que pueden aceptar parmetros de entrada y tiene un solo parmetro de salido. Una funcin SIEMPRE debe regresar un valor. Una funcin se puede usar en otro cdigo PL/SQL, o en SQL ya sea en un SELECT, una clausula WHERE, CONNECT BY, START WITH, ORDER BY, GROUP BY, como VALUES en un INSERT, o como SET en un UPDATE. 4.12.1.1 Funciones predefinidas PL/SQL tiene un gran nmero de funciones incorporadas, sumamente tiles. A continuacin vamos a ver algunas de las ms utilizadas. SYSDATE Devuelve la fecha del sistema: SELECT SYSDATE FROM DUAL; NVL Devuelve el valor recibido como parmetro en el caso de que expresin sea NULL,o expresin en caso contrario.
2C&(Qe,pres+onO, QDalorO)

El siguiente ejemplo devuelve 0 si el precio es nulo, y el precio cuando est informado:


%$&$#' #O_PRO1U#'O, 2C&(PR$#0O, J) FROM PR$#0O%"

DECODE Decode proporciona la funcionalidad de una sentencia de control de flujo if-elseif-else.


1$#O1$(Qe,prO, QcondHO, QDalHO4, ..., Qcond2O, QDal2O6, Qde8aultO)

Esta funcin evala una expresin "<expr>", si se cumple la primera condicin "<cond1>" devuelve el valor1 "<val1>", en caso contrario evala la siguiente condicin y as hasta que una de las condiciones se cumpla. Si no se cumple ninguna condicin se devuelve el valor por defecto. Es muy comn escribir la funcin DECODE identada como si se tratase de un bloque IF.
%$&$#' 1$#O1$ (co_pa+s, (* $,pres+on a eDaluar *( ;$%P;, ;$%P.Y.;, (* %+ co_pa+s E ;$%P; EEO ;$%P.Y.; *( ;M$3;, ;M$30#O;, (* %+ co_pa+s E ;M$3; EEO ;M$30#O; *( ;P.0% ;<<co_pa+s)(* $&%$ EEO concatena *( FROM P.0%$%"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 32 / 44

TO_DATE Convierte una expresin al tipo fecha. El parmetro opcional formato indica el formato de entrada de la expresin no el de salida.
'O_1.'$(Qe,pres+onO, 4Q8ormatoO6)

En este ejemplo convertimos la expresion '01/12/2006' de tipo CHAR a una fecha (tipo DATE). Con el parmetro formato le indicamos que la fecha est escrita como da-mes-ao para que devuelve el uno de diciembre y no el doce de enero.
%$&$#' 'O_1.'$(;JH(HI(IJJR;, ;11(MM(!!!!;) FROM 1U.&"

Este otro ejemplo muestra la conversin con formato de da y hora.


%$&$#' 'O_1.'$(;3H(HI(IJJR I3?SU?SU;, ;11(MM(!!!! >>IX?M0?%%;) FROM 1U.&" Parameter !$.R !!!! !!! !! ! 0!! 0! 0 0!!! RRRR 7 MM MO2 MO2'> RM // / 0/ 1 1.! 11 111 1! = >> >>HI >>IX M0 !ear, spelled out X-d+B+t year &ast 3, I, or H d+B+t(s) o8 year. Explanation

&ast 3, I, or H d+B+t(s) o8 0%O year. X-d+B+t year based on t*e 0%O standard .ccepts a I-d+B+t year and returns a X-d+B+t year. . Dalue bet9een J-XU 9+ll return a IJ,, year. . Dalue bet9een SJ-UU 9+ll return a HU,, year. 7uarter o8 year (H, I, 3, X" =.2-M.R E H). Mont* (JH-HI" =.2 E JH). .bbreD+ated name o8 mont*. 2ame o8 mont*, padded 9+t* blan:s to lenBt* o8 U c*aracters. Roman numeral mont* (0-300" =.2 E 0). /ee: o8 year (H-S3) 9*ere 9ee: H starts on t*e 8+rst day o8 t*e year and cont+nues to t*e seDent* day o8 t*e year. /ee: o8 mont* (H-S) 9*ere 9ee: H starts on t*e 8+rst day o8 t*e mont* and ends on t*e seDent*. /ee: o8 year (H-SI or H-S3) based on t*e 0%O standard. 1ay o8 9ee: (H-W). 2ame o8 day. 1ay o8 mont* (H-3H). 1ay o8 year (H-3RR). .bbreD+ated name o8 day. =ul+an day" t*e number o8 days s+nce =anuary H, XWHI >our o8 day (H-HI). >our o8 day (H-HI). >our o8 day (J-I3). M+nute (J-SU). #.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


%% %%%%% FF .M, ..M., PM, or P.M. .1 or ..1 # or 'G1 'G> 'GM 'GR .#. %econd (J-SU). %econds past m+dn+B*t (J-MR3UU). Fract+onal seconds. Use a Dalue 8rom H to U a8ter FF to +nd+cate t*e number o8 d+B+ts +n t*e 8ract+onal seconds. For e,ample, ;FFX;. Mer+d+an +nd+cator .1 +nd+cator # +nd+cator 1ayl+B*t saD+nBs +n8ormat+on. For e,ample, ;P%'; '+me Zone *our. '+me Zone m+nute. '+me Zone reB+on.

Pagina 33 / 44

TO_CHAR Convierte una expresin al tipo CHAR. El parmetro opcional formato indica el formato de salida de la expresin.
'O_#>.R(Qe,pres+onO, 4Q8ormatoO6) %$&$#' 'O_#>.R(%!%1.'$, ;11(MM(!!!!!;) FROM 1U.&"

TO_NUMBER Convierte una expresion alfanumrica en numerica. Opcionalmente podemos especificar el formato de salida.
'O_2UM $R(Qe,pres+onO, 4Q8ormatoO6) %$&$#' 'O_2UM $R (;HJ;) FROM 1U.&"

TRUNC Trunca una fecha o nmero. Si el parmetro recibido es una fecha elimina las horas, minutos y segundos de la misma.
%$&$#' 'RU2#(%!%1.'$)FROM 1U.&"

Si el parmetro es un nmero devuelve la parte entera.


%$&$#' 'RU2#(U.UU)FROM 1U.&"

LENGTH Devuelve la longitud de un tipo CHAR.


%$&$#' &$2G'>(;>O&. MU21O;)FROM 1U.&"

INSTR Busca una cadena de caracteres dentro de otra. Devuelve la posicion de la ocurrencia de la cadena buscada. Su sintaxis es la siguiente: 02%'R(Qc*arO,
%$&$#' 02%'R(;.7U0 $% 1O21$ %$ FROM 1U.&" Qsearc*_str+nBO, QstartposO, QoccurrenceO ) U%#.;, ; U%#.;, H, H )

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 34 / 44

REPLACE Reemplaza un texto por otro en un expresion de busqueda.


R$P&.#$(Qe,pres+onO, QbusKuedaO, QreemplaZoO)

El siguiente ejemplo reemplaza la palabra 'HOLA' por 'VAYA' en la cadena 'HOLA MUNDO'.
%$&$#' R$P&.#$ (;>O&. MU21O;,;>O&.;, ;C.!.;)-- deDuelDe C.!. MU21O FROM 1U.&"

SUBSTR Obtiene una parte de una expresion, desde una posicin de inicio hasta una determinada longitud.
%U %'R(Qe,pres+onO, Qpos+c+on_+n+O, QlonB+tudO ) %$&$#' %U %'R(;>O&. MU21O;, R, S) -- 1eDuelDe MU21O FROM 1U.&"

UPPER Convierte una expresion alfanumerica a maysculas.


%$&$#' UPP$R(;*ola mundo;) -- 1eDuelDe >O&. MU21O FROM 1U.&"

LOWER Convierte una expresion alfanumerica a minsculas.


%$&$#' &O/$R(;>O&. MU21O;) -- 1eDuelDe *ola mundo FROM 1U.&"

ROWIDTOCHAR Convierte un ROWID a tipo caracter.


%$&$#' RO/01'O#>.R(RO/01) FROM 1U.&"

RPAD Aade N veces una determinada cadena de caracteres a la derecha una expresin. Muy util para generar ficheros de texto de ancho fijo.
RP.1(Qe,pres+onO, QlonB+tudO, Qpad_str+nBO )

El siguiente ejemplo aade puntos a la expresion 'Hola mundo' hasta alcanzar una longitud de 50 caracteres.
%$&$#' RP.1(;>ola Mundo;, SJ, ;.;) FROM 1U.&"

LPAD Aade N veces una determinada cadena de caracteres a la izquierda de una expresin. Muy util para generar ficheros de texto de ancho fijo.
&P.1(Qe,pres+onO, QlonB+tudO, Qpad_str+nBO )

El siguiente ejemplo aade puntos a la expresion 'Hola mundo' hasta alcanzar una longitud de 50 caracteres.
%$&$#' &P.1(;>ola Mundo;, SJ, ;.;) FROM 1U.&"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 35 / 44

RTRIM Elimina los espacios en blanco a la derecha de una expresion


%$&$#' R'R0M (;>ola Mundo FROM 1U.&" ;)

LTRIM Elimina los espacios en blanco a la izquierda de una expresion


%$&$#' &'R0M (; FROM 1U.&" >ola Mundo;)

TRIM Elimina los espacios en blanco a la izquierda y derecha de una expresion


%$&$#' 'R0M (; FROM 1U.&" >ola Mundo ;)

MOD Devuelve el resto de la divisin entera entre dos nmeros.


MO1(Qd+D+dendoO, Qd+D+sorO ) %$&$#' MO1(IJ,HS) -- 1eDuelDe el modulo de d+D+d+r IJ(HS FROM 1U.&

4.12.1.2 Funciones definidas por el usuario La sintaxis para construir funciones es la siguiente:
#R$.'$ 4OR R$P&.#$6 FU2#'0O2 Q8n_nameO4(QparamHO 02 QtypeO, QparamIO 02 QtypeO, ...)6 R$'UR2 Qreturn_typeO 0% result Qreturn_typeO" $G02 return(result)" 4$3#$P'0O26 -- %entenc+as control de e,cepc+on $21 4Q8n_nameO6"

El uso de OR REPLACE permite sobreescribir una funcin existente. Si se omite, y la funcin existe, se producir, un error. La sintaxis de los parmetros es la misma que en los procedimientos almacenado, exceptuando que solo pueden ser de entrada. Ejemplo:
create table emp as select * 8rom employee" #R$.'$ OR R$P&.#$ FU2#'0O2 8n_Obtener_%alar+o(p_empno 2UM $R) R$'UR2 2UM $R 0% result 2UM $R" $G02 %$&$#' salary 02'O result FROM employee />$R$ emp_no E p_empno" return(result)" $3#$P'0O2 />$2 2O_1.'._FOU21 '>$2 return J" $21 "

Si el sistema nos indica que el la funcin se ha creado con errores de compilacin podemos ver estos errores de compilacion con la orden SHOW ERRORS en SQL *Plus.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 36 / 44

Las funciones pueden utilizarse en sentencias SQL de manipulacin de datos (SELECT, UPDATE, INSERT y DELETE):
%$&$#' emp_no, 8name, 8n_Obtener_%alar+o( emp_no) FROM employee"

4.12.2

Procedimientos

Los procedimientos son cdigos compilados en el servidor, que se ejecutan en el servidor, y que pueden aceptar parmetros de entrada y/o de salida. Un procedimiento se puede usar en un select, pero no en un where clause. Un procedimiento tiene un nombre, un conjunto de parmetros (opcional) y un bloque de cdigo. La sintaxis de un procedimiento almacenado es la siguiente:
#R$.'$ 4OR R$P&.#$6 PRO#$1UR$ Qprocedure_nameO 4(QparamHO 402<OU'<02 OU'6 QtypeO, QparamIO 402<OU'<02 OU'6 QtypeO, ...)6 0% -- 1eclarac+on de Dar+ables locales $G02 -- %entenc+as 4$3#$P'0O26 -- %entenc+as control de e,cepc+on $21 4Qprocedure_nameO6"

El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el procedimiento existe, se producir, un error. La sintaxis es muy parecida a la de un bloque annimo, salvo porque se reemplaza la seccin DECLARE por la secuencia PROCEDURE ... IS en la especificacin del procedimiento. Debemos especificar el tipo de datos de cada parmetro. Al especificar el tipo de dato del parmetro no debemos especificar la longitud del tipo. Los parmetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El valor por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada.
create or replace PRO#$1UR$ .ctual+Za_%alar+o(p_empno 2UM $R, p_ne9_salar+o 2UM $R) 0% -- 1eclarac+on de Dar+ables locales $G02 -- %entenc+as UP1.'$ employee %$' salary E p_ne9_salar+o, *+re_date E %!%1.'$ />$R$ emp_no E p_empno" $21 .ctual+Za_%alar+o"

Tambin podemos asignar un valor por defecto a los parmetros, utilizando la clausula DEFAULT o el operador de asigancin (:=) .
create or replace PRO#$1UR$ .ctual+Za_%alar+o(p_empno 2UM $R, p_ne9_salar+o 2UM $R 1$F.U&' SJJ) 0% ... $21 .ctual+Za_%alar+o"

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 37 / 44

Una vez creado y compilado el procedimiento almacenado podemos ejecutarlo. Si el sistema nos indica que el procedimiento se ha creado con errores de compilacin podemos ver estos errores de compilacin con la orden SHOW ERRORS en SQL *Plus. Existen dos formas de pasar argumentos a un procedimiento almacenado a la hora de ejecutarlo (en realidad es vlido para cualquier subprograma). Estas son: * Notacin posicional: Se pasan los valores de los parmetros en el mismo orden en que el procedure los define.
$G02 .ctual+Za_%alar+o(W3RU,ISJJ)" #OMM0'" $21"

* Notacin nominal:Se pasan los valores en cualquier orden nombrando explicitamente el parmetro.
$G02 .ctual+Za_%alar+o(p_empno EO W3RU,p_ne9_salar+o #OMM0'" $21" EO ISJJ)"

4.12.3

Paquetes

Un paquete es un conjunto de funciones y/o procedimiento. Permite facilitar la administracin de los cdigos (agrupaciones), y la seguridad (a nivel de paquete en vez de por funcin/procedimiento). En el paquete se pueden definir variable de alcance de todo el paquete (global variables). Lo primero que debemos tener en cuenta es que los paquetes estn formados por dos partes: la especificacin y el cuerpo. La especificacin del un paquete y su cuerpo se crean por separado. La especificacin es la interfaz con las aplicaciones. En ella es posible declarar los tipos, variables, constantes, excepciones, cursores y subprogramas disponibles para su uso posterior desde fuera del paquete. En la especificacin del paquete slo se declaran los objetos (procedures, funciones, variables ...), no se implementa el cdigo. Los objetos declarados en la especificacin del paquete son accesibles desde fuera del paquete por otro script de PL/SQL o programa. Para crear la especificacin de un paquete la sintaxis general es la siguiente:
#R$.'$ 4OR R$P&.#$6 P.#F.G$ Qp:B2ameO 0% -- 1eclarac+ones de t+pos y reB+stros p[bl+cas @4'!P$ Q'ype2ameO 0% Q1atatypeO"6A -- 1eclarac+ones de Dar+ables y constantes publ+cas -- 'amb+\n podemos declarar cursores @4Q#onstant2ameO #O2%'.2' Q1atatypeO ?E QDalorO"6A @4QCar+able2ameO Q1atatypeO"6A -- 1eclarac+ones de proced+m+entos y 8unc+ones p[bl+cas @4FU2#'0O2 QFunct+on2ameO(QParameterO Q1atatypeO,...) R$'UR2 Q1atatypeO"6A @4PRO#$1UR$ QProcedure2ameO(QParameterO Q1atatypeO, ...)"6A $21 Qp:B2ameO"

El cuerpo es la implementacin del paquete. El cuerpo del paquete debe implementar lo que se declar inicialmente en la especificacin. Es el donde debemos escribir el cdigo de los subprogramas. En el cuerpo de un package podemos declarar nuevos subprogramas y tipos, pero estos sern privados para el propio package.
Copyright Cdric Simon, 2008 Versin 1.1 Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 38 / 44

La sintaxis general para crear el cuerpo de un paquete es muy parecida a la de la especificacin, tan solo se aade la palabra clave BODY, y se implementa el cdigo de los subprogramas.
#R$.'$ 4OR R$P&.#$6 P.#F.G$ O1! Qp:B2ameO 0% -- 1eclarac+ones de t+pos y reB+stros pr+Dados @4'!P$ Q'ype2ameO 0% Q1atatypeO"6A -- 1eclarac+ones de Dar+ables y constantes pr+Dadas -- 'amb+\n podemos declarar cursores @4Q#onstant2ameO #O2%'.2' Q1atatypeO ?E QDalorO"6A @4QCar+able2ameO Q1atatypeO"6A -- 0mplementac+on de proced+m+entos y 8unc+ones FU2#'0O2 QFunct+on2ameO(QParameterO Q1atatypeO,...) R$'UR2 Q1atatypeO 0% -- Car+ables locales de la 8unc+on $G02 -- 0mplementeac+on de la 8unc+on return(QResultO)" 4$3#$P'0O26 -- #ontrol de e,cepc+ones $21" PRO#$1UR$ QProcedure2ameO(QParameterO Q1atatypeO, ...) 0% -- Car+ables locales de la 8unc+on $G02 -- 0mplementac+on de proced+m+ento 4$3#$P'0O26 -- #ontrol de e,cepc+ones $21" $21 Qp:B2ameO"

Es posible modificar el cuerpo de un paquete sin necesidad de alterar por ello la especificacin del mismo. Los paquetes pueden llegar a ser programas muy complejos y suelen almacenar gran parte de la lgica de negocio. Ejemplo: 4.12.3.1 Paquetes de Oracle Oracle incluye varios paquetes 'preparados'. Se instalan automticamente cuando de instala una nueva base de datos con los script regulares. Algunos paquetes solo son disponibles mediante la ejecucin de script adicionales o la instalacin de herramientas adicionales. Ejemplo:
dbms_output.put_l+ne()"

4.12.4

Disparadores

Los disparadores (triggers). Un disparador es un codigo que dispara cada vez que se ha modificado el dato de una tabla. Puede disparar a nivel de la consulta, o a nivel de cada lnea afectada por la consulta. tambin puede disparar antes o despus de la consulta, y solo por ciertos tipos de consulta (insert/update/delete), y eventualmente solo cuando cierto(s) campo(s) estan afectados(s).

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 39 / 44

Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de una determinada instruccin SQL (una operacin DML: INSERT, UPDATE o DELETE) sobre dicha tabla. La sintaxis para crear un trigger es la siguiente:
#R$.'$ 4OR R$P&.#$6 'R0GG$R Qnombre_tr+BBerO @ $FOR$<.F'$RA @1$&$'$<02%$R'<UP1.'$ 4OF colH, colI, ..., col26 4OR @1$&$'$<02%$R'<UP1.'$ 4OF colH, colI, ..., col26...6A O2 Qnombre_tablaO 4FOR $.#> RO/ 4/>$2 (Qcond+c+onO)66 1$#&.R$ -- Dar+ables locales $G02 -- %entenc+as 4$3#$P'0O26 -- %entenc+as control de e,cepc+on $21 Qnombre_tr+BBerO"

El uso de OR REPLACE permite sobreescribir un trigger existente. Si se omite, y el trigger existe, se producir, un error. Los triggers pueden definirse para las operaciones INSERT, UPDATE o DELETE, y pueden ejecutarse antes o despus de la operacin. El modificador BEFORE AFTER indica que el trigger se ejecutar antes o despues de ejecutarse la sentencia SQL definida por DELETE INSERT UPDATE. Si incluimos el modificador OF el trigger solo se ejecutar cuando la sentencia SQL afecte a los campos incluidos en la lista. El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH ROW indica que el trigger se disparar cada vez que se realizan operaciones sobre una fila de la tabla. Si se acompaa del modificador WHEN, se establece una restriccin; el trigger solo actuar, sobre las filas que satisfagan la restriccin. La siguiente tabla resume los contenidos anteriores. INSERT, DELETE, UPDATE Define qu tipo de orden DML provoca la activacin del disparador. BEFORE , AFTER Define si el disparador se activa antes o despus de que se ejecute la orden. FOR EACH ROW Los disparadores con nivel de fila se activan una vez por cada fila afectada por la orden que provoc el disparo. Los disparadores con nivel de orden se activan slo una vez, antes o despus de la orden. Los disparadores con nivel de fila se identifican por la clusula FOR EACH ROW en la definicin del disparador. La clusula WHEN slo es vlida para los disparadores con nivel de fila. Dentro del ambito de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despus (NEW) de la accin SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se estn insertando, actualizando o borrando. El siguiente ejemplo muestra un trigger que inserta un registro en la tabla EMP_AUDIT cada vez que modificamos el salario de un registro en la tabla emp:
#reate table emp_aud+t (emp_no number not null, 8ec*a date not null, msB Darc*arI(SJJ) not null)" create or replace 'R0GG$R 'R_$MP_.U

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


.F'$R UP1.'$ O2 $MP&O!$$ FOR $.#> RO/ />$2 (O&1.salaryQO2$/.salary) 1$#&.R$ -- local Dar+ables $G02 02%$R' 02'O emp_aud+t (emp_no,8ec*a,msB) C.&U$% (?2$/.emp_no,%!%1.'$,;%alar+o mod+8+cado de ;<<?old.salary<<; a ;<<?ne9.salary)" $21 "

Pagina 40 / 44

El trigger se ejecutar cuando sobre la tabla EMP se ejecute una sentencia UPDATE que modifica el salario. Ejemplo:
$G02 .ctual+Za_%alar+o(p_empno EO W3RU,p_ne9_salar+o #OMM0'" $21" EO ISJJ)"

4.12.4.1 Orden de ejecucin de los triggers Una misma tabla puede tener varios triggers. En tal caso es necesario conocer el orden en el que se van a ejecutar. Los disparadores se activan al ejecutarse la sentencia SQL. * Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de orden. * Para cada fila a la que afecte la orden: o Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila. o Se ejecuta la propia orden. o Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila. * Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden. 4.12.4.2 Restricciones de los triggers El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es legal en el cuerpo de un disparador, con las siguientes restricciones: * Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o SAVEPOINT. El disparador se activa como parte de la ejecucin de la orden que provoc el disparo, y forma parte de la misma transaccin que dicha orden. Cuando la orden que provoca el disparo es confirmada o cancelada, se confirma o cancela tambin el trabajo realizado por el disparador. * Por razones idnticas, ningn procedimiento o funcin llamado por el disparador puede emitir rdenes de control de transacciones. * El cuerpo del disparador no puede contener ninguna declaracin de variables LONG o LONG RAW 4.12.4.3 Utilizacin de :OLD y :NEW Dentro del ambito de un trigger disponemos de las variables OLD y NEW . Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la accin SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se estn insertando, actualizando o borrando. La siguiente tabla muestra los valores de OLD y NEW.

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 41 / 44

ACCION SQL OLD INSERT UPDATE DELETE No definido; todos los campos toman valor NULL. Valores originales de la fila, antes de la actualizacin. Valores, antes del borrado de la fila.

NEW Valores que sern insertados cuando se complete la orden. Nuevos valores que sern escritos cuando se complete la orden. No definidos; todos los campos toman el valor NULL.

Los registros OLD y NEW son slo vlidos dentro de los disparadores con nivel de fila. Podemos usar OLD y NEW como cualquier otra variable PL/SQL. Utilizacin de predicados de los triggers: INSERTING, UPDATING y DELETING Dentro de un disparador en el que se disparan distintos tipos de rdenes DML (INSERT, UPDATE y DELETE), hay tres funciones booleanas que pueden emplearse para determinar de qu operacin se trata. Estos predicados son INSERTING, UPDATING y DELETING. Su comportamiento es el siguiente: INSERTING TRUE si la orden de disparo es INSERT; FALSE en otro caso. UPDATING TRUE si la orden de disparo es UPDATE; FALSE en otro caso. DELETING TRUE si la orden de disparo es DELETE; FALSE en otro caso. Sintaxis completa:

#R$.'$ 4OR R$P&.#$6 'R0GG$R 4sc*ema.6tr+BBer $FOR$ eDent 4/>$2 (cond+t+on)6 @pl_sKl_bloc: < call_procedure_statementA #R$.'$ 4OR R$P&.#$6 'R0GG$R 4sc*ema.6tr+BBer .F'$R eDent 4/>$2 (cond+t+on)6 @pl_sKl_bloc: < call_procedure_statementA #R$.'$ 4OR R$P&.#$6 'R0GG$R 4sc*ema.6tr+BBer 02%'$.1 OF eDent 4/>$2 (cond+t+on)6 @pl_sKl_bloc: < call_procedure_statementA

eDent can be one or more o8 t*e 8ollo9+nB (separate mult+ple eDents 9+t* OR) 1$&$'$ eDent_re8 re8erenc+nB_clause 02%$R' eDent_re8 re8erenc+nB_clause UP1.'$ eDent_re8 re8erenc+nB_clause UP1.'$ OF column, column... eDent_re8 db(ddl_eDent O2 4sc*ema.object6 db(ddl_eDent O2 1.'. .%$ eDent_re8? O2 4sc*ema.6table O2 4sc*ema.6D+e9 O2 42$%'$1 '. &$ nested_table_column OF6 4sc*ema.6D+e9 re8erenc+nB_clause? FOR $.#> RO/ R$F$R$2#02G O&1 4.%6 old 4FOR $.#> RO/6 R$F$R$2#02G 2$/ 4.%6 ne9 4FOR $.#> RO/6 R$F$R$2#02G P.R$2' 4.%6 parent 4FOR $.#> RO/6 db(ddl_eDent?

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)


.&'$R .2.&!%$ .%%O#0.'$ %'.'0%'0#% .U10' #OMM$2' #R$.'$ 11& 10%.%%O#0.'$ %'.'0%'0#% 1ROP GR.2' &OGO2 &OGOFF 2O.U10' R$2.M$ R$COF$ 'RU2#.'$ %$RC$R$RROR %'.R'UP %>U'1O/2 %U%P$21 Mult+ple db(ddl_eDents can be separated 9+t* OR Mult+ple O&1, 2$/ and P.R$2' correlat+on names can be de8+ned +n one R$F$R$2#02G clause. 1atabase constra+nts are a 8actor o8 M, 8aster t*an tr+BBers.

Pagina 42 / 44

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 43 / 44

5 Ejercicios
1. Crear una funcin que agrega 10 al valor pasado en parmetro y regresa el resultado 2. Crear un procedimiento que inserta un nuevo empleado 3. Crear un paquete con procedimiento para modificar un empleado, y una funcin para obtener la fecha de nacimiento del empleado 4. Usar los procedimientos/funciones en select 5. Crear un trigger que genera la clave primaria del empleado basado en una secuencia

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

Curso de SQL avanzado y PL/SQL bsico para Oracle 10g (10.2)

Pagina 44 / 44

6 Diseo de la base de datos

Copyright Cdric Simon, 2008

Versin 1.1

Reproduccin prohibida

También podría gustarte