Sie sind auf Seite 1von 166

PL/SQL I

PL/SQL I
Javier Prez-Vigo (Octubre 1999)

VERSIN 1

JPV-99

1 / 67

PL/SQL I

INTRODUCCIN
ORACLE es un sistema de base de datos relacional potente y flexible. El lenguaje de programacin PL/SQL est diseado para manipular los datos desde distintos entornos. PL/SQL est integrado con el servidor de bases de datos y est en algunas herramientas de cliente ORACLE, (Developer). Su conocimiento es imprescindible para la manipulacin de informacin almacenada en bases de datos ORACLE y para el desarrollo de cualquier aplicacin en ese entorno. En esta unidad didctica se definen las principales caractersticas de este lenguaje y su sintaxis, se enumeran las principales funciones predefinidas. As mismo se estudian las rdenes SQL disponibles: de control, de manipulacin de datos y transaccionales. Posteriormente se introduce el concepto de cursor y por ltimo se explica cmo se disea el tratamiento de errores.

VERSIN 1

JPV-99

2 / 67

PL/SQL I

CONTENIDO 1. 2. DEFINICIN Y CARACTERSTICAS DE PL/SQL EL BLOQUE PL/SQL ZONA DE DECLARACIN: DECLARACIN DE VARIABLES Y CONSTANTES ZONA DE PROCESO ZONA DE EXCEPCIONES 3. FUNCIONES SQL PREDEFINIDAS FUNCIONES DE CARCTER QUE DEVUELVEN VALORES DE CARCTER FUNCIONES DE CARCTER QUE DEVUELVEN VALORES NUMRICOS FUNCIONES NUMRICAS FUNCIONES DE FECHA FUNCIONES DE CONVERSIN FUNCIONES DE GRUPO OTRAS FUNCIONES 4. 5. 6 SENTENCIAS DE CONTROL SENTENCIAS DE DML CURSORES MANEJO DE CURSORES BUCLES SOBRE CURSORES EJEMPLO DE CURSORES 7. REGISTROS Y TABLAS REGISTROS PL/SQL TABLAS EN PL/SQL 8. 9 10 11 SENTENCIAS TRANSACCIONALES CONTROL DE ERRORES RESUMEN EVALUACIN

VERSIN 1

JPV-99

3 / 67

PL/SQL I

OBJETIVOS
El alumno tras el estudio de esta unidad didctica podr: Conocer la sintaxis y los elementos que componen el lenguaje PL/SQL. Consultar y manipular la informacin almacenada en servidores de Bases de Datos Oracle. Desarrollar estructuras bsicas de programacin en PL/SQL.

EXPECTATIVAS

VERSIN 1

JPV-99

4 / 67

PL/SQL I

1. DEFINICIN Y CARACTERSTICAS DE PL/SQL

IMPORTANTE

PL/SQL, (Procedural Language / SQL), es un lenguaje de programacin procedural estructurado en bloques que amplia la funcionalidad del lenguaje standard SQL a travs de estructuras como: Variables y tipos, (predefinidos y definidos por el usuario) Estructuras de control, (bucles y condiciones) Procedimientos y funciones Tipos de objetos y mtodos, (a partir de versin 8)

Combina la flexibilidad de SQL con la potencia y configurabilidad de un 3GL al integrar tanto las necesarias estructuras procedimentales como el acceso a bases de datos. Nos permite utilizar tcnicas procedurales como bucles, control de flujo, tratamiento de variables y control de errores en el procesamiento de las filas devueltas en una SELECT. Permite tener cdigo ejecutable almacenado en el servidor de base de datos.

NOTA

DQL. Data Query Language

(select)

DML Data manipulation language (insert) DDL Data definition language (create table)

VERSIN 1

JPV-99

5 / 67

PL/SQL I

NOTA

La versin objeto de estudio ser la 2.3.

Es un lenguaje estructurado en bloques: Bloque es la unidad bsica en PL/SQL Incorpora sentencias DML (INSERT, UPDATE, DELETE) Maneja diversas estructuras de datos (registros, arrays) Dispone de: Procedimientos y funciones (igual que en C por ejemplo). Paquetes (Grupos de identificadores, variables y funciones y/o procedimientos agrupados en una misma construccin, cuya finalidad es el encapsulamiento, la abstraccin y el control de acceso). Disparadores (Eventos que se ejecutan cuando ocurre una operacin de manipulacin de datos sobre una tabla)

NOTA

Tambin se pueden incorporar rdenes DDL mediante SQL Dinmico.

VERSIN 1

JPV-99

6 / 67

PL/SQL I

2. EL BLOQUE PL/SQL

IMPORTANTE

El Bloque PL/SQL es la unidad bsica en todo programa PL/SQL. Un programa PL/SQL ser un conjunto de bloques PL/SQL, situados de manera secuencial o anidados

Todos los bloques tienen tres secciones diferenciadas: Seccin declarativa. Seccin ejecutable, (la nica obligatoria). Seccin de excepciones.

ESTRUCTURA:

[DECLARE] Declaracin de variables y constantes


Variable Constante Cursor Se inicializa con un valor que no se puede modificar. Area de trabajo que contiene los datos de la fila de la tabla en uso. El cursor es el resultado de una sentencia SELECT. ExcepcinVariables para control de errores.

VERSIN 1

JPV-99

7 / 67

PL/SQL I

BEGIN Sentencias ejecutables y sentencias DML [EXCEPTION] Control de excepciones


Es el punto al que se transfiere el control del programa siempre que exista un problema. Los indicadores de excepcin pueden ser definidos por el usuario o por el sistema, como es por ejemplo la excepcin ZERO_DIVIDE. Las excepciones se activan automticamente al ocurrir un error, existiendo la definicin de la excepcin OTHERS que considera aquellos errores no definidos y que siempre se ubica al final de todas las excepciones.

END; [Nombre del bloque]


Fin del Bloque.

NOTA

Este tipo de bloque se le suele llamar annimo, y es el ms utilizado en Scripts.

ZONA DE DECLAR ACIN: DE V ARIABLES Y CONSTANTES


Las variables son utilizadas para guardar valores devueltos por una consulta o almacenar clculos intermedios. Las constantes son campos que se definen y no alteran su valor en el proceso. Nombre_campo [CONSTANT] Tipo de dato := valor_constante / expresin_pl_sql

VERSIN 1

JPV-99

8 / 67

PL/SQL I

Otra manera de declarar las variables:

identificador%TYPE.

Donde el identificador es un objeto accesible por el usuario. Normalmente una columna de una tabla:

Var1 number(59); Var2 Var1%TYPE; Var3 tabla.identificador%TYPE;

Se puede tambin declarar una fila variable cuyos campos tienen el mismo nombre y tipo que las columnas de una tabla o fila recuperada de un cursor:

registro tabla%ROWTYPE

Es obligatorio slo en bloques PL/SQL annimos.

VERSIN 1

JPV-99

9 / 67

PL/SQL I

TIPOS DE DATOS.
Number (n [, d]) numrico n <= 38 Binary_Integer entero, desde 2147483647 a +2147483647 PLS_Integer entero, desde 2147483647 a +2147483647 Char de longitud fija, hasta 255 caracteres Varchar de tipo carcter (obsoleto) Varchar2 Tamao variable hasta 2000 caracteres. Date - Fechas Boolean TRUE o FALSE (no puede utilizarse en campos SQL) Long- Cadena de caracteres de longitud variable hasta 2 Gigabytes Raw- Datos binarios de longitud variable, hasta 255 caracteres (grficos) Longraw- Cadena binaria de longitud variable de hasta 2 Gigabytes (grficos)

NOTA

El tipo PLS_Integer se suele utilizar para contadores. Es idntico al Binary_integer pero aade la caracterstica de dar un mensaje de error en caso de error. El tipo Binary_Integer se suele utilizar para tablas de PL/SQL

VERSIN 1

JPV-99

10 / 67

PL/SQL I

ZONA DE PROCESO
Empieza con BEGIN. En esta zona es donde se escriben todas las sentencias ejecutables: sentencias DML, asignaciones, manejo de cursores, bucles, etc. Es importante recordar que todas las SELECT ejecutadas dentro de un bloque PL/SQL llevan asociado un INTO. Una SELECT que no devuelva datos o que devuelva ms de uno provoca un ERROR, saltando la ejecucin directamente al EXCEPTION.

ASIGNACIN DE VALORES
Las dos formas que existen para asignar valores a variables de memoria, son: Con el operador de asignacin :=, como cuando calculamos el promedio de las ventas asignndole valor a la variable xprom con la siguiente sentencia: xprom:=xtotal/xcant; Con la sentencia SELECT que contiene la orden INTO, como se muestra, es la asignacin de valores a las variables xtotal y xcant con el siguiente cdigo: SELECT SUM(valor), COUNT(valor) INTO xtotal,xcant FROM ventas WHERE fecha=sysdate;

FIN DE BLOQUE PL/SQL


Todo bloque PL/SQL termina con END.

VERSIN 1

JPV-99

11 / 67

PL/SQL I

COMENTARIOS
Hay dos tipos de comentarios: Con el signo -- se indica comentario de una sola lnea. Mediante /* al principio del comentario y */ al final de ste.

ZONA DE EXCEPCIONES
Las excepciones saltan cuando se ha producido un error en la ejecucin. Es seccin no obligatoria. Esta seccin termina con un END. Es la parte del bloque PL/SQL donde se realiza el control de errores. Manejo directo de excepciones ya tratadas con el uso de un WHEN: Excepciones que pueden incluirse directamente despus del WHEN:

Excepcin
CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER LOGIN_DENIED NO_DATAFOUND NOT_LOGGED_ON PROGRAM_ERROR

Nmero de error
ORA06511 6511 ORA00001 1 ORA01001 1001 ORA01722 1722 ORA01017 1017 ORA01403 +100 ORA01012 1012 ORA06501 6501

VERSIN 1

JPV-99

12 / 67

PL/SQL I

ROWTYPE_MISMATCH STORAGE_ERROR TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE

ORA06504 6504 ORA06500 6500 ORA00051 51 ORA01422 1422 ORA06502 6502 ORA01476 1476

EJERCICIO

EJERCICIO N 1 Crear un bloque PL/SQL con las siguientes caractersticas: Definir una constante de tipo numrico, de nombre x, a la que le vamos a asignar el valor de 12. Definir una variable, y, del mismo tipo que el campo hiredate, de la tabla EMP, de la base de datos DEMO. Definir una variable de tipo numrico que se llame z. Asignar a la variable y la fecha actual. Asignar a la variable z el resultado de multiplicar x por 10. Mostrar por pantalla el contenido de las variables y e z.

VERSIN 1

JPV-99

13 / 67

PL/SQL I

EJERCICIO

EJERCICIO N 2 Se trata de hacer una consulta a la tabla EMP, concretamente del campo ename de tal forma que el usuario introduzca un nombre por teclado y el bloque PL/SQL sea capaz de recuperar el campo job de dicho empleado a travs de dicha consulta. Pedir que se introduzca por teclado un nombre, el cual lo almacenaremos en la variable nombre. Una vez introducido el nombre, lanzar un bloque PL/SQL (previamente creado) de tal forma que sea capaz de seleccionar la fila de la tabla EMP cuyo ename sea igual al introducido por teclado y mostrar el campo job correspondiente a ese empleado por pantalla.

VERSIN 1

JPV-99

14 / 67

PL/SQL I

3. FUNCIONES SQL PREDEFINIDAS

IMPORTANTE

Existen diversas funciones predefinidas a las que se puede llamar desde una orden SQL.

FUNCIONES DE CAR CTER QUE DEVUELVEN VALORES DE CARCTER


CHR Chr(x)

Devuelve el carcter dado su nmero ASCII . CONCAT Concat (cadena1, cadena2)

Devuelve las dos cadenas encadenadas (Es idntico a usar ||). INITCAP Initcap (cadena)

Devuelve la misma cadena, con el primer carcter de cada palabra en mayscula y el resto en minscula. LOWER Lower (cadena)

Devuelve la misma cadena con todos los caracteres en minscula. LPAD Lpad (cadena1,x [,cadena2])

Devuelve la cadena1 rellena hacia la izquierda con los caracteres de la cadena2 hasta completar la longitud x

VERSIN 1

JPV-99

15 / 67

PL/SQL I

LTRIM

Ltrim(cadena1, cadena2)

Devuelve la cadena1, quitando los caracteres de la izquierda contenidos en cadena2. REPLACE Replace (cadena, cad_busc [,cad_subst])

Devuelve cadena, reemplazando todas las apariciones de la cadena cad_busc con la cadena cad_subst. Si no se especifica cad_subst, se elimina todas las apariciones de cad_busc. RPAD Rpad (cadena1, x [,cadena2])

Devuelve la cadena1 rellena por la derecha con los caracteres de la cadena2 hasta completar la longitud x RTRIM Ltrim(cadena1, cadena2)

Devuelve la cadena1, quitando los caracteres de la derecha contenidos en cadena2. SUBSTR Substr (cadena, a [,b])

Devuelve una porcin, de b caracteres de longitud, de la cadena proporcionada como argumento, empezando a partir de la posicin a. S a es cero, se trata como si fuera 1. Si a es positivo, se devuelven los caracteres contando a partir de la izquierda. Si a fuera negativo, se contara desde el final de la cadena. UPPER Upper (cadena)

Devuelve la cadena proporcionada con todas las letras en maysculas.

VERSIN 1

JPV-99

16 / 67

PL/SQL I

SQL> SELECT LPAD (Short String, 20, XY) Cadena FROM dual; > XYXYXYXYShort String

SQL> SELECT LTRIM (xxxFin de la cadena, x) Cadena FROM dual; > Fin de la cadena

SQL> SELECT REPLACE (This and That, Th, B) Cadena FROM dual; > Bit and Bat

SQL> SELECT SUBSTR (abc123def, 5, 4) Cadena FROM dual; > 23de

FUNCIONES NUMRICOS
ASCII

DE

CAR CTER

QUE

DEVUELVEN

VALORES

ASCII (cadena)

Devuelve la representacin decimal del primer byte de la cadena. INSTR INSTR (cadena1, cadena2 [,a[,b]])

Devuelve la posicin de la cadena1 donde est contenida la cadena2. (La cadena se explora desde la izquierda, empezando a partir de la posicin a. S a es negativo, entonces la cadena1 se explora desde la derecha. El valor devuelto es el de la aparicin nmero b de la cadena de la bsqueda).

VERSIN 1

JPV-99

17 / 67

PL/SQL I

LENGTH

Length (cadena)

Devuelve la longitud de la cadena.

SQL> SELECT INSTR(Scotts spot, ot, 1, 2) Cadena FROM dual; > 11

FUNCIONES NUMRICAS
ABS ABS (x)

Devuelve el valor absoluto de x ACOS ACOS (x)

Devuelve el arco coseno de x ASIN ASIN (x)

Devuelve el arco seno de x ATAN ATAN (x)

Devuelve el arco tangente de x CEIL CEIL (x)

Devuelve el menor entero que sea mayor o igual que x COS COS (x)

Devuelve el coseno de x (en radianes)

VERSIN 1

JPV-99

18 / 67

PL/SQL I

COSH

COSH (x)

Devuelve el coseno hiperblico de x EXP EXP (x)

Devuelve e elevado a la potencia x FLOOR FLOOR (x)

Devuelve el mayor entero que sea menor o igual que x LN LN (x) Devuelve el logaritmo natural de x LOG LOG (x,y)

Devuelve el logaritmo de y en base x MOD MOD (x)

Devuelve el resto resultante de dividir z por y POWER POWER (x,y)

Devuelve el nmero x elevado a la potencia de y ROUND ROUND (x [,y])

Devuelve x redondeado a y posiciones a la derecha del punto decimal. SIN SIN (x) Devuelve el seno de x (en radianes) SINH SINH (x)

Devuelve el seno hiperblico de x SQRT SQRT (x)

Devuelve la raiz cuadrada de X


VERSIN 1 JPV-99 19 / 67

PL/SQL I

TAN

TAN (x)

Devuelve la tangente de x (en radianes) TANH TANH (x)

Devuelve la tangente hiperblica de x (en radianes) TRUNC TRUNC (x)

Devuelve el valor x truncado a y posiciones decimales

SQL> SELECT TRUNC(15.79,1) Truncate FROM DUAL ; > 15.7

SQL> SELECT MIN(hiredate) Minimum Date FROM emp ; > 17-DEC-80

FUNCIONES DE FECHA
ADD_MONTHS ADD_MONTHS (d,x)

Devuelve la fecha d ms x meses LAST_DAY LAST_DAY (d)

Devuelve la fecha del ltimo da del mes al que d pertenece MONTHS_BETWEEN MONTHS_BETWEEN (fecha1, fecha2)

Devuelve el nmero de meses existentes entre fecha1 y fecha2

VERSIN 1

JPV-99

20 / 67

PL/SQL I

NEXT_DAY

NEXT_DAY(d, cadena)

Devuelve la fecha del da nombrado en cadena que es posterior a la fecha d ROUND ROUND (d [, formato])

Redondea la fecha d a la unidad especificada. SYSDATE SYSDATE

Devuelve la fecha y hora actuales, de tipo DATE TRUNC TRUNC (d [, formato])

Devuelve la fecha d, truncada a la unidad especificada.

SQL> SELECT TO_CHAR(ADD_MONTHS(hiredate,1), 'DD-MON-YYYY') "Next month" FROM emp WHERE ename = 'SMITH' ; > 17-JAN-1981

SQL> SELECT TO_CHAR( ADD_MONTHS( LAST_DAY(hiredate),5), 'DD-MON-YYYY') "Five months" FROM emp WHERE ename = 'MARTIN' ; > 28-FEB-1982

VERSIN 1

JPV-99

21 / 67

PL/SQL I

FUNCIONES DE CONVERSIN

CONVERSIONES IMPLCITAS
PL/SQL Convierte automticamente entre los siguientes tipos de datos:

CONVERSIONES EXPLCITAS
Estas son las conversiones entre tipos que pueden hacerse:

TO_CHAR

TO_CHAR (d [,formato [, paramls]])

Convierte la fecha d a una cadena de caracteres TO_DATE TO_DATE (d [,formato [, paramls]])

Convierte la cadena de caracteres a una fecha

VERSIN 1

JPV-99

22 / 67

PL/SQL I

TO_NUMBER

TO_NUMBER (d [,formato [, paramls]])

Convierte la cadena a un valor numrico.

SQL> SELECT TO_DATE( 'January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.', 'NLS_DATE_LANGUAGE = American') FROM DUAL; > 15/01/1989,11:00:00

SQL> SELECT TO_CHAR(HIREDATE, 'Month DD, YYYY') "New date format" FROM emp WHERE ename = 'SMITH' ; > December 17, 1980

SQL> SELECT TO_NUMBER('-AusDollars10000','L9G99999D99', ' NLS_NUMERIC_CHARACTERS = '',.'' NLS_CURRENCY FROM DUAL; > -10000 = ''AusDollars'' ') "Amount"

VERSIN 1

JPV-99

23 / 67

PL/SQL I

FORMATOS NUMRICOS

Element
9 0 $ B MI S PR D G C L , . V EEEE

Example
9999 0999 $999 B999 999MI S999 999PR 99D99 9G99 C999 L999 9,999 99.99 999V99

Description
significant digit leading zero instead of a blank leading dollar sign leading blank instead of a zero trailing minus sign leading plus or minus sign angle brackets for negative values decimal character group separator ISO currency symbol local currency symbol comma period 10n multiplier; n is the number of 9's after the V

9.99EEEE

scientific notation (you must have 4 E's) Upper or lower case roman numeral

RN, rn RN

VERSIN 1

JPV-99

24 / 67

PL/SQL I

FORMATOS DE FECHA:

CC, SCC YYYY, SYYYY IYYY YYY, YY, Y IYY, IY, I Y,YYY YEAR, SYEAR RR BC, AD B.C., A.D. Q MM RM MONTH MON WW IW W DDD DD

Century (S prefixes BC dates with a minus sign) Year (S prefixes BC dates with a minus sign) Year based on ISO standard Last three, two or one digits of the year Last three, two or one digits of the ISO year (Four Y's with comma) put a comma in the year (1,995) Year spelled out (S prefixes BC dates with a minus sign) Last two digits of year in another century (allows for year 2000) BC or AD indicator BC or AD indicators with periods Numeric quarter of the year (1-4 with Jan-Mar=1) 2 number month (Jan = 01) Roman numeral month Name of month spelled out (upper case - month is upper case) abbreviated name of month (upper case - month is upper case) Week of the year (1-53) Week of the year (1-52, 1-53) based on ISO standard Week of month (1-5) day of year (1-366) (Don't forget leap years) day of month (1-31)

VERSIN 1

JPV-99

25 / 67

PL/SQL I

D DAY DY J AM,PM A.M., P.M. HH, HH12 HH24 MI SS SSSSS None

day of week (1-7) Name of day (upper case, day is upper case) Abbreviated name of day Julian day (Number of days since January 1, 4712 BC) Meridian indicator Meridian indicator with periods. Hour of day (0-12) Use 24 hour clock for hours (1-24) Minute (0-59) Second (0-60) (five S's) seconds past midnight. (0-86399) Date must be in the format 'DD-MON-YY';

FUNCIONES DE GRUPO
AVG AVG ([Distinct | All] col)

Devuelve el promedio de los valores de la columna COUNT COUNT (* | [Distinct |all] col)

Devuelve el nmero de filas en la consulta MAX MAX ([Distinct | All] col)

Devuelve el valor mximo de la consulta de seleccin. MIN MIN ([Distinct | All] col) Devuelve el valor mnimo de la consulta de seleccin.

VERSIN 1

JPV-99

26 / 67

PL/SQL I

STDDEV

STDDEV ([Distinct | All] col)

Devuelve la desviacin estndar del elemento de lista de seleccin. SUM SUM ([Distinct | All] col)

Devuelve la suma de los valores para el elemento de lista de seleccin. VARIANCE VARIANCE ([Distinct | All] col)

Devuelve la varianza estadstica del elemento de lista de seleccin.

OTRAS FUNCIONES
DECODE DECODE (expr_base, compara1, valor1, compara2, valor2 predeterminado) La funcin DECODE es similar a una serie de rdenes IF-THEN-ELSE anidadas. La expresin expr_base se compara sucesivamente con compara1, compara2, etc. Si expr_base coincide con el elemento de comparacin nmero i, se devuelve el valor i. Si expr_base no coincide con ninguno de los valores de comparacin, se devuelve el valor predeterminado. GREATEST GREATEST (expr1 [expr2] )

Devuelve la expresin con mayor valor de todos sus argumentos. Cada expresin es convertida de forma implcita al tipo de expr1 antes de realizar las comparaciones. Si expr1 es de tipo carcter, se realizan comparaciones de carcter sin relleno de blancos, y el resultado es de tipo VARCHAR2.

VERSIN 1

JPV-99

27 / 67

PL/SQL I

LEAST

LEAST (expr1 [expr2] )

Devuelve la expresin con menor valor de todos sus argumentos. Cada expresin es convertida de forma implcita al tipo de expr1 antes de realizar las comparaciones. Si expr1 es de tipo carcter, se realizan comparaciones de carcter sin relleno de blancos, y el resultado es de tipo VARCHAR2. NVL NVL (expr1 ,expr2)

Si el valor de expr1 es NULL, la funcin devuelve el valor de expr2; si no, devuelve el valor de expr1. El valor devuelto es del mismo tipo que expr1, salvo si expr1 es una cadena de caracteres, en cuyo caso el valor de retorno es del tipo VARCHAR2. USER USER

Devuelve un valor VARCHAR2 que contiene el nombre del usuario actual de Oracle. USERENV USERENV (opcin)

Devuelve un valor VARCHAR2 que contiene informacin acerca de la sesin actual, segn la opcin seleccionada. OPCIONES LANGUAGE Devuelve el idioma y pas utilizados SESSIONID Devuelve el identificador del elemento de registro de la sesin TERMINAL Devuelve un identificador, dependiente del

sistema operativo, para el terminal de la sesin actual.

VERSIN 1

JPV-99

28 / 67

PL/SQL I

SQL> SELECT ename, NVL(TO_CHAR(COMM),'NOT APPLICABLE') "COMMISSION" FROM emp WHERE deptno = 30;

>ENAME ---------ALLEN WARD MARTIN BLAKE TURNER JAMES

COMMISSION ----------------300 500 1400 NOT APPLICABLE 0 NOT APPLICABLE

SQL> SELECT TEXT FROM USER_SOURCE WHERE NAME = UPPER('&1') ORDER BY NAME, DECODE(TYPE,'PACKAGE','S','PACKAGE BODY','B', 'PROCEDURE','R','FUNCTION','F'),TYPE,LINE;

SQL> SELECT USERENV('sessionid'), USERENV ('terminal'), USER FROM dual;

>

6234

JPVF

SCOTT

VERSIN 1

JPV-99

29 / 67

PL/SQL I

PRCTICA

EJERCICIO N 3 -Crear una tabla empleado como copia de la tabla emp. El nuevo nombre ser emp + n de usuario. -Modificar los registros de la tabla creada de modo que en lugar del nombre del empleado aparezca el nombre del empleado terminado en @ para aquellos empleados llamados JONES cuyo curso es el el 2

EJERCICIO N 4 -Hallar el da de la semana actual en castellano en letra mediante un DECODE y sin utilizar la mscara d.

EJERCICIO N 5 - Obtener las nuevas comisiones de los empleados teniendo en cuenta que se subirn un 5% el prximo ao y que aquellos que no tengan les correspondern como tales la cuarta parte de su salario.

VERSIN 1

JPV-99

30 / 67

PL/SQL I

4. SENTENCIAS DE CONTROL

SENTENCIA IF

IF Condicin THEN sentencias_ejecutables [ELSIF condicin THEN sentencias_ejecutables; ] ELSE sentencias_ejecutables; ] END IF;

SQL> DECLARE v_NumberSeats rooms.number_seats%TYPE; v_Comment VARCHAR2(35); BEGIN /* Recibe el nmero de asientos de la sala identificada por ID 99999. Almacena resultado en v_NumberSeats. */ SELECT number_seats INTO v_NumberSeats FROM rooms WHERE room_id = 99999; IF v_NumberSeats < 50 THEN v_Comment := 'Fairly small'; ELSIF v_NumberSeats < 100 THEN v_Comment := 'A little bigger'; ELSE v_Comment := 'Lots of room';

VERSIN 1

JPV-99

31 / 67

PL/SQL I

END IF; END; /

BUCLE INFINITO:

LOOP sentencias_ejecutables; [EXIT when ....;] END LOOP;

SQL> DECLARE ranking_level NUMBER(3) := 1; BEGIN IF max_rank_in >= 1 THEN LOOP set_rank (ranking_level); ranking_level := ranking_level + 1; EXIT WHEN ranking_level > max_rank_in; END LOOP; END IF; END;

VERSIN 1

JPV-99

32 / 67

PL/SQL I

BUCLES CONDICIONALES:

WHILE condicin LOOP sentencias_ejecutables; [EXIT when .... ;] END LOOP;

SQL> DECLARE v_Counter BINARY_INTEGER := 1; BEGIN -- Permanece dentro del bucle hasta -- comprobar que se han hecho 50 iteraciones WHILE v_Counter <= 50 LOOP INSERT INTO temp_table VALUES (v_Counter, 'Loop index'); v_Counter := v_Counter + 1; END LOOP; END; /

VERSIN 1

JPV-99

33 / 67

PL/SQL I

BUCLES NUMRICOS:

FOR ndice IN [REVERSE] nmero_inicio..nmero_fin LOOP sentencias_ejecutables; [EXIT when ....;] END LOOP;

SQL> DECLARE v_Counter NUMBER := 7; BEGIN Inserta el valor 7 en temp_table. INSERT INTO temp_table (num_col) VALUES (v_Counter); Este bucle declara de nuevo v_Counter como BINARY_INTEGER, lo que anula la declaracin NUMBER de v_Counter. FOR v_Counter IN 20..30 LOOP -- Dentro del bucle, el rango de v_Counter es de 20 a 30. INSERT INTO temp_table (num_col) VALUES (v_Counter); END LOOP;

VERSIN 1

JPV-99

34 / 67

PL/SQL I

-- Inserta otro 7 en temp_table. INSERT INTO temp_table (num_col) VALUES (v_Counter); END; /

EJERCICIO

EJERCICIO 7 EJERCICIO SOBRE BUCLES CONDICIONALES Crear una tabla DIAS con un campo de tipo numrico. Introducir una fila por cada da del mes actual de tal forma que el resultado final sea algo parecido a esto: DAS 1 2 3 4 5 ... 29 30 Realizar el ejercicio utilizando for...loop , loop...exit y while.

VERSIN 1

JPV-99

35 / 67

PL/SQL I

5. SENTENCIAS DE DML

IMPORTANTE

PL/SQL puede incluir sentencias de manejo de datos. Oracle abre un cursor implcito por cada sentencia SQL que tenga que procesar. Nos referiremos a l como SQL%

Atributos de estos cursores: SQL%NOTFOUND Devuelve TRUE si el INSERT, UPDATE o DELETE

no procesa ninguna fila. SQL%FOUND Devuelve TRUE si un INSERT, UPDATE o DELETE ha

procesado alguna fila SQL%ROWCOUNT Devuelve el nmero de fila leda procesadas por un

INSERT, UPDATE o DELETE. Para el manejo de errores de una SELECT utilizaremos las excepciones NO_DATA_FOUND, TOO_MANY_ROWS, etc.

VERSIN 1

JPV-99

36 / 67

PL/SQL I

SQL> update emp set salary = salary + 100

where name = SMITH; if SQL%NOTFOUND then dbms_output.put_line(Smith no trabaja ya en la empresa); end if;

EJERCICIO

EJERCICIO 8 EJERCICIO SOBRE SENTENCIAS DML Introducir desde teclado el nmero de un departamento y mostrar por pantalla el nombre de dicho departamento y domicilio. Utilizar la tabla DEPT y un registro para recuperar los datos de dicha tabla. Probar que ocurre si se introduce un nmero de departamento que no figura en la tabla DEPT.

VERSIN 1

JPV-99

37 / 67

PL/SQL I

EJERCICIO

EJERCICIO 9 Crear un bloque PL/SQL que modifique la tabla EMP de tal forma aquellos empleados cuyo nmero de empleado sea CLERK. Si no existiera ningn empleado con nmero 1, insertar dicho empleado con las siguientes caractersticas:
ENAME: PEDRO PEREZ JOB: CLERK MGR: 7934 DPTNO: 20

1 pasen a tener como job

Capturar el error utilizando el cursor implcito SQL%.

VERSIN 1

JPV-99

38 / 67

PL/SQL I

6. CURSORES

El conjunto de filas resultantes de una consulta con la sentencia SELECT, puede estar compuesto por ninguna, una o varias filas, dependiendo de la condicin que define la consulta. Para poder procesar individualmente cada fila de la consulta debemos definir un cursor (que es un rea de trabajo de memoria) que contiene los datos de las filas de la tabla consultada por la sentencia SELECT.

IMPORTANTE

Un cursor es un rea de trabajo que utiliza ORACLE para consultas que devuelven ms de una fila, permitiendo la lectura y manipulacin de cada una de ellas. Declaracin: CURSOR NOMBRE_CURSOR IS SENTENCIA SELECT; Para recuperar los datos de un cursor primero hay que abrirlo (OPEN), luego leerlo (FETCH), y por ltimo cerrarlo (CLOSE).

Cursor parametrizado: cursor que utiliza parmetros en la SELECT. CURSOR NOMBRE_CURSOR (nombre_parametro tipo_parametro) IS SENTENCIA SELECT utilizando los parmetros;

Variable de tipo %ROWTYPE.

VERSIN 1

JPV-99

39 / 67

PL/SQL I

MANEJO DE CURSORES
Se declaran en la zona DECLARE. Para recuperar todas las filas del cursor utilizaremos un bucle. Atributos utilizados en el manejo: Nombre_cursor%NOTFOUND filas que devolver Nombre_cursor%FOUND Contrario de %notfound Devuelve el nmero de fila leda. Devuelve TRUE si falla y no tiene ms

Nombre_cursor%ROWCOUNT Nombre_cursor%ISOPEN

Devuelve TRUE si el cursor est abierto.

Para abrir el cursor utilizamos la sentencia OPEN. Si el cursor est parametrizado: OPEN nombre_cursor (parmetro).

Para cursores sin parmetros recuperamos una fila utilizando:

FETCH NOMBRE_CURSOR INTO VARIBLE1, VARIABLE2, VARIABLE3...

Cerramos un cursor utilizando la sentencia CLOSE.

BUCLES SOBRE CURSORES


Realiza automticamente las siguientes acciones: Abre el cursor. Se realiza la lectura y se ejecutan las sentencias del bucle hasta que no haya ms filas.
VERSIN 1 JPV-99 40 / 67

PL/SQL I

Cierra el cursor. FOR Nombre_registro IN Nombre_cursor LOOP sentencias_ejecutables; [EXIT when ....;] END LOOP;

EJEMPLO DE CURSORES
A continuacin veremos un ejemplo de cursor con las siguientes caractersticas: Objetivo: Consultar las ventas de una fecha dada ordenadas de mayor a menor. Nombre:CVENTAS. Parmetros: cfecha, variable que contiene la fecha a consultar.

VERSIN 1

JPV-99

41 / 67

PL/SQL I

PROCEDURE VENTAS5 (xfecha DATE) is BEGIN

DECLARE CURSOR cventas (cfecha DATE) IS SELECT articulo,valor FROM ventas WHERE fecha=cfecha ORDER BY valor DESC;

xarticulo

ventas.articulo%TYPE;

xvalor ventas.valor%TYPE;

BEGIN

OPEN cventas(xfecha);

FOR i IN 1..5 LOOP FETCH cventas INTO xarticulo,xvalor; EXIT WHEN cventas%NOTFOUND; INSERT INTO ventamayor VALUES (xfecha,xarticulo,xvalor); COMMIT; END LOOP;

CLOSE cventas; END; END;

VERSIN 1

JPV-99

42 / 67

PL/SQL I

Para llamar al procedimiento ventas5 en una fecha dada, se puede escribir, por ejemplo: ventas5(to_date('15/11/95','DD/MM/YY') ventas5(sysdate).

A continuacin detallaremos las sentencias usadas en este procedimiento:

DECLARE cursor Define el cursor, su consulta y la lista de parmetros que se pasan a la orden WHERE, es solo la declaracin del cursor y no la realizacin de la consulta. xarticulo ventas.articulo%TYPE; Define la variable xarticulo igual a la columna articulo de la tabla ventas, que con el uso del atributo de variable %TYPE permite declarar una variable del mismo tipo que una columna de la tabla. No es necesario conocer cmo est definida esa columna en la tabla y, en caso que la definicin de la columna sea modificada, automticamente se cambia la variable xarticulo. OPEN cventas(xfecha); Realiza la consulta asociada al cursor, pasando el valor del parmetro y guardando sus resultados en un rea de la memoria, desde la cual, posteriormente, se pueden leer estas filas. FOR i IN 1..5 LOOP Ciclo numrico de repeticin para poder consultar las 5 primeras ventas devueltas por el cursor. FETCH cventas INTO xarticulo,xvalor;

VERSIN 1

JPV-99

43 / 67

PL/SQL I

Lee la siguiente fila de datos del cursor cventas y pasa los datos de la consulta a las variables xarticulo y xvalor. EXIT WHEN cventas%NOTFOUND; Garantiza la salida del ciclo antes de la ltima repeticin, en caso que para una fecha dada se hayan efectuado menos de 5 ventas, ya que en esta situacin la consulta del cursor devuelve menos de 5 filas. %NOTFOUND es un atributo de cursor que es verdadero cuando la ltima sentencia FETCH no devuelve ninguna fila. INSERT INTO ventamayor VALUES(xfecha,xarticulo,xvalor); Insertar en la tabla ventamayor los valores ledos desde el cursor. COMMIT; Actualizacin de la tabla ventamayor. END LOOP; Fin del ciclo. CLOSE cventas; Cierra el cursor, eliminado sus datos del rea de memoria.

EJERCICIO

EJERCICIO 10 Insertar en la tabla nueva de empleado los valores de aquellos empleados que pertenezcan a los departamentos 20 y 10 en este orden y aadirles 1000 al campo salario.

VERSIN 1

JPV-99

44 / 67

PL/SQL I

EJERCICIO

EJERCICIO 11 EJERCICIO SOBRE CURSORES Crear una tabla de totales por departamentos con dos campos: uno para los nmeros de departamento y otro numrico para meter los totales por departamento. El proceso consiste en pedir por pantalla el nmero de departamento y calcular el total de la suma de los salarios mas las comisiones. Utilizar un cursor. Insertar el resultado en la tabla recin creada. Si un departamento no tuviera empleados introducir un 0 en el campo total.

EJERCICIO

EJERCICIO 12 EJERCICIO SOBRE CURSORES Y SENTENCIAS DML Crear una tabla con los campos job y total_empleados. Contar cuntos empleados hay de cada tipo de job. Utilizar un cursor para obtener los distintos tipos de trabajo, y otro cursor parametrizado en el cual se le pasa el trabajo recuperado con el cursor anterior. Introducir en la tabla slo aquellos trabajos que tengan ms de 1 empleado.

VERSIN 1

JPV-99

45 / 67

PL/SQL I

7. REGISTROS Y TABLAS

REGISTROS PL/SQL

IMPORTANTE

Los registros PL/SQL son estructuras de datos complejas que permiten tratar variables diferentes, pero relacionadas, como si fuera una unidad. TYPE NOMBRE_REGISTRO IS RECORD ( campo1 tipo1 [:=expr1], campo2 tipo2 [:=expr2], ..... campon tipon [:=exprn])

Una vez declarado un registro es necesario definir una variable de este tipo. Podemos utilizar tambin %TYPE y %ROWTYPE. Se puede asignar un registro a otro del mismo tipo o sus campo individualmente, con la condicin de que ambos sean del mismo tipo.

VERSIN 1

JPV-99

46 / 67

PL/SQL I

EJEMPLO:

DECLARE TYPE t_Rec1Type IS RECORD ( Field1 NUMBER, Field2 VARCHAR2(5)); TYPE t_Rec2Type IS RECORD ( Field1 NUMBER, Field2 VARCHAR2(5)); v_Rec1 t_Rec1Type; v_Rec2 t_Rec2Type; BEGIN /* Aunque v_Rec1 y v_Rec2 sean los mismos campos y tipos, el tipo RECORD en s mismo es diferente Sera una asignacin ilegal que elevara el error PLS-382. */ v_Rec1 := v_Rec2;

/* Estos campos, son del mismo tipo, por los que la asignacin sera legal. */ v_Rec1.Field1 := v_Rec2.Field1; v_Rec2.Field2 := v_Rec2.Field2; END; /

VERSIN 1

JPV-99

47 / 67

PL/SQL I

TABLAS EN PL/SQL
Las tablas en PL/SQL se asemejan a los arrays del lenguaje C. Sintcticamente se las trata de la misma forma que a las matrices, aunque su implementacin es distinta.

DEFINICIN DE UNA TABLA

IMPORTANTE

Una tabla PL/SQL es similar a una tabla de base de datos pero como si tuviera dos columnas una de ellas es el ndice y la otra el valor. La clave es siempre BINARY_INTEGER y el tipo valor es el tipo que hubiera especificado en la definicin. El mximo nmero de filas viene especificado por el nmero mximo de valores que se pueden representar mediante el tipo BINARY_INTEGER.

VERSIN 1

JPV-99

48 / 67

PL/SQL I

Dispone de control automtico de asignacin de memoria, a diferencia de C, en el que hay que reservarla antes. TYPE NOMBRE_TABLA IS TABLE OF TIPO_DE_DATO INDEX BY BINARY_INTEGER;

ATRIBUTOS DE UNA TABLA


TABLA.COUNT-> Devuelve el nmero de filas de una tabla. TABLA.DELETE->Borra filas de la tabla. TABLA.EXISTS-> Devuelve TRUE si existe en la tabla el elemento especificado. TABLA. FIRST-> Devuelve el ndice de la primera fila desde la tabla. TABLA.LAST-> Devuelve el ndice de la ltima fila de la tabla. TABLA.NEXT-> Devuelve el ndice de la fila de la tabla que sigue a la fila especificada. TABLA.PRIOR-> Devuelve el ndice de la fila de la tabla que antecede a la fila especificada.

EJEMPLO

DECLARE TYPE t_LastNameTable IS TABLE OF students.last_name%TYPE INDEX BY BINARY_INTEGER; v_LastNames t_LastNameTable; v_Index BINARY_INTEGER; BEGIN Inserta filas en la tabla.

VERSIN 1

JPV-99

49 / 67

PL/SQL I

v_LastNames(43) := 'Mason'; v_LastNames(50) := 'Junebug'; v_LastNames(47) := 'Taller'; -- Asigna 43 a v_Index. v_Index := v_LastNames.FIRST; -- Asigna 50 a v_Index. v_Index := v_LastNames.LAST; END; /

TABLAS DE REGISTROS
Una tabla puede contener datos de tipo registro.

EJEMPLO

DECLARE TYPE t_StudentTable IS TABLE OF students%ROWTYPE INDEX BY BINARY_INTEGER; /* Cada elemento de v_Students es un registro */ v_Students t_StudentTable; BEGIN /* Obtiene el registro record con id = 10,001 and y lo almacena en v_Students(10001) */ SELECT * INTO v_Students(10001) FROM students WHERE id = 10001; v_Students(10001).first_name := 'Larry'; DBMS_OUTPUT.PUT_LINE(v_Students(10001).first_name); END; /

VERSIN 1

JPV-99

50 / 67

PL/SQL I

EJERCICIO

EJERCICIO 13 EJERCICIO SOBRE REGISTROS Crear un cursor parametrizado que recupere los campos nombre, trabajo, salario y comision de la tabla EMP del trabajo introducido por teclado. Recuperar los datos con un registro y mostrar por pantalla cada una de las filas recuperadas en el cursor de la siguiente manera:
SMITH ------>CLERK 800 JAMES ------>CLERK 950 ADAMS ------>CLERK 1100 PEPE ------>CLERK 1300 750 PEDRO PEREZ ------>CLERK Pedro Perez ------>CLERK

Utilizar solamente una sentencia dbms_output.put_line.

VERSIN 1

JPV-99

51 / 67

PL/SQL I

EJERCICIO

EJERCICIO 14 EJERCICIO SOBRE TABLAS Crear un bloque PL/SQL que contenga un array de tipo varchar2(25). Realizar las siguientes operaciones: Insertar en la posicin 1 la cadena Uno Insertar en la posicin 3 la cadena Tres Insertar en la posicin 2 la cadena Menos dos Insertar en la posicin 0 la cadena Cero Insertar en la posicin 100 la cadena Cien Mostrar un mensaje con el nmero total de filas de la tabla Elimina la fila de la posicin 100 Mostrar un mensaje con el nmero de filas de la tabla Borrar las filas desde la posicin 1 a la 3 Mostrar un mensaje con el nmero de filas de la tabla Borrar el elemento que se encuentre en la primera posicin Mostrar el contenido la ltima posicin Mostrar el contenido de la penltima posicin Mostrar el contenido de la posicin 1 Borrar toda la tabla

VERSIN 1

JPV-99

52 / 67

PL/SQL I

EJERCICIO

EJERCICIO 15 EJERCICIO SOBRE TABLAS DE REGISTROS Crear una tabla (en el ncleo) VENDEDORES, compuesta por tres columnas: Empno - number(4), sal number(7, 2) , comm number(7, 2). Se trata de hacer un bloque PL/SQL capaz de cargar en un array de registros todos aquellos empleados de la tabla emp que tengan comisin no nula. Una vez realizada la carga del array se extraern en orden inverso al que fueron introducidos y se insertarn en la tabla vendedores. Utilizar un cursor para recuperar los campos empno, sal y comm de la tabla EMP. El registro de constar de los campos empno, sal y comm. Sera interesante guardar los resultados en un fichero de texto para comparar lo que devuelve la SELECT con lo que se ha obtenido con el cursor. Utilizar un cursor implcito.

VERSIN 1

JPV-99

53 / 67

PL/SQL I

8. SENTENCIAS TRANSACCIONALES

IMPORTANTE

Una transaccin es una serie de rdenes SQL que se completan o fallan como una unidad. Es decir, todas las rdenes se ejecutan o bien todas fallan. Una transaccin termina con la orden COMMIT o ROLLBACK.

Savepoint: Marcas que pone el usuario durante la transaccin para deshacer los cambios por partes en vez de deshacer toda la transaccin. SAVEPOINT <nombre_del_punto_salvaguarda>;

Commit: Realiza todas las transacciones pendientes de la actual transaccin hacindolas visibles para los dems usuarios. COMMIT [WORK];

Rollback: Deshace todos los cambios pendientes de la transaccin actual. ROLLBACK [WORK] [ TO [SAVEPOINT] punto_salvaguarda; ]

VERSIN 1

JPV-99

54 / 67

PL/SQL I

EJEMPLO

DECLARE v_NumIterations NUMBER; BEGIN -- Loop from 1 to 500, inserting these values into temp_table. -- Commit every 50 rows. FOR v_LoopCounter IN 1..500 LOOP INSERT INTO temp_table (num_col) VALUES (v_LoopCounter); v_NumIterations := v_NumIterations + 1; IF v_NumIterations = 50 THEN COMMIT; v_NumIterations := 0; END IF; END LOOP; END; /

PRCTICA

EJERCICIO 16 a) Crear una tabla temp, compuesta por estas columnas:


Codigo - number(4), Mensaje varchar2(80)

b) Actualizar los vendedores con una comisin mayor que 350$ con un incremento del 15% de su salario. Si la operacin afecta a ms de tres empleados, deshacer la transaccin, en cualquier otro caso validar la transaccin. Introducir en la tabla TEMP la operacin que se ha realizado.

VERSIN 1

JPV-99

55 / 67

PL/SQL I

PRCTICA

EJERCICIO 17 EJERCICIO SOBRE UTILIZACIN DE SENTENCIAS TRANSACCIONALES Crear un bloque PL/SQL que modifique el sal de los empleados que no tienen comisin a 1000. Dentro del mismos bloque PL/SQL actualizar los empleados con una comisin mayor de 350 $ con un incremento del 15% de su salario. Si la operacin afecta a ms de tres empleados, deshacer la transaccin, en cualquier otro caso validar dicha transaccin. Utilizar slo un commit en el bloque PL/SQL.

VERSIN 1

JPV-99

56 / 67

PL/SQL I

9. CONTROL DE ERRORES

IMPORTANTE

El control de errores se realiza en la zona de excepciones del bloque PL/SQL que es la parte final del bloque PL/SQL annimo o del procedimiento almacenado. WHEN NOMBRE_EXCEPCION1 [OR NOMBRE_EXCEPCION2....] THEN SENTENCIAS;

NOTA

La zona de excepciones no es obligatoria.

TIPOS DE EXCEPCIONES:

EXCEPCIONES PREDEFINIDAS:
NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX....

VERSIN 1

JPV-99

57 / 67

PL/SQL I

DEFINIDAS POR EL USUARIO:


Mediante: a) Exception_init, basadas en errores ORACLE PRAGMA EXCEPTION_INIT (nombre_excepcin, nmero_error);

NOTA

Nombre_excepcin hay que definirlo antes con EXCEPTION. El nmero de error es un sqlcode que no se halla definido para otra excepcin de Oracle , (p. Ej. NO DATA FOUND).

b) Declarndola como excepcin con el tipo de dato EXCEPTION en el DECLARE.

EJECUCIN DE EXCEPCIONES
La ejecucin de excepciones se produce: Automticamente: Cuando ORACLE detecta un error, para el proceso y pasa automticamente a la zona de EXCEPTION (si existe). Manualmente: Cuando el proceso llega a un punto en que interesa que halla un error. La sentencia utilizada es el RAISE. RAISE <nombre_excepcin>;

VERSIN 1

JPV-99

58 / 67

PL/SQL I

FUNCIONES
La funcin SQLCODE nos devuelve el nmero de error producido. Slo tiene valor cuando ocurre un error ORACLE Slo se habilita en la zona de excepciones. La funcin SQLERRM nos devuelve el mensaje del error del valor actual del SQLCODE.

NOTA

Se puede emplear la funcin predefinida RAISE_APPLICATION_ERROR para la creacin de mensajes de error por parte del usuario. Su sintaxis es: RAISE_APPLICATION_ERROR (cdigo, Mensaje). Donde cdigo es un nmero entre 20000 y 20999.

EJEMPLOS Y TRATAMIENTO

PARA VER LOS ERRORES INTERNOS DE ORACLE E INSERTARLOS EN UNA TABLA:

PREVIO: Creacin de tabla donde almacenarlos:

VERSIN 1

JPV-99

59 / 67

PL/SQL I

REM REM Creacin de tabla de errores REM create table errors (err_code number(6), err_msg varchar2(100));

DECLARE err_msg BEGIN FOR err_num IN 1 .. 20000 LOOP err_msg := SQLERRM (-err_num); IF SQLERRM NOT LIKE '%MESSAGE %' THEN BEGIN INSERT INTO errors VALUES (-err_num, err_msg); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; END; END IF; END LOOP; END; / VARCHAR2(100);

VERSIN 1

JPV-99

60 / 67

PL/SQL I

USO HABITUAL DE LAS EXCEPCIONES:

DECLARE pe_ratio NUMBER(3,1); BEGIN SELECT price / earnings INTO pe_ratio FROM stocks WHERE symbol = 'XYZ'; -- puede causar error de divisinbyzero INSERT INTO stats (symbol, ratio) VALUES ('XYZ', pe_ratio); COMMIT; EXCEPTION -- COMIENZA EL BLOQUE DE EXCEPCIN WHEN ZERO_DIVIDE THEN -- Maneja el error de divisin por cero INSERT INTO stats (symbol, ratio) VALUES ('XYZ', NULL); COMMIT; ... WHEN OTHERS THEN -- maneja todos los dems errores ROLLBACK; END; -- fin de las excepciones y del bloque. /

VERSIN 1

JPV-99

61 / 67

PL/SQL I

CREACIN DE UN PRAGMA PARA EL MANEJO DE ERRORES:

DECLARE insufficient_privileges EXCEPTION; PRAGMA EXCEPTION_INIT(insufficient_privileges, -1031); -----------------------------------------------------Oracle devuelve el error number -1031 si, por ejemplo, intentas MODIFICAR una tabla para la que slo tienes privilegios de consulta ------------------------------------------------------BEGIN ... EXCEPTION WHEN insufficient_privileges THEN Maneja el error ... END; /

ELEVACIN DE MENSAJES DE ERROR PROPIOS DE USUARIO.

DECLARE ... null_salary EXCEPTION; /* Nmero de Error mapeado devuelto por raise_application_error de una excepcin definida por el usuario. */ PRAGMA EXCEPTION_INIT(null_salary, 20101);

VERSIN 1

JPV-99

62 / 67

PL/SQL I

BEGIN ... raise_salary(:emp_number, :amount); EXCEPTION WHEN null_salary THEN INSERT INTO emp_audit VALUES (:emp_number, ...); ... END;

PRCTICA

EJERCICIO 18 EJERCICIO SOBRE MANEJO DE EXCEPCIONES Crear un bloque PL/SQL con una nica sentencia SELECT sobre la tabla EMPLEADOS, de tal forma que va a ir recuperando el salario del empleado del trabajo que se introduzca por teclado. En el caso de recuperar un solo empleado elevar una excepcin que se va a llamar SOLO_UN_EMPLEADO mostrando un mensaje por pantalla. En el caso de recuperar ms utilizaremos la excepcin TOO_MANY_ROWS y mostraremos un mensaje indicativo en la pantalla. En el caso de no recuperar ninguno utilizaremos las excepcin NO_DATA_FOUND y mostraremos el respectivo mensaje.

VERSIN 1

JPV-99

63 / 67

PL/SQL I

10.

RESUMEN

PL/SQL, (Procedural Language / SQL), es un lenguaje de programacin procedural estructurado en bloques que amplia la funcionalidad del lenguaje standard SQL a travs de estructuras como: Variables y tipos, (predefinidos y definidos por el usuario) Estructuras de control, (bucles y condiciones) Procedimientos y funciones Tipos de objetos y mtodos, (a partir de versin 8)

El Bloque PL/SQL es la unidad bsica en todo programa PL/SQL. Un programa PL/SQL ser un conjunto de bloques PL/SQL, situados de manera secuencial o anidados Existen diversas funciones predefinidas a las que se puede llamar desde una orden SQL. PL/SQL puede incluir sentencias de manejo de datos. Oracle abre un cursor implcito por cada sentencia SQL que tenga que procesar. Nos referiremos a l como SQL% Un cursor es un rea de trabajo que utiliza ORACLE para consultas que devuelven ms de una fila, permitiendo la lectura y manipulacin de cada una de ellas.

VERSIN 1

JPV-99

64 / 67

PL/SQL I

Declaracin de un cursor: CURSOR NOMBRE_CURSOR IS SENTENCIA SELECT; Para recuperar los datos de un cursor primero hay que abrirlo (OPEN), luego leerlo (FETCH), y por ltimo cerrarlo (CLOSE). Los registros PL/SQL son estructuras de datos complejas que permiten tratar variables diferentes, pero relacionadas, como si fuera una unidad. Una tabla PL/SQL es similar a una tabla de base de datos pero como si tuviera dos columnas una de ellas es el ndice y la otra el valor. La clave es siempre BINARY_INTEGER y el tipo valor es el tipo que hubiera especificado en la definicin. El mximo nmero de filas viene especificado por el nmero mximo de valores que se pueden representar mediante el tipo BINARY_INTEGER. Una transaccin es una serie de rdenes SQL que se completan o fallan como una unidad. Es decir, todas las rdenes se ejecutan o bien todas fallan. Una transaccin termina con la orden COMMIT o ROLLBACK. El control de errores se realiza en la zona de excepciones del bloque PL/SQL que es la parte final del bloque PL/SQL annimo o del procedimiento almacenado.

VERSIN 1

JPV-99

65 / 67

PL/SQL I

11.

EVALUACIN

En PL/SQL, pueden incorporarse rdenes DDL a) Siempre b) Slo a travs de SQL Dinmico c) Nunca

En un bloque PL/SQL, la declaracon de variables se hace en: a) En la zona declarativa b) Tanto en la zona declarativa como en la zona de proceso c) Solamente en el bloque de excepciones

Qu valor nos dara la variable resultado en la siguiente consulta? declare a number:=2; resultado varchar2(20); begin select decode(a,3,'Menor',4,'Siguiente',5,'Mayor','Otro') into resultado from dual; dbms_output.put_line(resultado); end; / a) No compilara porque en la declaracin no puede asignarse una variable a un nmero b) Mayor c) Otro

VERSIN 1

JPV-99

66 / 67

PL/SQL I

La sentencia ROLLBACK sirve para: a) Volver al bloque BEGIN / END anterior al que pertenece b) Reenva de nuevo la transaccin al usuario c) Deshace todos los cambios pendientes de la transaccin actual

Defina bloque PL/SQL annimo: ............................................................................................................... ............................................................................................................... ............................................................................................................... ...............................................................................................................

Definicin y usos del tipo PLS_Integer: ............................................................................................................... ............................................................................................................... ............................................................................................................... ...............................................................................................................

Definicin, usos y declaracin de un cursor: ............................................................................................................... ............................................................................................................... ............................................................................................................... ...............................................................................................................

VERSIN 1

JPV-99

67 / 67

PL/SQL II

PL/SQL II
Javier Prez-Vigo (Octubre 1999)

VERSIN 1

JPV-99

1 / 50

PL/SQL II

INTRODUCCIN
En la unidad didctica PL/SQL I se estudiaron los bloques PL/SQL annimos que se compilaban cada vez que eran ejecutados. Las estructuras que se vern en esta unidad didctica, (procedimientos, funciones, paquetes y disparadores), son bloques nominados y pueden ser almacenados en la base de datos para ser ejecutados tantas veces como sea necesario. PL/SQL slo puede contener rdenes DML y no DDL. Sin embargo esta restriccin se supera a partir de la versin 2.1 con el paquete DBMS_SQL. Este paquete implementa cdigo PL/SQL y SQL dinmico, al que se llama desde otros bloques PL/SQL. En el captulo 4 de esta unidad se ver cmo utilizar el paquete DBMS_SQL y sus implicaciones.

VERSIN 1

JPV-99

2 / 50

PL/SQL II

CONTENIDO:

1.

PROCEDIMIENTOS Y FUNCIONES PROCEDIMIENTOS FUNCIONES SUBPROGRAMAS LOCALES. CONTROL DE PROCEDIMIENTOS Y FUNCIONES.

2.

DESARROLLO Y UTILIZACIN DE PAQUETES PAQUETES (PACKAGES) FUNCIONES DENTRO DE PAQUETES.

3.

DISPARADORES (TRIGGERS) CONCEPTO DE DISPARADORES (TRIGGERS) CREACIN DE DISPARADORES CONCEPTO DE TABLA MUTANTE

4.

PL/SQL DINMICO CONCEPTO MTODOS DE IMPLEMENTACIN

5. 6. 7.

EJERCICIO DE DESARROLLO RESUMEN EVALUACIN

VERSIN 1

JPV-99

3 / 50

PL/SQL II

OBJETIVOS
El alumno tras el estudio de esta unidad didctica podr: Conocer y utilizar los procedimientos y funciones almacenados a travs del lenguaje PL/SQL. Crear y utilizar los paquetes, packages. Conocer y utilizar los disparadores. Entender los fundamentos del PL/SQL dinmico.

EXPECTATIVAS

VERSIN 1

JPV-99

4 / 50

PL/SQL II

1. PROCEDIMIENTOS Y FUNCIONES

CONCEPTO DE PROCEDIMIENTOS Y FUNCIONES


Los bloques PL/SQL forman una estructura de bloques annimos, es decir, se compilan contra la Base de Datos y una vez ejecutados se pierden. Se hace necesario tener estructuras de bloques nominados, tal que puedan almacenarse en la Base de Datos y ser llamados cuando se necesiten.

IMPORTANTE

Un procedimiento es un conjunto de instrucciones PL/SQL que puede ser llamado usando el nombre que se le haya asignado. Una funcin es un conjunto de instrucciones en PL/SQL, que pueden ser llamados usando el nombre con que se le haya creado. Se diferencian de los procedimientos, en que las funciones retornan un valor al ambiente desde donde fueron llamadas.

NOTA

Una vez creados un procedimiento o una funcin pueden llamarse desde multitud de lados: SQL*, Forms o cualquier otra herramienta ORACLE.

VERSIN 1

JPV-99

5 / 50

PL/SQL II

PROCEDIMIENTOS

CREACIN DE PROCEDIMIENTOS
Utilizaremos la siguiente sentencia:

CREATE [OR REPLACE] PROCEDURE nombre_procedimiento [(argumento1 TIPO tipo_dato1,..., argumentoN TIPO tipo_datoN)] IS O AS Bloque PL/SQL

Su estructura es semejante a:

CREATE OR REPLACE PROCEDURE PROCEDIMIENTO IS tmpVar NUMBER; /****************************************************************************** NAME: PROCEDIMIENTO PURPOSE: To calculate the desired information. REVISIONS: Ver Date Author Description --------- ---------- --------------- -----------------------------------1.0 10/09/99 1. Created this procedure. ******************************************************************************/ BEGIN tmpVar := 0; EXCEPTION WHEN NO_DATA_FOUND THEN Null; WHEN OTHERS THEN Null; END PROCEDIMIENTO; /

VERSIN 1

JPV-99

6 / 50

PL/SQL II

NOTA

El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el procedimiento ya existe, se producir un error. Es conveniente utilizar al principio slamente CREATE, ya que de existir el procedimiento en el ncleo podemos destruirlo.

Los tipos de los argumentos son: IN, OUT, IN OUT Indican si el parmetro es de entrada, salida o ambos. Si no se pone nada se supone que es IN.

IS o AS llevan implcito el DECLARE, as que las variables se declaran inmediatamente despus de IS o AS.

Un procedimiento termina con END o con END seguido del nombre del procedimiento.

NOTA

No puede haber declaracin de argumentos, es decir, en las declaraciones de tipo NUMBER, VARCHAR2 o DATE no puede figurar ni la escala ni la precisin. Es aconsejable utilizar los atributos %TYPE y %ROWTYPE para definir argumentos y variables.

VERSIN 1

JPV-99

7 / 50

PL/SQL II

BORRADO
Para borrar un procedimiento se utiliza:

DROP PROCEDURE Nombre_procedimiento;

EJECUCIN

IMPORTANTE

Un procedimiento se invoca con la sentencia EXEC[UTE] desde SQL*. Desde un bloque PL/SQL simplemente es necesario nombrarlo para ejecutarlo.

Los procedimientos (o funciones) que se declaran como locales a un bloque PL/SQL se situarn al final del DECLARE. Las formas de llamar a un procedimiento son las siguientes: Exec nombre_procedimiento(var1, var2) Exec nombre_procedimiento(var2 => xxx, var1 => yyy)

NOTA

Como argumentos en un procedimiento puede haber registros o tablas.

VERSIN 1

JPV-99

8 / 50

PL/SQL II

PRCTICA

EJERCICIO SOBRE PROCEDIMIENTOS

EJERCICIO 1 Crear un tabla, EMPLEADOS, con los campos: nombre, trabajo, salario. Crear un bloque PL/SQL que extraiga de la tabla EMP aquellos empleados con comisin nula (utilizando un cursor). Aumentar su salario un 10% e introducir cada uno de ellos en la tabla EMPLEADOS utilizando un procedimiento cuyos argumentos van a ser nombre, salario y trabajo.

EJERCICIO 2 Ampliar el procedimiento creado para el ejercicio anterior de tal manera que si el empleado tiene como trabajo CLERK y su nmero de departamento es el 20 se insertar en la tabla EMP con una comisin = 1000 y no se insertar en la tabla EMPLEADOS. En cualquier otro caso introducir el empleado en la tabla EMPLEADOS. Modificar el nmero de argumentos pasados al procedimiento aadiendo uno que sea insertados el cual va a indicar el nmero de elementos que se han insertado en la tabla empleados. Mostrar dicho nmero desde el bloque PL/SQL con un mensaje.

VERSIN 1

JPV-99

9 / 50

PL/SQL II

FUNCIONES
CREACIN DE FUNCIONES
Utilizaremos la siguiente sentencia: CREATE [OR REPLACE] FUNCTION nombre_funcin [(argumento1 TIPO tipo_dato1,...., argumentoN TIPO tipo_datoN)] RETURN tipo_dato IS O AS Bloque PL/SQL

Su estructura es semejante a:

CREATE OR REPLACE FUNCTION FUNCION RETURN NUMBER IS tmpVar NUMBER; /****************************************************************************** NAME: FUNCION PURPOSE: To calculate the desired information. REVISIONS: Ver Date Author Description --------- ---------- --------------- -----------------------------------1.0 10/09/99 1. Created this function. ******************************************************************************/ BEGIN tmpVar := 0; EXCEPTION WHEN NO_DATA_FOUND THEN Null; WHEN OTHERS THEN Null; RETURN tmpVar; END FUNCION; /

VERSIN 1

JPV-99

10 / 50

PL/SQL II

Como TIPO: IN, OUT, IN OUT

NOTA

Los argumentos OUT o IN OUT son vlidos dentro de las funciones pero se usan raramente.

Return de una funcin no lleva ni escala ni precisin. Return puede llevar expresiones. El tipo de dato no puede incluir escala o precisin. Una funcin puede tener ms de un return. Si declaramos una sin return da un error.

BORRADO
Para borrar una funcin se utiliza:

DROP FUNCTION Nombre_procedimiento;

EJECUCIN

IMPORTANTE

Una funcin se invoca con la sentencia EXECUTE, como ocurre en los procedimientos, pero hay que tener en cuenta que tiene que asignarse a alguna variable del mismo tipo que se devuelve.

VERSIN 1

JPV-99

11 / 50

PL/SQL II

Una funcin se puede invocar desde una sentencia SELECT, WHERE, HAVING, clusula VALUES de un INSERT y SET de un UPDATE.

Pueden pasarse y devolver REGISTROS y TABLAS.

FUNCIONES PL/SQL DENTRO DE SENTENCIAS SQL


Para incluir una funcin dentro de una sentencia SQL: Debe de ser una funcin de fila nica (devuelven un nico valor). No pueden ser ni registros ni tablas. Todos los argumentos deber ser de tipo IN. Los tipos de datos: BOOLEAN, RECORD o TABLE no estn permitidos (no son tipo SQL). El valor resultante tiene que ser: NUMBER, CHAR, VARCHAR2, DATE. Las funciones no pueden modificar datos en las tablas. No se puede utilizar INSERT, UPDATE, DELETE dentro de ellas.

NOTA

Las funciones pueden incluirse tanto en el bloque WHERE de una SELECT como directamente en una VISTA.

VERSIN 1

JPV-99

12 / 50

PL/SQL II

SUBPROGRAMAS LOCALES.
Al igual que los procedimientos y funciones, es posible incluir en un bloque PL/SQL un subprograma.

IMPORTANTE

Los subprogramas se incluyen en el DECLARE del bloque y es necesario incluir el subprograma entero.

PRCTICA

EJERCICIOS SOBRE FUNCIONES

EJERCICIO 3 Crear una funcin que nos permita realizar una consulta del salario del empleado de la tabla EMP que se le pasa como parmetro desde SQL* (se le pasa el nmero del empleado). Si la consulta ha sido satisfactoria la funcin devuelve un SI, en caso contrario devuelve un NO. Utilizar desde el SQL para llamar a la funcin: dbms_output.put_line(Existe el empleado?||di_si_existe(&empleado));

VERSIN 1

JPV-99

13 / 50

PL/SQL II

EJERCICIO 4 Utilizar una sentencia SELECT sobre la tabla EMP que nos permita ver los campos empno, ename y el salario de los empleados. Si el empleado tiene una salario mltiplo de 5 y mayor de 1500 mostrar su salario multiplicado por 15, en caso contrario su salario permanece invariable.

EJERCICIO 5 Utilizar una SELECT para extraer de la tabla EMP cada uno de los empleados y su mximo jefe. Obtener su mximo jefe utilizando una funcin.

EJERCICIO 6 Crear un bloque PL/SQL que sea capaz de cargar un array de registros cuyos campos son nombre_empledo y ranking y muestre el contenido de dicho array ordenado. El campo ranking lo obtendremos a travs de un procedimiento a partir del cual se va a obtener el puesto que ocupa cada empleado en la empresa en cuestin de salario + comisin. Utilizar un cursor para cargar la tabla.

VERSIN 1

JPV-99

14 / 50

PL/SQL II

CONTROL DE PROCEDIMIENTOS Y FUNCIONES.

DOCUMENTACIN DE PROCEDIMIENTOS Y FUNCIONES.


A travs de la vista del diccionario de datos USER_OBJECTS se pueden obtener los nombres de los siguientes elementos de un esquema. DATABASE LINK FUNCTION INDEX PACKAGE PACKAGE BODY PROCEDURE SEQUENCE SYNONYM TABLE TRIGGER VIEW

A travs de la vista del diccionario de datos USER_SOURCE se puede obtener el cdigo de los siguientes elementos dentro de un esquema: FUNCTION PACKAGE PACKAGE BODY PROCEDURE

VERSIN 1

JPV-99

15 / 50

PL/SQL II

Para visualizar el nombre de un procedimiento o funcin y su lista de argumentos utilizaremos el comando DESCRIBE. DESC[RIBE] Nombre_procedimiento o Nombre_funcin;

Para mostrar el texto de los errores de compilacin utilizaremos la vista USER_ERRORS.

Para visualizar los errores de compilacin utilizaremos la siguiente sentencia: SHOW ERRORS PROCEDURE o FUNCTION o PACKAGE o PACKAGE BODY o TRIGGER nombre_objeto;

DEPURACIN DE PROCEDIMIENTOS Y FUNCIONES.

IMPORTANTE

Para la depuracin de procedimientos y funciones se utiliza el procedimiento suministrado por Oracle: DBMS_OUTPUT

Para activar este procedimiento utilizaremos la opcin SET SERVEROUTPUT ON

Para preparar el texto del mensaje de salida se utiliza PUT. DBMS_OUTPUT.PUT (Texto);

VERSIN 1

JPV-99

16 / 50

PL/SQL II

Para visualizar por pantalla el mensaje utilizamos NEW_LINE. DBMS_OUTPUT.NEW_LINE;

Para preparar y visualizar el texto se utiliza PUT_LINE (opcin ms utilizada) Estos procedimientos estn sobrecargados y pueden mostrar directamente datos de los siguientes formatos: DBMS_OUTPUT.PUT_LINE (varchar2) DBMS_OUTPUT.PUT_LINE (number) DBMS_OUTPUT.PUT_LINE (date)

NOTA

No hace falta transformar un entero a varchar2 para utilizarlo en la sentencia DBMS_OUTPUT.

VERSIN 1

JPV-99

17 / 50

PL/SQL II

Este sera el diagrama en el que se explica el funcionamiento del DBMS_OUTPUT:

NOTA

La salida DBMS_OUTPUT es independiente para cada sesin.

NOTA

Para que no nos d un error debido a que el buffer es muy pequeo, conviene inicializarlo mediante el comando: SET SERVEROUTPUT ON size 1000000

VERSIN 1

JPV-99

18 / 50

PL/SQL II

2. DESARROLLO Y UTILIZACIN DE PAQUETES

PAQUETES (PACK AGES)

IMPORTANTE

Un paquete es un grupo de identificadores y rutinas agrupadas dentro de la misma construccin.

Estructura de un paquete:

Variable Pblica

Declaracin del Procedimiento A

Procedimiento Pblico

PACKAGE

Zona de Especificacin

PBLICA

Variable Privada

Definicin del Procedimiento B

Procedimiento Privado

PACKAGE BODY

Definicin del Procedimiento A Variable local Procedimiento Pblico

Cuerpo del paquete

PRIVADA

VERSIN 1

JPV-99

19 / 50

PL/SQL II

CREACIN DE PAQUETES
Para crear un paquete: CREATE [OR REPLACE] PACKAGE Nombre_paquete IS O AS Declaracin variable Declaracin cursor Declaracin excepcin Declaracin procedimiento Declaracin funcin END Nombre_paquete

Para la creacin del cuerpo del paquete: CREATE [OR REPLACE] PACKAGE BODY Nombre_paquete IS O AS Declaracin variable Declaracin cursor Declaracin excepcin Cdigo del procedimiento Cdigo de la funcin [BEGIN Cdigo de inicializacin del paquete]

END Nombre_paquete

Para borrar un paquete y el cuerpo del paquete se utiliza. DROP PACKAGE Nombre_paquete

VERSIN 1

JPV-99

20 / 50

PL/SQL II

Para borrar el cuerpo del paquete se utiliza. DROP PACKAGE BODY Nombre_paquete

Para invocar un procedimiento o funcin de un paquete desde fuera del mismo se utiliza la orden EXECUTE desde SQL*, (desde un form no es necesario el EXECUTE). EXEC[UTE] Nombre_paquete.Nombre_funcin Nombre_procedimiento

NOTA

Cualquier objeto de la cabecera de un paquete est dentro del mbito y visible desde fuera. NOMBRE_PAQUETE.NOMBRE_OBJETO

Siempre es posible declarar una variable en un bloque PL/SQL del mismo tipo que uno que figure dentro del package: DECLARE V_hist ClassPackage.t_lista;

NOTA

Dentro del cuerpo del paquete se puede hacer referencia a los objetos sin necesidad del "."

VERSIN 1

JPV-99

21 / 50

PL/SQL II

Los packages disponen de la opcin de sobrecarga de procedimientos y funciones, es decir, con el mismo nombre y distintos argumentos.

DECLARE FUNCTION value_ok (date_in IN DATE) RETURN BOOLEAN IS BEGIN RETURN date_in <= SYSDATE; END; FUNCTION value_ok (num_in IN NUMBER) RETURN BOOLEAN IS BEGIN RETURN number_in > 0; END; BEGIN IF value_ok (SYSDATE) THEN ... END IF; IF value_ok (total_sales) THEN ... END IF; END; Number Version Date Version

NOTA

No se pueden sobrecargar si difieren slo en el modo (IN OUT). No se pueden sobrecargar si difieren slo en el tipo de dato devuelto. No se pueden sobrecargar si difieren slo en la familia del tipo de dato.

VERSIN 1

JPV-99

22 / 50

PL/SQL II

Podemos cambiar el cuerpo sin cambiar la cabecera. Si cambiamos la cabecera y no el cuerpo ste queda invlido, siendo necesario volver a compilarlo.

Para compilar los objetos invlidos utilizaremos la siguiente sentencia:

select 'alter '|| decode ( object_type, 'PACKAGE BODY', 'PACKAGE', object_type )|| ' '|| object_name|| ' compile'|| decode ( object_type, 'PACKAGE BODY', ' body;', ';' ) from user_objects where status = 'INVALID' /

FUNCIONES DENTRO DE PAQUETES.


Es necesario indicar el nivel de depuracin de una funcin dentro de un paquete cuando se crea un paquete (en la especificacin). El nivel de depuracin determina qu operaciones no van a ser realizadas por la funcin del paquete. No se puede utilizar una funcin que est dentro de un paquete en una sentencia SQL. Es necesario indicar el nivel de depuracin.

VERSIN 1

JPV-99

23 / 50

PL/SQL II

Para ello utilizaremos la sentencia: PRAGMA RESTRICT_REFERENCES (NOMBRE_FUNCION, WNDS [,WNPS] [,RNDS] [,RNPS]);

El pragma se indica en la especificacin del paquete detrs de todas las funciones. El argumento WNDS debe indicarse SIEMPRE que se utilice

RESTRICT_REFERENCES. WNDS -> (Writes No Database State) Indica que la funcin no va modificar tablas de la base de datos WNPS -> (Writes No Package Status) Indica que la funcin no va a cambiar los valores de variables de un paquete pblico. RNDS -> (Reads No Database State) Indica que la aconsultar ninguna tabla de la base de datos. RNPS-> (Reads No Package Status) Indica que la funcin no va a referenciar los valores de las variables de un paquete pblico. funcin no va

CREATE OR REPLACE PACKAGE PAQUETE IS FUNCTION MyFuncName ( inVal Number ) Return Number; PROCEDURE MyProcName ( inVal Number, JobId VARCHAR2 ); pragma restrict_references ( MyFuncName, WNDS, WNPS, RNDS ); END PAQUETE; /

VERSIN 1

JPV-99

24 / 50

PL/SQL II

CREATE OR REPLACE PACKAGE BODY PAQUETE AS FUNCTION MyFuncName ( inVal Number ) Return Number IS TmpVar NUMBER; BEGIN tmpVar := 0; EXCEPTION WHEN NO_DATA_FOUND THEN Null; WHEN OTHERS THEN Null; RETURN tmpVar; END MyFuncName;

PROCEDURE MyProcName ( inVal Number, JobId VARCHAR2 ) IS TmpVar NUMBER; BEGIN tmpVar := 0; EXCEPTION WHEN NO_DATA_FOUND THEN Null; WHEN OTHERS THEN Null; END MyProcName;

END PAQUETE; /

VERSIN 1

JPV-99

25 / 50

PL/SQL II

PRCTICA

EJERCICIOS SOBRE PAQUETES

EJERCICIO 7 Crear un paquete con los siguientes elementos: una tabla para almacenar registros con los campos nombre, salario, un procedimiento pr_insertar(nombre, salario) y un ndice. Se tratara de recuperar desde un bloque PL/SQL los elementos de la tabla EMP cuya suma de su salario + comisin > 2000 e ir introducindolos en la tabla del paquete recin creado a partir de la funcin pr_insertar. Consultar desde el bloque PL/SQL el ndice del paquete y obtener el nmero de registros introducidos en dicha tabla.

EJERCICIO 8 Ampliar el paquete creado en el ejercicio con las funciones fu_recupera_sal y fu_inicializa. La nueva funcin, fu_recupera_sal, nos va a permitir recuperar el salario de un empleado si se le pasa el nombre como argumento. En el caso de halla varias personas con el mismo nombre recuperar la primera. En el caso de que no hubiera ninguna mostrar por pantalla el mensaje de error ORA20001 Persona no encontrada. Probar esta funcin desde SQL*. La funcin fu_inicializa borra la tabla y pone el ndice a 0.

VERSIN 1

JPV-99

26 / 50

PL/SQL II

EJERCICIO 9 Crear un paquete con tres funciones que se van a llamar (las tres) fu_recupera. Si se le pasa un nmero me va a devolver el salario de la persona que se encuentra en la posicin que se le est pasando como argumento de la tabla del paquete anterior. En caso de no existir dicho elemento en la tabla mostrar un mensaje por pantalla. Si se pasa una cadena de caracteres tiene que hacer una consulta sobre la tabla EMP de tal forma que nos tiene que contar el nmero de personas con el mismo nombre que la cadena que se le est pasando. Si se le pasa una fecha tiene que introducir en una tabla (no pblica) las personas con una antigedad mayor que la pasada como parmetro de forma ordenada por fecha . Se trata de una tabla de registros con los campos Nombre, antigedad. Extraer cada uno de esos empleados de la tabla, visualizando el nombre del empleado y el nmero de das que lleva en la empresa. EJERCICIO 10 Ampliar el primer paquete creado con la funcin fu_media_comision la cual nos va a dar la media de las comisiones de todos los empleados que tienen tabajo CLERK. Realizar una consulta en SQL* sobre la tabla EMP de forma que extraiga los empleados cuya comisin sea mayor que el valor devuelto por la funcin fu_media_comision.

VERSIN 1

JPV-99

27 / 50

PL/SQL II

3. DISPARADORES EN BASE DE DATOS

DISPARADORES (TRIGGERS)

IMPORTANTE

Un disparador es un bloque PL/SQL asociado a una tabla que se ejecuta cuando una determinada instruccin SQL se va a ejecutar sobre dicha tabla.

Se asemejan con los procedimientos y funciones en que son bloques PL/SQL nominados con secciones declarativa, ejecutable y de manejo de excepciones y en que se almacenan en la base de datos. Se diferencian en que se ejecutan implcitamente cuando se ejecuta una sentencia de manipulacin de datos sobre una tabla (INSERT, UPDATE, DELETE), y en que el disparador no admite argumentos. Los disparadores se utilizan principalmente para: Para el mantenimiento de restricciones de integridad compleja, que no sean posibles con las restricciones declarativas definidas en el momento de crear la tabla. (Comn en desnormalizaciones). En la auditora de la informacin contenida en la tabla, registrando los cambios realizados y la identidad de quien lo llev a cabo. El aviso automtico a otros programas de que hay que llevar a cabo una determinada accin, cuando se realiza un cambio en la tabla. Tipos de disparadores: Disparadores de sentencia: Se ejecutan una sola vez por cada sentencia.
VERSIN 1 JPV-99 28 / 50

PL/SQL II

Disparadores de fila: Se activan una vez por cada fila afectada por la orden que provoc el disparo. Se pueden combinar diferentes acontecimientos en un nico disparador, utilizando los predicados condicionales INSERTING, UPDATING y DELETING dentro del cuerpo del disparador (devuelven un boolean TRUE o FALSE cuando se consultan). Se puede visualizar el contenido de un disparador a travs de la vista del diccionario de datos USER_TRIGGERS. Clasificacin: Segn el momento en el que salta el disparador
*BEFORE * AFTER * INSERT

Segn el tipo de operacin que provoca su actuacin

* UPDATE * DELETE

Segn las veces que se ejecuta el cuerpo del disparador

* Sentencia * Fila

En la figura de abajo se disparan los triggers para la operacin que contiene la clusula WHERE: WHERE ENAME LIKE 'J%':

NOTA

Dentro de un disparador estn prohibidas sentencias transaccionales: COMMIT, ROLLBACK y SAVEPOINT.

VERSIN 1

JPV-99

29 / 50

PL/SQL II

Para borrar un trigger utilizaremos: DROP TRIGGER Nombre_trigger

CREACIN DE DISPARADORES

DISPARADORES DE SENTENCIA
Se utiliza las siguientes sentencia para los disparadores de sentencia: CREATE [OR REPLACE] TRIGGER Nombre_disparador MOMENTO ACONTECIMIENTO ON Nombre_tabla BLOQUE PL/SQL

DISPARADORES DE FILA
Para los disparadores de fila se utiliza esta otra sentencia: CREATE [OR REPLACE] TRIGGER Nombre_disparador MOMENTO ACONTECIMIENTO ON Nombre_tabla FOR EACH ROW [WHEN Condicin_restriccin] [REFERENCING OLD O NEW AS Nombre_sustituto_old_o_new]

Dentro de un disparador de fila, se puede referenciar el valor de la columna antes de ser modificado anteponiendo el cualificador :OLD y referenciar el nuevo valor de la columna anteponiendo el cualificador :NEW.

Durante la insercin el valor antiguo es NULL, durante el borrado el valor nuevo es NULL.

El cualificador :NEW puede aparecer a la izquierda de una asignacin en el cuerpo PL/SQL solamente en disparadores de fila BEFORE. No puede aparecer en la

VERSIN 1

JPV-99

30 / 50

PL/SQL II

parte izquierda de una asignacin en el cuerpo PL/SQL de un disparador AFTER. Ni en el predicado condicional DELETING. El cualificador :OLD no puede aparecer nunca en la parte izquierda de una sentencia de asignacin.

NOTA

Aunque no surga un error de compilacin, hay que tener en cuenta que :OLD no est definido para las rdenes INSERT, as como no lo estar :NEW para el DELETE.

NOTA

A pesar de que :NEW y :OLD sean tratados sintcticamente como registros del tipo tabladisparo%Rowtype, en realidad no son registros (por tanto no se pueden asignar como registros completos); sino que son variables de acoplamiento.

ACTIVACIN DE DISPARADORES
Para activar un disparador: ALTER TRIGGER Nombre_disparador ENABLE;

Para desactivar un disparador: ALTER TRIGGER Nombre_disparador

VERSIN 1

JPV-99

31 / 50

PL/SQL II

ORDEN DE EJECUCIN DE LOS DISPARADORES


Los disparadores se ejecutan segn el siguiente orden: 1. Ejecutar, si existe, el disparador de tipo BEFORE (disparador previo) de tipo sentencia. 2. Para cada fila a la que afecte la orden. a) Ejecutar, si existe, el disparador BEFORE a nivel de fila. b) Ejecutar la propia orden. c) Ejecutar, si existe, el disparador de tipo AFTER con nivel de fila. 3. Ejecutar, si existe, el disparador AFTER, de tipo sentencia.

CONCEPTO DE TABLA MUTANTE

IMPORTANTE

Una tabla mutante es una tabla que est modificndose actualmente por una orden DML (INSERT, UPDATE, DELETE). Para un disparador, sta es la tabla sobre la que est definido.

Un trigger de sentencia nunca provoca el error de tabla mutante. Supongamos un trigger for each row que se dispara cuando se modifiquen datos de una tabla. El trigger a su vez realiza una modificacin sobre la misma tabla. Esto provoca que la tabla quede mutante por la incosistencia de la informacin en ese instante y da un error por pantalla.

VERSIN 1

JPV-99

32 / 50

PL/SQL II

La solucin del error de la tabla mutante consistira en crear un disparador de sentencia BEFORE en el que se van almacenando los datos (no se consulta ni modifica la misma tabla), y otro de fila AFTER que utilizarn los valores almacenados por el disparador de sentencia: BEFORE BEFORE EACH ROW AFTER -> Inicializa -> Almacena -> Procesa

NOTA

Si una operacin INSERT afecta a una nica fila, entonces los disparadores de fila previo y posterior por dicha fila no tratarn a la tabla como mutante.

CREATE OR REPLACE TRIGGER DISPARADOR BEFORE INSERT OR UPDATE ON MyTableName FOR EACH ROW tmpVar NUMBER; BEGIN tmpVar := 0;

Select MySeq.NextVal into tmpVar from dual; :NEW.SequenceColumn := tmpVar; :NEW.CreatedDate := Sysdate;

VERSIN 1

JPV-99

33 / 50

PL/SQL II

:NEW.CreatedUser := User; EXCEPTION WHEN OTHERS THEN Null; END DISPARADOR; /

PRCTICA

EJERCICIOS SOBRE TRIGGERS

EJERCICIO 11 Crear un trigger sobre EMP de forma que cuando se vaya a insertar un nuevo registro verifique que no haya ms de 20 registros ya insertados. Si ya los hubiera, mostrar un mensaje de error indicando la imposibilidad de insertar el nuevo registro.

EJERCICIO 12 Hacer un disparador de base de datos sobre la tabla DEPT, en el cual cuando se inserte o se actualice el nmero de departamento, compruebe que este nmero sea mltiplo de diez.

VERSIN 1

JPV-99

34 / 50

PL/SQL II

EJERCICIO 13 Crear la tabla CONTABILIDAD con los campos departamento, movimiento y dinero. Crear un disparador de fila de base de datos en el cual cada vez que se hace una operacin sobre la tabla EMP (insercin, modificacin,borrado), realice una insercin sobre la tabla CONTABILIDAD con el movimiento realizado sobre EMP. Los movimientos a insertar son de tres tipo: INSERCION, MODIFICACION, BORRADO.

EJERCICIO 14 Realizar un disparador de fila sobre la tabla EMP que se ejecute cuando se actualiza o se inserte sobre la tabla EMP, comprobar que el salario se encuentra entre el mximo y el mnimo de ese trabajo para un departamento. En el caso de que no exista ninguna fila en la tabla EMP cuyo departamento sea igual al insertado, hay que comprobar que existe el departamento en la tabla DEPT. En el caso de existir, insertar la fila en EMP sin ms comprobaciones. En caso de no existir insertar el departamento en la tabla DEPT con el campo dname a NULL y el campo loc a NULL. Si se modifica el departamento de un director hay que cambiar el departamento a sus empleados.

EJERCICIO 15 Crear VIGENCIAS con los campos: empleado, f_desde y f_hasta. Realizar un disparador sobre la tabla VIGENCIAS del manera que compruebe que cada fila tratada no se solape con otra ya insertada.

VERSIN 1

JPV-99

35 / 50

PL/SQL II

EJERCICIO 16 Realizar un disparador de fila sobre la tabla emp que se ejecute cuando se actualiza sobre la tabla emp el campo trabajo (JOB) y que compruebe que si se trata de un vendedor (SALESMAN) su comisin no sea mayor que la del jefe con menor comisin. Modificar los empleados de la tabla emp que tienen trabajo CLERK y sustituirlo por SALESMAN. Observar lo que pasa. Sustituir el trigger de fila por dos, uno antes de modificar (for each row) y otro after (de sentencia) y un paquete que solucione el error de la tabla mutante.

VERSIN 1

JPV-99

36 / 50

PL/SQL II

4. PL/SQL DINMICO
CONCEPTO

IMPORTANTE

El PL/SQL dinmico nace de la necesidad de implementar rdenes DDL dentro de un bloque de PL/SQL. Se implementa en el paquete DBMS_SQL

Mediante el DBMS_SQL podemos manejar tambin rdenes DML. Las rdenes SQL Dinmicas tienen muy pocas restricciones, porque si se desea, la orden completa SQl se puede determinar en el momento de la ejecucin, en lugar de en la compilacin.

NOTA

En ocasiones, la necesidad de incluir rdenes DML dinmicamente surge al hacer referencia a una tabla, que se crear en ejecucin; por lo que si la orden que la refiere estuviera en SQL esttico, no compilara.

Desventajas: El SQL Dinmico no se ejecuta con la misma eficiencia que el esttico. Aquellas tablas a las que se hace referencia no aparecern en

USER_DEPENDENCES.

VERSIN 1

JPV-99

37 / 50

PL/SQL II

Cuando se borra una tabla dinmicamente, es labor del usuario el cambiar el estado de los paquetes que hagan referencia a dicha tabla.

PROCEDIMIENTOS DE SQL DINMICO:


Funcin DBMS_SQL.OPEN_CURSOR RETURN INTEGER; Abre el puntero para el cursor Procedure DBMS_SQL.PARSE (cursor IN INTEGER, sentencia_a_ejecutar IN

VARCHAR2, DBMS_SQL.NATIVE IN INTEGER); Asocia el puntero con la sentencia SQL Funcin DBMS_SQL.IS_OPEN (c IN INTEGER) RETURN BOOLEAN; Comprueba si el cursor ya est abierto. Procedure DBMS_SQL.BIND_VARIABLE (cursor IN INTEGER, :variable_usada IN VARCHAR2, dato a incluir IN <datatype>); Asigna las variables a la sentencia. Procedure DBMS_SQL.DEFINE_COLUMN (cursor IN INTEGER, position_en_la_select_de_la_columna IN INTEGER, columna_variable IN <column_datatype>); Tipos de datos de las columnas para crear variables locales. Funcin DBMS_SQL.EXECUTE (cursor IN INTEGER) RETURN INTEGER; Ejecuta la sentencia asociada al cursor. FUNCTION DBMS_SQL.FETCH_ROWS

VERSIN 1

JPV-99

38 / 50

PL/SQL II

(cursor IN INTEGER) RETURN INTEGER; Recoge la siguiente fila del cursor PROCEDURE DBMS_SQL.COLUMN_VALUE (cursor IN INTEGER, posicion IN INTEGER, valor OUT <datatype>, [, column_error OUT NUMBER] [, actual_length OUT INTEGER ]); Introduce el valor del cursor en variables locales PROCEDURE DBMS_SQL.CLOSE_CURSOR (cursor IN OUT INTEGER); Cierra el cursor.

MTODOS DE IMPLEMENTACIN

IMPORTANTE

Existen varios mtodos distintos de implementar SQL Dinmico: Ejecucin de rdenes DML Ejecucin de rdenes DDL que no sean consultas Ejecucin de consultas

VERSIN 1

JPV-99

39 / 50

PL/SQL II

EJECUCIN DE RDENES DML


Estructura de la orden: Abir el cursor (OPEN_CURSOR) Analizar la orden (PARSE) Cerrar el cursor (CLOSE_CURSOR)

DECLARE t_owner

varchar2(30) := 'ACADEMIA';

CURSOR all_obj_cur IS SELECT table_name ,trigger_name FROM user_triggers WHERE STATUS='DISABLED' order by table_name,trigger_name; disable_cursor INTEGER; out_str BEGIN FOR obj_rec IN all_obj_cur LOOP disable_cursor := DBMS_SQL.OPEN_CURSOR; out_str := 'ALTER TRIGGER ' || obj_rec.trigger_name || ' ENABLE'; DBMS_SQL.PARSE (disable_cursor, out_str, DBMS_SQL.NATIVE); DBMS_SQL.CLOSE_CURSOR (disable_cursor); END LOOP; END; / VARCHAR2(1000);

VERSIN 1

JPV-99

40 / 50

PL/SQL II

EJECUCIN DE RDENES DDL QUE NO SEAN CONSULTAS


Estructura de la orden: Abir el cursor (OPEN_CURSOR) Analizar la orden (PARSE) Acoplar todas las variables de entrada (BIND_VARIABLE) Ejecutar la orden (EXECUTE) Cerrar el cursor (CLOSE_CURSOR)

CREATE OR REPLACE PROCEDURE UpdateSal( p_Department IN emp.deptno%TYPE, p_NewSal IN emp.sal%TYPE, p_RowsUpdated OUT INTEGER) AS v_CursorID INTEGER; v_UpdateStmt VARCHAR2(100); BEGIN -- Open the cursor for processing. v_CursorID := DBMS_SQL.OPEN_CURSOR; --Determine the SQL string. v_UpdateStmt := 'UPDATE emp SET sal = :nc WHERE deptno = :dept'; --Parse the statement. DBMS_SQL.PARSE(v_CursorID, v_UpdateStmt, DBMS_SQL.V7); --Bind p_NewSal to the placeholder :nc.

VERSIN 1

JPV-99

41 / 50

PL/SQL II

DBMS_SQL.BIND_VARIABLE(v_CursorID, ':nc', p_NewSal); --Bind p_Department to the placeholder :dept. DBMS_SQL.BIND_VARIABLE(v_CursorID, ':dept', p_Department); -- Execute the statement. p_RowsUpdated := DBMS_SQL.EXECUTE(v_CursorID); -- Close the cursor. DBMS_SQL.CLOSE_CURSOR(v_CursorID); EXCEPTION WHEN OTHERS THEN -- Close the cursor, then raise the error again. DBMS_SQL.CLOSE_CURSOR(v_CursorID); RAISE; END UpdateSal; /

EJECUCIN DE CONSULTAS
Estructura de la orden: Abir el cursor (OPEN_CURSOR) Analizar la orden (PARSE) Acoplar todas las variables de entrada (BIND_VARIABLE) Definir las variables de salida (DEFINE_COLUMN) Ejecutar la consulta (EXECUTE) Extraer las filas (FETCH_ROWS) Devolver los resultados a variables (COLUMN_VALUE) Cerrar el cursor (CLOSE_CURSOR)

VERSIN 1

JPV-99

42 / 50

PL/SQL II

CREATE OR REPLACE FUNCTION obtener_nombre (empno_in IN emp.empno%TYPE) RETURN VARCHAR2 IS cur INTEGER; out_str varchar2(1000); fdbk INTEGER; return_value emp.ename%TYPE := NULL; BEGIN cur := DBMS_SQL.OPEN_CURSOR; out_str := ('SELECT ename FROM emp WHERE empno = :id'); DBMS_SQL.PARSE (cur, out_str, DBMS_SQL.NATIVE); /* Define the first/only column as a string. */ DBMS_SQL.DEFINE_COLUMN (cur, 1, return_value, 100); /* Bind the specified contact ID into the SELECT. */ DBMS_SQL.BIND_VARIABLE (cur, 'id', empno_in); /* Execute and fetch from the cursor. */ fdbk := DBMS_SQL.EXECUTE (cur); fdbk := DBMS_SQL.FETCH_ROWS (cur); /* Fetch the row. If feedback is 0, no match found */ IF fdbk = 1 THEN /* A record was fetched. Retrieve the name. */ DBMS_SQL.COLUMN_VALUE (cur, 1, return_value); END IF; DBMS_SQL.CLOSE_CURSOR (cur); RETURN return_value; END obtener_nombre; /

VERSIN 1

JPV-99

43 / 50

PL/SQL II

NOTA

Procurar siempre cerrar todos los cursores una vez ejecutada la sentencia, incluso a travs de las excepciones.

NOTA

No utilice comentario especificados con dentro de un bloque PL/SQL ejecutado con DBMS_SQL. El smbolo de doble guin hace que se considere como comentario todo lo que sigue, hasta encontrar un carcter de avance de linea. Sin embargo, dado que el bloque completo se encuentra en una cadena, todo el resto del bloque sera considerado un comentario. Utilice los comentarios de estilo C delimitados por /* y */ en su lugar.

VERSIN 1

JPV-99

44 / 50

PL/SQL II

PRCTICA

EJERCICIO SOBRE CURSORES DINMICOS

EJERCICIO 17 Desactivar todas las constraints de la base de datos teniendo en cuenta que en primer lugar hay que desactivar las Primary y Unique y en segundo lugar las Foreign y Check constraints. NOTA: La notacin del campo CONSTRAINT_TYPE es la siguiente:
P U R C Primary Key Unique Key Foreign Key Check constraint

Crear el procedimiento contrario siguiendo el orden inverso.

EJERCICIO 18 Crear un procedimiento que nos obtenga dinmicamente el nombre del departamento y la localizacin del nmero del departamento que le pasemos.

EJERCICIO 19 Codificar un procedimiento que cree una tabla copia de la de empleado y a travs de un parmetro en que le pasamos el nombre del empleado, copiar los datos del empleado requerido en la nueva tabla.

VERSIN 1

JPV-99

45 / 50

PL/SQL II

5. EJERCICIO DE DESARROLLO

1.-Crear una tabla TMP+Nombre_usuario que sea una copia de la de Empleado 1.11.2Aadirle los campos Usuario y Fecha modificacin. Crear un disparador que audite el usuario y la fecha en que se inserta o se modifica dicha tabla. 2.- Mediante un cursor Modificar dicha tabla y subir el sueldo a los empleados que pertenezcan al departamento SALES 3.- Crear una funcin que devuelva la media de sueldo de los empleados que tengan el mismo puesto (JOB) pasndole como parmetro en formato texto dicho cargo. 4.- Crear un disparador tal que cuando modifiquemos el sueldo del presidente, se encargue de recalcular el resto de los sueldos de todos los empleados en el mismo porcentaje. 5.- Crear un procedimiento que actualice la fecha HIREDATE al primer da del siguiente mes del da de la semana que coincida con la fecha anterior. 6.- Crear un procedimiento dinmico que borre todos los objetos de la base de datos del tipo que nosotros le pasemos como parmetro del usuario que est conectado. Si no se le pasa ningn parmetro, debe borrar todos. (Excepto el propio procedimiento creado).

VERSIN 1

JPV-99

46 / 50

PL/SQL II

6. RESUMEN

Un procedimiento es un conjunto de instrucciones PL/SQL que puede ser llamado usando el nombre que se le haya asignado. Una funcin es un conjunto de instrucciones en PL/SQL, que pueden ser llamados usando el nombre con que se le haya creado. Se diferencian de los procedimientos, en que las funciones retornan un valor al ambiente desde donde fueron llamadas. Un procedimiento se invoca con la sentencia EXEC[UTE] desde SQL*. Desde un bloque PL/SQL simplemente es necesario nombrarlo para ejecutarlo. Una funcin se invoca con la sentencia EXECUTE, como ocurre en los procedimientos, pero hay que tener en cuenta que tiene que asignarse a alguna variable del mismo tipo que se devuelve. Los subprogramas se incluyen en el DECLARE del bloque y es necesario incluir el subprograma entero. Para la depuracin de procedimientos y funciones se utiliza el procedimiento suministrado por Oracle: DBMS_OUTPUT Un paquete es un grupo de identificadores y rutinas agrupadas dentro de la misma construccin.

VERSIN 1

JPV-99

47 / 50

PL/SQL II

Un disparador es un bloque PL/SQL asociado a una tabla que se ejecuta cuando una determinada instruccin SQL se va a ejecutar sobre dicha tabla. Una tabla mutante es una tabla que est modificndose actualmente por una orden DML (INSERT, UPDATE, DELETE). Para un disparador, sta es la tabla sobre la que est definido. El PL/SQL dinmico nace de la necesidad de implementar rdenes DDL dentro de un bloque de PL/SQL. Se implementa en el paquete DBMS_SQL Existen varios mtodos distintos de implementar SQL Dinmico: Ejecucin de rdenes DML Ejecucin de rdenes DDL que no sean consultas Ejecucin de consultas

VERSIN 1

JPV-99

48 / 50

PL/SQL II

7. EVALUACIN

1. Para ejecutar un procedimiento desde SQLPLUS utilizaremos la sentencia: a) START procedimiento b) EXEC procedimiento c) RUN procedimiento

2. Cual de estas sentencias es incorrecta? a) Las funciones no pueden llevar argumentos, slo devuelven valores b) Los procedimientos pueden llevar parmetros IN y OUT c) Las funciones PL/SQl que estn dentro de sentencias SQL no pueden modificar datos en las tablas.

3. Cual de estas sentencias es incorrecta? a) La sobrecarga de los packages surge a partir del dcimo procedimiento b) Los packages disponen de la opcin de sobrecarga de

procedimientos y funciones c) Para que no haya sobrcarga en un package debemos indicar en la cabecera el nivel de depuracin

VERSIN 1

JPV-99

49 / 50

PL/SQL II

4. Un disparador .. a) Permite argumentos b) No permite sentencias transaccionales (Commit, rollback) c) Permite ejecutarse desde un procedimiento mediante la orden EXEC TRIGGER nombre_de_trigger

5. Una tabla mutante es: a) Una tabla que se altera cuando dos usuarios modifican los datos de una tabla a la vez. b) Una tabla que se est modificndose actualmente por una orden DML debido a un trigger FOR_EACH_ROW c) Un tabla que se modifica porque un usuario ejecuta un procedimiento a la vez que otro ejecuta una sentencia DML

6. Qu tipo de error puede dar lugar en un cursor? a) NO_DATA_FOUND b) TOO_MANY_ROWS c) VALUE_ERROR

VERSIN 1

JPV-99

50 / 50

ANEXOS A CURSO PL/SQL

ANEXOS A CURSO PL/SQL


Javier Prez-Vigo (Octubre 1999)

VERSIN 1

JPV- 99

1 / 49

ANEXOS A CURSO PL/SQL

ANEXO 1: SQL*PLUS

La herramienta que nos proporciona ORACLE para interactuar con la base de datos se llama SQL*Plus. Bsicamente, es un intrprete SQL con algunas opciones de edicin y formateo de resultados. Conceptos previos antes de conectarse a SQL*Plus:

Usuario/Clave Para poder acceder a una base de datos gestionada por ORACLE debemos ser un usuario autorizado de la misma y conocer la palabra clave, password, asociada al usuario.

Variable de ambiente ORACLE_SID Indica la base de datos con la que vamos a trabajar.

1 CONEXIN
Para entar en SQL*Plus se debe ejecutar el comando

$ sqlplus usuario/passwd
donde le indicamos al SGBD Oracle quin somos y nuestra palabra clave. Si la configuracin del SGBD Oracle se corresponde a una configuracin cliente-servidor asentada sobre una red (SQL*Net v2) deberemos indicar, adems, el sevicio (o base de datos) con el que queremos contactar. Esto se hace colocando el smbolo @ antes del nombre del servicio como se indica a continuacin:

$ sqlplus usuario/passwd@servicio
Otra circunstancia que hay que tener en cuenta a la hora de conectarnos a SQL*Plus es el modo establecido por el DBA para la autentificacin del usuario de la base de datos. La primera posibilidad es que recaiga sobre el SGBD Oracle la autentificacin de los usuarios, por lo que tendremos que darle nuestro nombre de usuario y la palabra de paso. Pero existe la posibilidad de que el SGBD Oracle deje en manos del Sistema Operativo esta responsabilidad. As, no ser necesario demostrarle al SGBD Oracle quin somos ya que el SO se ha encargado previamente de comprobar que todo es correcto. En este segundo caso, el comando de conexin con SQL*Plus debe omitir el nombre de usuario y la palabra clave, pero manteniendo el resto de esta manera:

$ sqlplus /@servicio
VERSIN 1 JPV- 99 2 / 49

ANEXOS A CURSO PL/SQL

Una vez que hemos conseguido entrar en SQL*Plus nos presenta el prompt y espera la inserccin de sentencias SQL. Todas las sentencias deben acabar con un ';'. Una sentencia puede continuar en varias lneas, que SQL*Plus va numerando. Si queremos anular la sentencia actual podemos hacerlo colocando un '.' como nico carcter en una lnea. Si queremos volver a ejecutar la ltima sentencia se puede hacer con el comando '/'. Si queremos ejecutar las sentencias que almacena un fichero .sql podemos hacerlo anteponiendo el smbolo '@' al nombre del fichero. Para cerrar la sesin vale con teclear 'exit'.

2 POSIBILIDADES DE EDICIN
SQL*Plus almacena en un buffer la ltima sentencia SQL introducida. El buffer mantiene slo una sentencia cada vez, y si se introduce una nueva sentencia se sobreescribe sobre la anterior. La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los comandos:
RUN que visualiza la sentencia en el buffer antes de ejecutarla; / que ejecuta la sentencia sin visualizarla.

SQL*Plus tambin nos permite editar la sentencia SQL alamacenada en el buffer mediante un sencillo (y limitado) editor en lnea, cuyos comandos se enumeran a continuacin:

Comando APPEND texto

Abreviatura A texto

Descripcin Aade texto al final de la lnea.

CHANGE/fuente/destino C/fuente/destino Cambia el contenido 'fuente' por el 'destino' CHANGE/texto CLEAR BUFFER DEL INPUT INPUT texto LIST LIST n LIST * LIST LAST LIST m n C/texto CL BUFF DEL I I texto L Lnn L* L LAST Lmn Quita 'texto' de una lnea. Borra el buffer Borra una lnea. Inserta una o ms lneas. Inserta una lnea con 'texto'. Lista las lneas del buffer Lista la lnea n-sima. Lista la lnea actual. Lista la ltima lnea. Lista las lneas desde la m-sima a la n-sima.

Al contenido del buffer tambin se puede acceder desde el editor del Sistema Operativo. As, el buffer podr ser manipulado con las posibilidades del editor con el que estemos
VERSIN 1 JPV- 99 3 / 49

ANEXOS A CURSO PL/SQL

acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable DEFINE_EDITOR y luego llamar al editor. SQL> define_editor=vi SQL> edit

3 UTILIZACIN DE FICHEROS
SQL*Plus considera dos tipos de ficheros: de spool y de comandos. Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la extensin .lst (o lo manda a la impresora). Los comandos asociados con los ficheros spool son
SPOOL fichero

Manda el resultado de las consultas al fichero.


SPOOL OUT

Manda el resultado de las consultas a la impresora.


SPOOL OFF

Cierra el fichero de spool.


EXIT

Al salir de SQL*Plus se cierran los ficheros de spool.


Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado, almacenado y/o ejecutado; y tienen por defecto la extensin .sql : Para editarlo se puede utilizar el comando edit fichero. Para ejecutarlo se utilizar el comando START fichero o @fichero

4 ALMACENAMIENTO COMANDOS

Y RECUPERACIN

DE

FICHEROS

DE

Un fichero de comandos es una secuencia de rdenes SQL y SQL*Plus almacenados en un fichero del sistema operativo. Comando SAVE: Almacena en un fichero en disco el contenido del bffer activo. SAVE nombre_fichero [APPEND|CREATE|REPLACE] Comando GET: Para recuperar un fichero de comandos. GET nombre_fichero [LIST|NOLIST]

VERSIN 1

JPV- 99

4 / 49

ANEXOS A CURSO PL/SQL

START: Ejecuta el fichero del sistema operativo que se indique, admite hasta nueve parmetros posicionales indicados en la lnea de comandos (los parmetros se definen como un nmero entero comprendidos entre 1 y 9). START nombre_fichero [parmetro1, parmetro2, ]

DESCRIBE o DESC: Este comando da una breve descripcin de las caractersticas de cada columna de la tabla indicada. Por cada columna se muestra el nombre, si se admiten o no valores nulos, tipos de datos, ancho de columna. DESCRIBE nombre_tabla

HOST: Pasa al servidor para su ejecucin la orden escrita a continuacin y ejecuta la orden sin que el usuario abandone su sesin de SQL*Plus. HOST orden

SPOOL: Enva los resultados de una orden SQL a un fichero para imprimirlas posteriormente. SPOOL [fichero|OFF|OUT] ON

EDIT: Llama al editor activo del sistema operativo. Variables de sustitucin: Es una variable definida por el usuario. &nombre_variable Cuando SQL*Plus encuentra una variable de sustitucin en un comando lo ejecuta como si contuviese el valor de esa variable, y si no se ha definido su valor, pregunta el valor que se le desea dar. Si se desea qu slo pregunte una vez por su valor en una variable que aparece varias veces se la marcar con &&.

5 FICHEROS DE COMANDOS
En un fichero de comandos se pueden incluir: lneas de comentarios, lneas de ejecucin, lneas de comandos SQL, y lneas de comandos SQL*Plus.

LNEAS DE COMENTARIOS
Se pueden introducir comentarios en una archivo de comandos de tres maneras: Utilizando del comando REM del SQL*Plus. Utilizando los delimitadores de comentario de SQL /* y */. Utilizando los smbolos de comentario PL/SQL "__".

VERSIN 1

JPV- 99

5 / 49

ANEXOS A CURSO PL/SQL

LNEAS DE EJECUCIN
Constan de una nica barra inclinada, "/", y se introducen a continuacin de cada sentencia SQL indicando su ejecucin. Sustituyen al punto y coma, ";" al final de las sentencias SQL.

LNEAS DE COMANDOS SQL


Se puede introducir cualquiera de los comandos SQL enumerados en este curso, y se ejecutarn de manera secuencial. Se permite el anidamiento de los ficheros de comandos.

LNEAS DE COMANDOS SQL*PLUS


SQL*Plus aporta una serie de posibilidades al lenguaje SQL que le acerca un poco mas a lo que entendemos como un lenguaje de programacin. Se pueden definir constantes y variables, capturar datos del teclado, introducir parmetros en la llamada de un archivo de comandos, y alguna cosa ms. Variables de Usuario Se pueden definir Variables de usuario con el comando DEFINE

DEFINE Variable = valor


Para borrar una variable se utiliza el comando UNDEFINE

UNDEFINE variable
Como ejemplo se puede definir la variable OFICIO SQL> define oficio=analista Variables de Sustitucin Las variables de sustitucin son un nombre de variable de usuario con el smbolo & delante. Cuando SQL*Plus detecta una variable de sustitucin en un comando, ejecuta el comando tomando el valor de la variable. Esto se puede ver en el ejemplo, donde preguntamos por los empleados que son analistas: SQL> define oficio=Analista SQL> define tabla=emp SQL> select nombre, oficio from &tabla where oficio='&oficio'; old 1: select nombre, oficio from &tabla where oficio='&oficio'

VERSIN 1

JPV- 99

6 / 49

ANEXOS A CURSO PL/SQL

new 1: select nombre, oficio from emp where oficio='Analista' NOMBRE Sastre Recio OFICIO

---------- ----------Analista Analista

Captura de Datos desde el Terminal En muchas ocasiones es necesario recoger datos desde un terminal, que luego sern utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las variables de sustitucin o los parmetros en la lnea de comandos. Cuando SQL*Plus reconoce una variable de sustitucin sin valor asignado se lo pide al usuario: SQL> select * from dep where nombre='&nombredep'; Enter value for nombredep: I+D old 1: select * from dep where nombre='&nombredep' new 1: select * from dep where nombre='I+D' COD_DEP NOMBRE ---------- --------------- ---------200 I+D Boecillo LOC

Si se desea que SQL*Plus pregunte por el valor de la variable al usuario slo la primera vez que se encuentra con ella, se colocar "&&" delante de la variable de usuario. Tambin se pueden utilizar hasta nueve parmetros en la lnea de comandos cuando se llama a la ejecucin de un archivo de comandos. En el archivo de comandos nos referiremos a los parmetros con las variables &1, &2, ... ,&9 que se corresponden posicionalmente con ellos. Desde el archivo de comandos se puede hacer referencia a los parmetros cualquier nmero de veces y en cualquier orden. Comandos de Comunicacin con el Usuario Los siguientes comandos proporcionan un medio de comunicacin con el usuario: PROMPT: presenta un mensaje en la pantalla. ACCEPT: Solicita un valor y lo almacena en la variable de usuario que se especifque. PAUSE: Obliga al usuario a pulsar Return despu de leer un mensaje.

Para ver cmo funcionan sirve el siguiente ejemplo:

VERSIN 1

JPV- 99

7 / 49

ANEXOS A CURSO PL/SQL

prompt Buscar los datos de un empleado. pause Pulse Return. accept nombremp prompt 'Empleado? ' select * from emp where nombre='&nombremp'; Otros Comandos Los siguientes comandos tambin se pueden incluir en un archivo de comandos: CONNECT: para conectarse como otro usuario. HELP: para obtener ayuda en lnea. EXIT: para dejar SQL*PLus y salir al Sistema Operativo. DESCRIBE DESC: para obtener informacin sobre la estructura de una tabla. HOST o !: para ejecutar un comando del Sistema Operativo.

6 GENERACIN DE INFORMES
Con SQL*Plus podemos dar forma a los resultados de las consultas para producir un informe. Podremos: Cambiar las cabeceras de las columnas. Dar forma a las columnas de tipo number, varchar2, date y long. Copiar y listar atributos de presentacin de las columnas. Suprimir valores duplicados e introducir espacios para mejorar la presentacin. Realizar y mostrar clculos (totales, medias, mnimos, mximos, etc.). Definir las dimensiones de las pginas. Ubicar ttulos en la cabecera y pie de las pginas. Introducir la fecha o el nmero de pgina en los ttulos.

Bsicamente, el formato con el que se van a presentar los resultados de las cosultas dependen de unos parmetros y de unos comandos.

PARMETROS
SET LINESIZE: pone el nmero mximo de caracteres por lnea. Por defecto vale 80 y el mximo es 999. SET PAGESIZE: pone el nmero de filas de la salida antes de empezar una nueva pgina. Por defecto es 25. Incluye el ttulo y las lneas de pausa. SET HEADING [ON | OFF]: Activa/desactiva la utilizacin de encabezados de columnas. Por defecto est activado.

VERSIN 1

JPV- 99

8 / 49

ANEXOS A CURSO PL/SQL

SET NULL texto: Indica la cadena de caracteres que hay que colocar en sustitucin de los valores NULL. Por defecto es "". SET ECHO [ON | OFF]: Activa/desactiva la visualizacin de los comandos que SQL*Plus ejecuta segn van siendo tratados. Por defecto est desactivada. SET FEEDBACK [ n | ON | OFF]: Muestra el nmero de registros recuperados en cada consulta cuando se recuperan n o ms registros. ON se pueden considerar como n=1, y OFF como n=0. SET VERIFY [ON | OFF]: Controla la salida de confirmacin para los valores de las variables de sustitucin. Por defecto est activado.

COMANDOS
TTITLE: formacin del encabezado de pgina. BTITLE: formacin del pie de pgina. COLUMN: formatear cada columna. BREAK: puntos de ruptura en los listados. COMPUTE: realizar clculos con las columnas.

VERSIN 1

JPV- 99

9 / 49

ANEXOS A CURSO PL/SQL

ANEXO 2: SQL DE ORACLE


1. DQL. DATA QUERY LANGUAGE.

SINTAXIS GENER AL DE SENTENCIA SELECT.


La sentencia SELECT recupera datos de una base de datos y los devuelve en forma de resultados de la consulta. Conviene diferenciar de forma clara la clusula y la sentencia SELECT. Mientras que la clusula solamente especfica los columnas que se quieren listar la sentencia engloba a toda la sintaxis que tiene como objetivo recuperar ciertos datos. SELECT lista de tems separados por comas FROM lista de tablas separadas por comas (o/y): WHERE condiciones GROUP BY criterio de agrupamiento [ DESC | ASC] ORDER BY criterio de ordenacin HAVING criterio de seleccin por grupos La clusula SELECT especfica los tems que se desea recuperar, que puede ser. Nombre de columna. Una constante. Expresiones que calcula SQL.

El especificador * como sustituto de la lista de tems separados por comas indica todas las columnas. ORACLE no permite combinaciones con * y expresiones pero en otros productos esto es posible. La clusula FROM indica la tabla o las tablas de las que se toman los datos solicitados. A dichas tablas se las llama tablas fuentes de las consultas. La clusula WHERE dice a SQL que incluya solo ciertas filas de datos en los resultados de la consulta. La clusula GROUP BY especfica la consulta sumaria. En vez de producir una fila de resultados por cada fila de datos de la base de datos, una consulta sumaria agrupa todas las filas similares y luego produce una fila sumaria de resultados para cada grupo. La clusula ORDER BY ordena los resultados de la consulta en base a los datos de uno o ms tems. Si se omite, los resultados de la consulta no aparecen ordenados.

VERSIN 1

JPV- 99

10 / 49

ANEXOS A CURSO PL/SQL

La clusula HAVING dice a SQL que incluya slo ciertos grupos producidos por la clusula GROUP BY en los resultados de las consultas. La estructura tabular hace que los datos sean tablas al igual que las consultas. Se entiende por columna calculada la que se genera a partir de otras columnas o constantes por medio de expresiones de SQL. Precediendo a la lista de tems en la clusula SELECT puede aparecer el especificador DISTINCT que indica la eliminacin de las filas duplicadas. SQL> SELECT DISTINCT job FROM emp;

LISTA DE CAMPOS A RECUPERAR (SELECT)


La clusula SELECT va seguida de una lista de campos a recuperar. Estos campos pueden pertenecer a una/varias tablas y/o vistas. Las posibilidades de declaracin de estos campos se recogen en el siguiente esquema: <columna> ["<alias_columna>'] <tabla>.<columna>["<alias~columna>"] <alias_tabla>.<columna>["<alias_columna>"] <usuario>.<tabla>.<columna>["<alias-columna>"] donde: <columna> Nombre de la columna de la que queremos obtener valores. <tabla> Nombre de la tabla a la que pertenece la columna. <alias_tabla> Alias dado a la tabla. <usuario> Nombre del usuario de Base de Datos al que pertenece la tabla. <alias columna> Alias de la columna. SQL> SELECT d.deptno , d.dname Departamento, d.loc 2 FROM dept d; Adems de una lista de campos simple, la lista de campos SELECT se puede "ampliar' introduciendo funciones u "operadores". Pasamos a exponer la lista de funciones permitidas as como los operadores. En general, las funciones permitidas son funciones columna y el operador al que nos referimos es DISTINCT.
FUNCIONES COLUMNA

Una funcin columna toma a una columna como argumento y produce un nico dato que sumariza la columna. SQL ofrece seis funciones de columna diferentes: SUM() calcula el total de una columna.
JPV- 99 11 / 49

VERSIN 1

ANEXOS A CURSO PL/SQL

AVG() calcula el valor promedio de una columna. MIN() encuentra el valor ms pequeo de una columna. MAX() encuentra el valor mavor de una columna. COUNT() cuenta el numero de valores de una columna COUNT(*) cuenta el nmero de filas de una columna.

CLAUSULA FROM
La clusula FROM permite especificar de dnde vamos a obtener los diferentes resultados. En la lista FROM podremos incluir nombres de tablas, sinnimos de las mismas o nombres de vistas En general, la lista que prosigue a FROM es <tabla>[<alias_tabla>] donde: <tabla> Nombre de la tabla, sinnimo o view <alias tabla> Alias dado a la tabla; sinnimo o vista por el cual podemos referirnos a la misma en la sentencia SQL SQL> SELECT prodid, descrip 2 FROM product;

SELECCIN DE FIL A (WHERE)


La clusula WHERE consiste en la palabra clave WHERE seguida de una condicin de bsqueda. Si la condicin es cierta la fila se incluye, si es falsa se excluye y si es NULL se excluye.

CONDICIONES DE BSQUEDA SIMPLE


TEST DE COMPARACIN

Compara el valor de una expresin con otra; para lo cual utiliza los siguientes smbolos de comparacin: =, <, >, <=, >= y <> (tambin != y =) Si la comparacin es cierta, el test produce como resultado TRUE y por tanto la fila ser incluida. Si por el contrario es falsa producir un FALSE y ser excluida al igual que si alguno de los trminos de la comparacin es NULL. WHERE expresin smbolo expresin

VERSIN 1

JPV- 99

12 / 49

ANEXOS A CURSO PL/SQL

SQL> SELECT prodid, descrip 2 FROM product 3 WHERE prodid = 101860; Si alguna de las columnas ha sido definida a la hora de crear la tabla como clave primaria esto implica que no puede haber valores duplicados en dicha columna con lo cual esta servir para diferenciar unvocamente cada fila.
TEST DE RANGOS (BETWEEN)

El test de rangos comprueba si un valor de dato se encuentra entre las dos expresiones especificadas. Between incluye los puntos extremos del rango. WHERE expresion BETWEEN extremo1 AND extremo2 SQL> SELECT ename, job 2 FROM emp 3 WHERE sal BETWEEN 100000 AND 200000;

PERTENENCIA A UN CONJUNTO

Examina si la expresin coincide con algn dato de la lista de valores. Si la expresin es NULL devuelve NULL. WHERE expresin IN (lista de valores) WHERE expresin NOT IN (lista de valores) SQL> SELECT * 2 FROM emp 3 WHERE job IN ( 'ANALYST', 'MANAGER');

TEST DE CORRESPONDENCIA CON UN PATRN.

Compara la expresin con otra obtenida partir de comodines, el patrn. Se utiliza el % como carcter comodn para indicar el patrn cualquier cadena de caracteres y el carcter _ como patrn cualquier carcter simple . Devuelve NULL si la expresin es NULL. WHERE expresin LIKE patrn SQL> SELECT ename, sal
VERSIN 1 JPV- 99 13 / 49

ANEXOS A CURSO PL/SQL

2 FROM emp 3 WHERE ename LIKE 'J%'; SQL> SELECT ename 2 FROM emp 3 WHERE ename LIKE '_A%'; Dado que los caracteres _ y % tienen significados especiales, para hacer referencia a ellos literalmente se puede definir para cada LIKE un carcter de escape aadiendo al final la clusula ESCAPE 'char'. Cuando en la expresin aparece el carcter char el carcter que le precede se considera de forma literal.

SQL> SELECT table_name 2 FROM user_tables 3 WHERE table_name LIKE '_\_%' ESCAPE \;

TEST DE VALOR NULO

Chequea si la expresin en NULL o si no lo es. WHERE expresin IS NULL WHERE expresin IS NOT NULL SQL> SELECT ename 2 FROM emp WHERE mgr IS NULL;

CONDICIONES DE BSQUEDA COMPUESTAS.


Las condiciones de bsqueda simples se pueden combinar con OR, AND y NOT originando lo que se llaman condiciones de bsqueda compuestas. SQL> SELECT * 2 FROM cities 3 WHERE population<200000 4 AND state = CA;

SQL> SELECT * 2 FROM cities

VERSIN 1

JPV- 99

14 / 49

ANEXOS A CURSO PL/SQL

3 WHERE population BETWEEN 500000 AND 1000000 4 OR state = TX;

ORDENACIN DE RESULTADOS DE UNA CONSULTA (ORDER BY)

ORDER BY lista de items [DESC|ASC] Por defecto ordena las filas seleccionadas en orden ascendente considerando el orden lxico - grfico que genera la lista de tems. Con DESC este orden se hace descendente y con ASC ascendente. SQL> SELECT city, state, population 2 FROM cities 3 ORDER BY city DESC, population ASC; Cuando se quiere ordenar utilizando alguna columna no propia de la tabla sino que se ha generado a travs de una expresin en la clusula SELECT esta se puede indicar a travs de la posicin que ocupa en la lista de Items de la clusula SELECT. SQL> SELECT prodid producto, 2 (stdprice-minprice) diferencia de precios 3 FROM price 4 ORDER BY 2 DESC;

MANIPULACIN DE DATOS DE CONJUNTOS (GROUP BY, HAVING)


Una consulta que incluya la clusula GROUP BY se denomina consulta agrupada, ya que agrupa los datos de las tablas fuente y produce una nica fila sumaria por cada grupo de filas. Los tems indicados en la clusula GROUP BY se denominan tems o columnas de agrupacin de la consulta, ya que ellas son las que determinan como se dividen las filas en grupos. Los grupos se forman con todas aquellas filas que tienen los mismos valores en las columnas de agrupacin. SQL> SELECT state, sum(population) 2 FROM cities 3 GROUP BY state; La agrupacin se puede hacer por medio de mltiples tems.
VERSIN 1 JPV- 99 15 / 49

ANEXOS A CURSO PL/SQL

SQL> SELECT symbol, company, MAX(number_traded_today) 2 FROM stocks 3 GROUP BY symbol, company; Cuando el agrupamiento se efecta a travs de varios items los grupos se establecen a travs de las filas que contengan los mismos datos para cada tem que figura en la clusula GROUP BY. Hay que destacar que a NULL para los efectos de agrupamiento se le considera otro valor ms que constituira otro grupo como sucede en el primer ejemplo aunque este aspecto depende del producto SQL en cuestin. En el SELECT de una columna agrupada pueden aparecer: Constantes. Funciones de columna. Cualquier columna que tenga el mismo dato para todas las filas que integran un grupo. Una expresin que afecte a combinaciones de las anteriores.

La clusula HAVING sirve para rechazar o seleccionar grupos de filas. Su formato es anlogo al de la clusula WHERE consistiendo en la palabra clave HAVING seguida de una condicin de bsqueda. SQL> SELECT sname, AVG(revenue) 2 FROM sales_revenue 3 GROUP BY sname 4 HAVING SUM(revenue) between 40000 and 50000; La condicin de bsqueda dentro de una clusula HAVING puede ser: Una constante. Una funcin columna, que produzca un nico valor que sumarice las filas del grupo. Una columna de agrupacin, que por definicin tiene el mismo valor para todas las filas del grupo. Una expresin combinacin de las anteriores.

HAVING produce uno de estos tres resultados: TRUE si la condicin de bsqueda es cierta por lo cual se retiene el grupo de filas. FALSE si la condicin de bsqueda es falsa por lo cual se excluye el grupo de filas. NULL si la condicin de bsqueda en NULL por lo cual el grupo de filas se excluye.

VERSIN 1

JPV- 99

16 / 49

ANEXOS A CURSO PL/SQL

Si en una sentencia SELECT se tiene una clusula HAVING sin una clusula GROUP BY se considera que todas las filas forman un nico grupo rechazando o aceptndole en su totalidad.

RECUPERACIN JERRQUICA (CONNECT BY ... START WITH ...)


Esta es una caracterstica especfica del SQL proporcionado por ORACLE. Permite la recuperacin jerrquica de filas siguiendo una estructura tipo rbol. Las clusulas asociadas a este tipo de recuperacin de datos son CONNECT BY...START WITH... y van siempre a continuacin de la clusula WHERE. SELECT * | expresion [tabla.]columna,... FROM [usuario.]tabla,... WHERE predicado CONNECT BY condicin [START WITH predicado] ORDER BY expresin [ASC|DESC],...; El objetivo de cada una de las clusulas componentes se puede indicar diciendo: WHERE: Es la clusula que permite filtrar las filas CONNECT BY: Criterio que define la estructura del rbol START WITH: Identifica la raiz del rbol

SQL> SELECT level, ename 2 FROM emp 3 CONNECT BY PRIOR emp_no = mgr 4 START WITH job = PRESIDENT;

EXPRESIONES SENTENCIAS SELECT (UNION, INTERSECT, MINUS)


Entendemos expresiones con sentencias SELECT la "reunin" de un conjunto de sentencias SELECT unidas por medio de ciertos operadores. Los operadores disponibles para realizar esta tarea son tres: UNION, INTERSECT, MINUS. <seleccin_sin_ORDER_BY> UNION|INTERSECT|MINUS <seleccion sin ORDER_BY> ORDER BY <predicado>.

VERSIN 1

JPV- 99

17 / 49

ANEXOS A CURSO PL/SQL

Existen unas consideraciones a tener en cuenta antes de utilizar estas sentencias: Rendimiento muy bajo. No utiliza ndices. Se evala de izquierda a derecha. No existe jerarqua en el uso de estos operadores; se puede forzar con parntesis.

UNION
Se pueden reunir varias sentencias select con el fin de seleccionar las filas que cada una de las sentencias considera. Esto se hace gracias al comando UNION. sentencia SELECT 1 UNION sentencia SELECT 2 UNION ... sentencia SELECT n Sin embargo, hay restricciones que limitan este uso: Mismo nmero de tems en cada SELECT. Mismo tipo de datos. Los SELECT no pueden tener la clusula ORDER BY. El ANSI/ISO establece que los tems solo pueden ser columnas pero los productos SQL suelen relajar esta restriccin.

Las columnas de resultados no tienen ttulos e incluso algunos productos SQL no soportan UNION. Por omisin, UNION no selecciona las filas duplicadas para evitarlo hay que utilizar UNION ALL. El orden de las uniones es indiferente siempre que todas se hagan de la forma UNION o UNION ALL pero si se mezclan pueden dar resultados distintos.

INTERSECT

sentencia SELECT 1 INTERSECT sentencia SELECT 2 INTERSECT


VERSIN 1 JPV- 99 18 / 49

ANEXOS A CURSO PL/SQL

... sentencia SELECT n El mtodo de acceso a los registros que ha de encontrar es el siguiente: examina los registros de los conjuntos de entrada (cada uno de los conjuntos de datos obtenidos con cada sentencia SELECT) y devuelve aquellas que aparezcan en ambas. Adems, todas las filas duplicadas sern eliminadas antes de la generacin del conjunto resultante. SQL> SELECT deptno FROM dept 2 INTERSECT 3 SELECT deptno FROM emp;

MINUS

sentencia SELECT 1 MINUS sentencia SELECT 2 MINUS ... sentencia SELECT n Este tipo de combinacin de sentencias SELECT devuelve aquellas filas que estn en el primer conjunto (datos obtenidos y va la primera sentencia SELECT) pero no en el segundo. Las filas duplicadas del primer conjunto se reducirn a una fila nica antes de que empiece la comparacin con el otro conjunto. SQL> SELECT deptno FROM dept 2 MINUS 3 SELECT deptno FROM emp;

CONSULTAS MULTITABLA (COMPOSICIONES-COMBINACIONES)


Se llama componer tablas (join) al proceso de formar parejas de filas que se caracterizan por tener comn el contenido de las columnas relacionadas. La tabla resultante se llama composicin. WHERE columnal=columna2

VERSIN 1

JPV- 99

19 / 49

ANEXOS A CURSO PL/SQL

SQL no requiere que las columnas de emparejamiento sean incluidas en los resultados de una consulta multitabla. SQL> SELECT ename, dname 2 FROM emp, dept 3 WHERE emp.deptno = dept.deptno; En este ejemplo where EMP.DEPTNO=DEPT.DEPTNO establece una relacin entre la columna DEPTNO de la tabla EMP y la columna DEPTNO de la tabla DEPT. Con esto para cada ENAME busca su DEPTNO en la misma tabla EMP y le relaciona con el DNAME de la fila de la tabla DEPT cuyo valor de DEPTNO es el mismo. Cuando hay un NULL en la columna de conexin la fila que le contiene se excluye. En este ejemplo la conexin se realiza a travs de una relacin simple pero esta puede ser mltiple utilizando AND con el WHERE. En este caso la conexin se establecera si se verificaran todas las relaciones. Generalmente la columna relacionada en la segunda tabla es una clave primaria con lo cual se evita que haya una conexin de una fila de la primera tabla con varias de la segunda. Hasta ahora hemos tratado relaciones que se basaban en la igualdad de los datos de dos columnas de dos tablas pero esto no tiene por que ser necesariamente as. La relacin la puedo establecer con los siguientes smbolos: =, <, >, <>, <=, >=. SQL> SELECT a.ssn, f.fund_id, a.pct_deferral, f.pct_dist 2 FROM accts a, fund_contrib f 3 WHERE a.ssn = f.ssn 4 AND a.pct_deferral < f.pct_dist; Dado que puede haber nombres de columnas iguales aunque en tablas diferentes es recomendable para evitar ambigedades el uso de columnas cualificadas. Se pueden establecer tambin relaciones entre columnas de una misma tabla de la misma forma que se establecen entre tablas distintas. Para ello SQL utiliza la estrategia de tabla duplicada o sea duplica la tabla original y lo establece como si se tratara de tablas distintas. SQL> SELECT e.ename empleado, e2.ename jefe 2 FROM emp e, emp e2 3 WHERE e.mgr = e2.empno; La palabra que precede al nombre de las tablas en la clusula FROM es el ALIAS de dicha tabla utilizado para diferenciarla de su copia que obviamente tendra si no es por el ALIAS tendra el mismo nombre. Si no se utiliza el ALIAS no es necesario repetir columnas en el FROM.
VERSIN 1 JPV- 99 20 / 49

ANEXOS A CURSO PL/SQL

Cuando la relacin se establece por un valor NULL la fila o filas resultantes se desprecian. A este tipo de emparejamiento se llama externo. Para forzar el emparejamiento de NULL se utiliza el smbolo *=* en la clusula WHERE. Tambin se pueden utilizar los seis smbolos de comparacin en lugar del =. Hay que destacar que esta no es una especificacin ANSI/ISO ya que el estndar no trata este caso. ORACLE utiliza (+) detrs de las columnas que se emparejan. SQL> SELECT e.ename nombre, e2.ename jefe 2 FROM emp e, emp e2 3 WHERE e.mgr = e2.empno(+);

SUBCONSULTAS.
La caracterstica de subconsulta de SQL permite utilizar los resultados de una consulta como parte de otra. Esta caracterstica hace que a SQL se le considere un lenguaje estructurado. Hay consultas en SQL que no se pueden expresar sino es utilizando una subconsulta. Una subconsulta es simplemente una consulta que aparece dentro del WHERE o HAVING de otra sentencia SQL encerrada entre parntesis. Las restricciones que deben verificar las subconsultas son: Una subconsulta debe producir una nica columna de datos como resultado. Por lo cual la clusula SELECT de la subconsulta debe de tener un nico tem. Una subconsulta no debe incluir la clusula ORDER BY. Una subconsulta no puede estar integrarada por UNION.

Una subconsulta forma parte siempre de una condicin de bsqueda en la clusula WHERE o HAVING. SQL ofrece estas condiciones de bsqueda en subconsultas.

TEST DE COMPARACIN DE SUBCONSULTA.


Es una forrna modificada de test de comparacin simple. Compara el valor de una expresin con el valor producido por una subconsulta, y devuelve un resultado TRUE si la comparacin es cierta. La subconsulta debe de producir un valor nico en caso contraro SQL informa del error. Si la subconsulta no devuelve ningn valor o produce un NULL, el test de comparacin devuelve NULL. SQL> SELECT ename 2 FROM emp 3 WHERE sal >= (SELECT min(sal) 4 FROM emp

VERSIN 1

JPV- 99

21 / 49

ANEXOS A CURSO PL/SQL

5 WHERE deptno = 30); El test de comparacin subconsulta ofrece los mismos seis operadores de comparacin (=, <, >, <=, >=, <>).

TEST DE PERTENENCIA A UN CONJUNTO.


Compara un nico valor de datos con una columna de valores producida por una subconsulta y devuelve un resultado TRUE si el valor coincide con uno de los valores de la columna. Utiliza el operador IN. SQL> SELECT ename 2 FROM emp 3 WHERE deptno IN (SELECT deptno 4 FROM dept 5 WHERE loc=MADRID);

TEST DE EXISTENCIA.
El test de existencia (EXISTS o NOT EXISTS) comprueba si una subconsulta produce alguna fila de resultados o no. SQL> SELECT dname 2 FROM dept 3 WHERE EXISTS ( SELECT deptno 4 FROM emp);

TESTS CUALIFICADOS
EL TEST ANY

Se utiliza conjuntamente con los seis operadores de comparacin para comparar un nico valor de test con una columna de valores producidos por una subconsulta. Para efectuar la comparacin se utiliza el operador de comparacin especificado. Si alguna de las comparaciones individuales produce un resultado TRUE, el test ANY devuelve un resultado TRUE. SQL> SELECT *

VERSIN 1

JPV- 99

22 / 49

ANEXOS A CURSO PL/SQL

2 FROM cities 3 WHERE population < ANY ( SELECT population 4 FROM cities 5 WHERE state = CA); S la subconsulta produce una columna vaca de resultados el test ANY devuelve FALSE. Si el test de comparacin no es TRUE para ningn valor de datos en la columna pero es NULL para uno o ms de los valores, entonces la condicin de bsqueda ANY devuelve NULL.
EL TEST ALL

La sintaxis es igual que el test ANY aunque la palabra clave utilizada es ALL. Si todas las comparaciones individuales dan como resultado TRUE el test da como resultado TRUE. SQL> SELECT * 2 FROM cities 3 WHERE population < ALL ( SELECT population 4 FROM cities 5 WHERE state = TX); Si la subconsulta produce una columna vaca de resultados el test ALL devueIve TRUE. Si el test de comparacin no es FALSE para ningn valor de datos en la columna, pero es NULL para uno o ms de ellos, entonces la condicin de bsqueda ALL devuelve NULL.

ANIDAMIENTO DE SUBCONSULTAS
Se pueden anidar subconsultas dentro de subconsultas sin ningn tipo de restriccin salvo en numero de niveles de anidamiento de lmite el fabricante del producto SQL, el inconveniente de su utilizacin radica en el excesivo tiempo necesario para realizarlas. SQL> SELECT * 2 FROM customer 3 WHERE city NOT IN (SELECT city 4 FROM cities 5 WHERE population < ANY ( SELECT c.population 6 FROM cities c, usa u 7 WHERE c.state = u.state 8 AND u.data > 10000000));

VERSIN 1

JPV- 99

23 / 49

ANEXOS A CURSO PL/SQL

SUBCONSULTAS CORRELACIONADAS
Conceptualmente, SQL efecta una subconsulta una y otra vez, una por cada fila de la consulta principal. Algunos productos detectan esta circunstancia optimizando as el tiempo de este tipo de consultas.

RESUMEN FINAL DE LA ORDEN SELECT


1. Si la sentencia es una UNION de sentencias select, aplicar los pasos 2 hasta 7 a cada una de las sentencias, para generar sus resultados de consulta individuales. 2. Forma el producto de las tablas indicadas en la clusula FROM. Si la clusula FROM designa una nica tabla, el producto es esa tabla. 3. Si hay una clusula WHERE, aplicar su condicin de bsqueda a cada fila de la tabla producto, reteniendo aquellas filas para las cuales la condicin de bsqueda es TRUE (y descartando aquellas para las cuales es FALSE o NULL). Si la clusula WHERE contiene una subconsulta, la subcosulta se efecta por cada fila conforme es examinada. 4. Si hay una clusula GROUP BY, disponer las filas restantes de la tabla producto en grupos de filas, de modo que las filas de cada grupo tengan valores identicos en todas las columnas de agrupacin. 5. Si hay una clusula HAVING, aplicar su condicin de bsqueda a cada grupo de filas, reteniendo aquellos grupos para los cuales la condicin de bsqueda es TRUE (y descartando aquellas para las cuales es FALSE o NULL). Si la clusula HAVING contiene una subconsulta, la subconsulta se efecta para cada grupo de filas conforme es examinada. 6. Para cada fila (o grupo de filas) restante, calcula el valor de cada elemento en la lista de seleccin para producir una nica fila de resultados. Para una referencia de columna simple, utilizar el valor de la columna en la fila (o grupo de filas) actual. Para una funcin de columna, utilizar como argumento el grupo de filas actual si se especifico GROUP BY; en caso contrario, utilizar el conjunto entero de filas. 7. Si hubiera SELECT DISTINCT, eliminar las filas duplicadas de los resultados que se hubieran producido. 8. Si la sentencia es una UNION de sentencias SELECT, mezclar los resultados de consulta para las sentencias individuales en una nica tabla de resultados. Eliminar las filas duplicadas a menos que se haya especificado UNION ALL. 9. Si hay una clusula ORDER BY, ordenar los resultados de la consulta segn se haya especificado. Las filas generadas por este procedimiento forman los resultados de la consulta.

VERSIN 1

JPV- 99

24 / 49

ANEXOS A CURSO PL/SQL

2. DML: DATA MANIPULATION LANGUAGE.


Las sentencias de SQL que modifican los contenidos de una base de datos son sencillas, sin embargo presentan algunas complejidades al sistema de gestin de bases de datos como son: Proteger la integridad de los datos almacenados, durante los cambios, asegurndose que slo se introduzcan datos vlidos y que la base de datos permanezca autoconsistente, incluso en caso de fallos del sistema. Coordinar las actualizaciones simultaneas por parte de multiples usuarios, asegurndose que los usuarios y sus modificaciones no interfieran unos con otros.

ADICCIN DE DATOS A LA BASE DE DATOS (INSERT)

SENTENCIA INSERT DE UNA FILA

INSERT INTO nombre-de-tabla (nombre-de-columna, ...) VALUES (constante-o-NULL, ...) Donde nombre-de-tabla especifica la tabla que recibe la nueva fila, a continuacin (entre parntesis) se especifica una lista de nombres de colurnna de esa tabla, y despus tras la palabra VALUES los valores que se dan a cada una de esas columnas, en el mismo orden que la lista de nombres de columnas. INSERT INTO libro (titulo, autor, signatura) VALUES ('APLIQUE SQL', 'JAMES R.GROFF', 10234); Por supuesto los valores de los datos tras la clusula VALUES deben ser vlidos segn el tipo de datos de la columna que les corresponde. Como podemos apreciar no es necesario asignar valores a todas las columnas de la nueva fila, cuando SQL inserta una nueva fila de datos en una tabla, automticamente asigna un valor NULL a cualquier columna cuyo nombre falte de la lista de columnas especificada. SQL permite omitir la lista de columnas de la sentencia INSERT, entonces SQL genera automticamente una lista formada por todas las columnas de la tabla, en secuencia de izquierda a derecha (es la misma secuencia de columnas que la generada por un SELECT *). Este tipo de actualizaciones se realizan habitualmente en aplicaciones diarias y suelen hacerse mediante un programa de formularios, no obstante el formato de la sentencia INSERT utilizando SQL interactivo o programado es la misma.

VERSIN 1

JPV- 99

25 / 49

ANEXOS A CURSO PL/SQL

Nota: SQL requiere que las filas sean tratadas como conjuntos en operaciones de insercin, supresin y actualizacin, con lo que no existe la nocin de insertar la fila 'al comienzo', 'al final' o 'entre dos filas' de la tabla, despus de ejecutar la sentencia INSERT la nueva fila simplemente forma parte del conjunto de la tabla.

SENTENCIA INSERT MULTIFILA

INSERT INTO nombre-de-tabla (nombre-de-columna, ...) consulta Ahora INSERT aade mltiples filas de datos a la tabla destino, los valores de datos para las nuevas filas no son especificados explcitamente dentro del texto de la sentencia, sino que la fuente de las nuevas filas es una consulta de base de datos especificada en la sentencia. As pues los nuevos datos se obtienen de la propia base de datos. INSERT INTO libros_prestados_este_mes (titulo, autor. signatura) SELECT titulo, autor, signatura FROM libros WHERE fecha_prestamo >'01-ENE-90'; Conceptualmente esta sentencia SQL se efecta as: SQL realiza primero la consulta SELECT sobre la tabla LIBRO. Luego inserta los resultados libros_prestados_este_mes. de esa consulta, fila a fila, en la tabla

S se van a realizar varias consultas a distintas tablas grandes, puede tambin ser til el uso de la sentencia INSERT multifila para coger en una tabla distinta las filas de esas tablas con las que se va a trabajar y sobre ella realizar las consultas. Notas: El estndar SQL ANSI/ISO especifica varias restricciones sobre la consulta que aparece dentro de la sentencia INSERT multifila: La consulta no puede contener una clusula ORDER BY. La consulta no puede ser la UNION de varias sentencias SELECT diferentes. Slo puede especificarse una nica sentencia SELECT ?. La tabla destino de la sentencia INSERT no puede aparecer en la clusula FROM de la consulta o de ninguna subconsulta que esta contenga. Esto prohibe insertar parte de la tabla en s misma.

VERSIN 1

JPV- 99

26 / 49

ANEXOS A CURSO PL/SQL

UTILIDADES DE CARGA MASIVA


Los datos a insertar en una base de datos son frecuentemente extrados de otro sistema informtico o recolectados de otros lugares y almacenados en archivos secuenciales. Para cargar los datos en una tabla, se podra escribir un programa que leyera cada registro del archivo y utilizara la sentencia INSERT de una fila para aadir la fila a la tabla. Sin embargo, el recargo de hacer que el RDBMS ejecute repetidamente sentencias INSERT de una fila puede ser bastante alto, por esta razn todos los productos RDBMS comerciales incluyen una capacidad de carga masiva que carga los datos desde un archivo a una tabla a alta velocidad. Nota: El estndar SQL ANSI/ISO no considera esta funcin, y suele ser suministrada como un programa de utilidad autnomo, en lugar de formar parte del lenguaje SQL.

BORRADO DE DATOS DE LA BASE DE DATOS (DELETE).

DELETE FROM nombre-de-tabla WHERE condicin-de-busqueda La clusula FROM especifica la tabla destino que contiene las filas, la clusula WHERE especifica que filas de la tabla van a ser suprimidas. Las condiciones de bsqueda que pueden especificarse en la clusula WHERE de la sentencia DELETE son las mismas disponibles en la clusula WHERE de la sentencia SELECT. Conceptualmente SQL aplica la clusula WHERE a cada una de las filas de la tabla especificada, suprimiendo aquellas para las cuales la condicin de bsqueda produce un resultado TRUE. Supongamos que queremos suprimir de nuestra tabla de libros el libro "El pndulo de Foucault", cuya signatura es 10234 para ello hacemos: DELETE FROM libros WHERE signatura = 10234; La clusula WHERE es opcional en una sentencia DELETE, si se omite se suprimirn todas las filas de la tabla destino. La tabla an existe, pero est vaca. A veces la seleccin de las filas a suprimir debe efectuarse en base a datos contenidos en otras tablas. El modo de manejar una peticin de este tipo es una condicin de bsqueda subconsulta. DELETE FROM libros WHERE autor = (SELECT nombre FROM escritores
VERSIN 1 JPV- 99 27 / 49

ANEXOS A CURSO PL/SQL

WHERE edad>80); En el ejemplo suprimimos de la tabla de LIBROS las filas correspondientes a libros cuyo autor tiene ms de 8O aos. Las subconsultas pueden anidarse unas sobre otras y pueden contener referencias externas a la tabla destino de la sentencia DELETE, con la nica limitacin (en una sentencia DELETE) de que la tabla destino no puede aparecer en la clusula FROM de una subconsulta ni en ninguna de sus subconsultas anidadas.

MODIFICACIN DE DATOS EN L A BASE DE DATOS (UPDATE)

UPDATE nombre-de-tabla SET nombre-de-columna = expresin, ... WHERE condicin~de~busqueda O bien: UPDATE nombre-tabla SET nombre-columna = (consulta), ... WHERE condicin-de-busqueda La clusula WHERE es opcional, si se omite se actualizan todas las filas de la tabla. Para el segundo formato, en el que aparece una subconsulta en la clusula SET, esta debe devolver una nica fila por cada fila que se va a actualizar. La clusula SET especifica que columnas se van a actualizar y calcula los nuevos valores, y la clusula WHERE selecciona las filas de la tabla a modificar. UPDATE libros SET precio = 1 .12 * precio; WHERE EDITORIAL = 'Acme Editorial' En el ejemplo indicamos que vamos a actualizar la tabla LIBROS, cambiando la columna PRECIO de aquellas filas en las que la columna EDITORIAL tiene un valor 'Acme Editorial'. El cambio en la columna PRECIO es aumentar su valor en un 12%. Si una expresin en la lista de asignacin referencia a una de las columnas de la tabla destino, el valor utilizado para calcular la expresin es el valor de esa columna en la fila actual antes de que se aplique ninguna actualizacin, lo mismo es aplicable a las referencias de columna que se producen en la clusula WHERE. Vemoslo con un
VERSIN 1 JPV- 99 28 / 49

ANEXOS A CURSO PL/SQL

UPDATE oficinas SET cuota = 40000.00, ventas = cuota WHERE cuota < 40000.00; Aqu WHERE selecciona slo aquellas OFICINAS cuya columna CUOTA tena un valor menor de 40000 antes de la sentencia UPDATE y la columna VENTAS toma el valor de la columna CUOTA tambin antes del UPDATE. La clusula WHERE en la sentencia UPDATE es opcional, si se omite entonces se actualizan todas las filas de la tabla destino. Al igual que para la sentencia DELETE, en UPDATE tambin se pueden usar subconsultas, que permiten seleccionar filas a actualizar en base a informacin contenida en otras tablas. Las limitaciones de las subconsultas son las mismas que para los DELETES. UPDATE clientes SET rep_clie = 106 WHERE rep_clie IN (SELECT num_empl FROM repventas WHERE ventas < (0.8 * cuota));

VERSIN 1

JPV- 99

29 / 49

ANEXOS A CURSO PL/SQL

3. DDL. DATA DEFINITION LANGUAGE

CREACIN DE UN A TABLA (CRE ATE TABLE)

SINTAXIS GENERAL.

CREATE TABLE <nombre de la tabla> ( <nombre de la columna> <tipo de dato> [NOT NULL] [DEFAULT ----], ... ) El nombre de la tabla debe ser nico al igual que el nombre de la columna dentro de la tabla (puede ser igual al nombre de una columna que pertenece a otra tabla). Opcionalmente puede aadirse: NOT NULL: impide que existan valores nulos (NULL) dentro de la columna. Si se omite, se permiten NULL. DEFAULT: especifica un valor por omisin para la columna. CREATE TABLE oficinas (oficina NUMBER(8) NOT NULL, ciudad VARCHAR(15) NOT NULL, region VARCHAR(10) NOT NULL WITH DEFAULT 'Este', dir NUMBER(8) DEFAULT 106, objetivo NUMBER(12,2) DEFAULT NULL, ventas NUMBER(12,2) NOT NULL DEFAULT 0.00) CREATE TABLE varia de un producto RDBMS a otro en cuanto a: tipos de datos. palabras claves para identificar tipos de datos. manejo de los valores NULL: Segn el estndar una columna puede contener un valor NULL a menos que especficamente se declare NOT NULL. En algunos productos el defecto es NOT NULL y hay que especificar NULL para que puedan darse valores nulos.

Una sintxis alternativa sera:

VERSIN 1

JPV- 99

30 / 49

ANEXOS A CURSO PL/SQL

CREATE TABLE <nombre de la tabla> (<columna]> <tino de dato> [NOT NULL] [DEFAULT], ... ..... ) [ STORAGE <storage> ] [AS <consulta>]

DEFINICIONES DE LA CLAVE PRIMARIA Y FORNEA


PRIMARY KEY: define la clave primaria. Sirve como identificador nico para cada fila de la tabla. Especifica la/s columna/s que forman la clave primaria de la tabla. Se exige que los valores de la clave primaria para cada fila sean nicos y no nulos (NOT NULL para la/s columna/s de la clave primaria). FOREIGN KEY: define la clave fornea de la tabla. Especfica la relacin que crea con otra tabla de la base de datos. Especifica: columnas dentro de la tabla que forman dicha clave. la tabla padre que es referenciada por la clave (hijo). nombre opcional para la relacin. Este nombre cuando se produce un error. una regla de supresin opcional para la relacin (RESTRICT, CASCADE o SET NULL). Si no se especifica esta regla de supresin se utiliza la regla RESTRICT.

El RDBMS se asegura de que la clave fornea y la clave primaria de la tabla referenciada concuerdan en nmero de columnas y tipo de dato. CREATE TABLE <nombre de la tabla> (<col 1> <tipo de dato>..., ... PRIMARY KEY ( <coli>, <colj>,...), FOREIGN KEY <nombre de la relacin>( <cola>, <colb>...) REFERENCES <nombre de la tabla padre> [ON DELETE { RESTRIC, CASCADE)] ) CREATE TABLE pedidos (num_pedido NUMBER(8) NOT NULL, fecha_pedido DATE NOT NULL, clie NUMBER(8) NOT NULL, rep NUMBER(8), fab CHAR(3) NOT NULL,

VERSIN 1

JPV- 99

31 / 49

ANEXOS A CURSO PL/SQL

product CHAR(5) NOT NULL, cant NUMBER(10) NOT NULL, importe NUMBER(12,2) NOT NULL, PRIMARY KEY (num_pedido), FOREIGN KEY pedidopor(clie) REFERENCES clientes, FOREIGN KEY tomadopor(rep) REFERENCES repventas, FOREIGN KEY espor(fab,producto) REFERENCES productos ON DELETE RESTRIC) NUM_PEDIDO es la clave primaria de la tabla PEDIDOS. CLIE, REP y (FAB, PRODUCTO) son las claves forneas. CLIE esta relacionado con la tabla padre CLIENTES a travs de la referencia PEDIDOPOR. REP esta relacionado con la tabla REPVENTAS a travs de la referencia TOMADOPOR. FAB y PRODUCTO esta relacionado con la tabla PRODUCTOS a travs de la referencia ESPOR. ORACLE: Soporta estas dos claves: CREATE TABLE <nombre de la tabla> (<col 1> <tipo de dato> [NOT NULL] [DEFAULT], ... CONSTRAINT <nombre de la relacin> PRIMARY KEY ( <coli>, <colj>, ...), CONSTRAINT <nombre de la relacin> FOREIGN KEY ( <cola>, <colb>, ...) REFERENCES <nombre de tabla padre> ) Con la clusula CONSTRAINT se especfica el nombre de la relacin tanto para la clave primana como para la clave fornea. Esta clusula es opcional. La clave fornea debe referenciar a la clave primaria o a un grupo de columnas de la misma o a un grupo de columnas con la especificacin UNIQUE. SI no se especifica ninguna columna de la tabla padre entonces la clave fornea referencia a la clave primaria de la misma.

RESTRICCIONES DE UNICIDAD
UNIQUE: especifica que los valores de una columna sean nicos. Si una clave primara, clave fornea o una restriccin de unicidad afecta a una sola columna, el estndar ANSI/ISO permite una forma abreviada de la definicin: permite que estas claves se aadan al final de la definicin de la columna.

VERSIN 1

JPV- 99

32 / 49

ANEXOS A CURSO PL/SQL

ELIMINACIN DE UNA TABLA (DROP TABLE)

DROP TABLE <nombre de la tabla> DROP TABLE clientes; De no ser el propietario, se debe tener permiso para borrarla: DROP TABLE <propietario>.<nombre de la tabla> DROP TABLE sam.clientes; DROP borra la tabla de la base de datos, su definicin y todos sus contenidos. Todo esto se pierde y no hay forma de recuperarlo.

MODIFICACIN DE LA DEFINICIN DE TABLA (ALTER TABLE)


ALTER TABLE: permite modificar la estructura de la tabla y se emplea normalmente sobre tablas propias. Cada RDBMS posee una forma. Se emplea para: aadir una definicin de columna a una tabla. definir una clave primaria para una tabla. definir una clave fornea para una tabla. eliminar una clave fornea o primaria existente para una tabla.

ADICIN DE UNA COLUMNA

ALTER <nombre de la tabla> ADD <nombre de la columna> <tipo de dato> La nueva columna se aade al final de la tabla. El RDBMS asume un valor NULL para la columna recin aadida en todas las filas existentes en la tabla. Puede ponerse NOT NULL WITH DEFAULT con lo que el RDBMS pone el valor de defecto especificado. Todos estos cambios se realizan cuando se intenta visualizar, no inmediatamente. ALTER TABLE productos ADD cant_min NUMBER(10) NOT NULL WITH DEFAULT;

VERSIN 1

JPV- 99

33 / 49

ANEXOS A CURSO PL/SQL

SUPRESIN DE UNA COLUMNA


No se puede suprimir una columna con ALTER. Los pasos que hay que dar son: 1. descargar todos los datos de la tabla. 2. utilizar la sentencia DROP TABLE cara borrar la definicin de la tabla. 3. utilizar la sentencia CREATE TABLE para redefinir la tabla sin la columna no deseada. 4. volver a cargar todos los datos que fueron anteriormente descargados. Existen programas para cargar y descargar datos que facilitan esta labor de supresin.

MODIFICACIN DE CLAVES PRIMARIA Y FORNEA.


INSERTAR CIAVE FORNEA

ALTER TABLE <nombre de la tabla hijo> ADD CONSTRAINT <nombre de la relacin> FOREIGN KEY ( <columna/s>) REFERENCES <nombre de la tabla padre> ALTER TABLE oficinas ADD CONSTRAINT enregion FOREIGN KEY (region) REFERENCES region;

BORRAR CLAVE FORNEA

Para ello la relacin que se crea entre la tabla padre e hijo debe tener un nombre. ALTER TABLE <nombre de la tabla hijo> DROP CONSTRAINT <nombre de la relacin padre/hijo> ALTER TABLE oficinas DROP CONSTRAINT enregion;

OTRAS MODIFICACIONES.
En ORACLE la sentencia ALTER TABLE permite:

VERSIN 1

JPV- 99

34 / 49

ANEXOS A CURSO PL/SQL

aadir columnas o relaciones (CONSTRAINT) mediante ADD. modificar tipos de datos de columnas usando MODIFY. borrar restricciones con DROP. activar y desactivar restricciones con ENABLE y DISABLE. modificar el futuro almacenamiento de datos con STORAGE. ALTER TABLE <nombre de la tabla> [ADD ( <col1><tipo de dato>, ...)] [MODIFY ( <col2> <nuevo tipo de dato>, ...)] [DROP CONSTRAINT <nombre de la relacion>] [DISABLE CONSTRAINT <nombre de la relacion>] [ENABLE CONSTRAINT <nombre de la relacion>] ALTER TABLE emp MODIFY ename VARCHAR2(75);

ALTER TABLE emp DISABLE CONSTRAINT emp_pk;

CREACIN DE VISTAS (CREATE VIEW)


Una vista es una tabla virtual en la base de datos cuyos contenidos estn definidos por una consulta. De cara al usuario aparece igual que una tabla real, con un conjunto de columnas designadas y filas de datos. A diferencia de una tabla real, una vista no existe en la base de datos como un conjunto almacenado de valores. La vista esta formada por un conjunto de tablas fuente de las cuales se selecciona un conjunto de columnas (o todas). Una vez definida la vista, se puede utilizar en una sentencia SELECT, lo mismo que en una tabla real. En algunas vistas tambin se puede utilizar las sentencias INSERT, DELETE y UPDATE para modificar datos a travs de ella, corno si fuera una tabla real. Por tanto, a todos los efectos prcticos, se puede utilizar como si fuera una tabla real. Cuando el RDBMS se encuentra con la referencia de una vista en una sentencia, determina la definicin de la misma y luego traduce la peticin que referencia a la vista a una peticin equivalente con respecto a las tablas fuentes de la vista y lleva a cabo la peticin. Para vistas muy complejas, define la vista y la almacena en una tabla temporal. Sobre ella realiza las peticiones borrndola cuando ya no es necesaria. Ventajas de las vistas Seguridad: cada usuario esta autorizado para acceder a una serie de vistas. Simplicidad en la consulta: se puede eliminar consultas multitabla.
JPV- 99 35 / 49

VERSIN 1

ANEXOS A CURSO PL/SQL

Simplicidad estructurada: dan una visin personalizada de la estructura de la base de datos. Aislamiento frente al cambio: puede presentar una imagen consistente inalterada de la estructura de la base de datos aunque las tablas cambien de estructura. Integridad de datos: al acceder e introducir datos a travs de la vista el RDBMS comprueba automticamente los datos para asegurarse de que cumplen las restricciones de integridad especificadas.

Desventajas de las vistas menor rendimiento. restricciones de actualizacin: existen vistas que pueden ser actualizadas pero otras no, es decir, son de solo lectura.

Para crear una vista se debe tener permiso para acceder a todas las tablas referenciadas en la consulta. Se puede asignar opcionalmente un nombre a cada columna de la vista creada. Solamente se especifican los nombres de las columnas. El tipo de datos, la longitud, y otras caractersticas de la columna se deducen de la definicin de la columna de la tabla fuente. a) Vistas horizontales Una vista horizontal divide horizontalmente la tabla fuente para crear la vista. Todas las columnas de la tabla fuente participan en la vista, pero solo algunas de sus filas son visibles a travs de la vista. CREATE VIEW <nombre de la vista> AS SELECT * FROM <nombre de la tabla> WHERE <condicin> La vista se deriva de una nica tabla fuente. WHERE determina qu filas van a formar parte de la vista. CREATE VIEW repeste AS SELECT * FROM repventas WHERE oficina_rep IN (11, 12, 13 );

b) Vistas verticales Una vista vertical divide la tabla fuente verticalmente para crear la vista. Todas las filas de la tabla fuente participan en la vista, pero solo algunas de sus columnas son visibles a travs de ella.
VERSIN 1 JPV- 99 36 / 49

ANEXOS A CURSO PL/SQL

CREATE VIEW <nombre de la vista> AS SELECT <col 1>, <col2>,... FROM <nombre de la tabla> La vista se deriva de una nica tabla fuente. SELECT determina que columnas van a tomar parte de la vista. CREATE VIEW infooficina AS SELECT oficina, ciudad, region FROM oficinas;

c) Vistas con subconjuntos fila/columna La vista esta formada por un conjunto de filas y columnas de una nica tabla real. CREATE VIEW <nombre de la vista> AS SELECT <col 1>, <col2>,... FROM <nombre de la tabla> WHERE <condicin> SELECT selecciona las columnas y WHERE las filas de la tabla fuente. CREATE VIEW cliebill AS SELECT num_clie, empresa, limite_credito FROM clientes WHERE rep_clie=109;

d) Vistas agrupadas Una vista agrupada es aquella en la que los datos visibles a travs de ella son el resultado de una consulta agrupada. Las vistas agrupadas toman una columna de la tabla, le aplican una funcin de grupo, producen una fila resultado y se le asigna a un nombre de columna. CREATE VIEW <nombre de la lista> ( <col 1>, <coI2>, ... ) AS SELECT <coln>, <funl>, <fun2>, ... FROM <nombre de la tabla> GROUP BY <coln>

VERSIN 1

JPV- 99

37 / 49

ANEXOS A CURSO PL/SQL

Las vistas agrupadas funcionan como vistas de solo lectura, pueden participar en consultas, pero no en actualizaciones. CREATE VIEW ped_por_rep (quien, cuantos, total, inf, sup, medio) AS SELECT rep, COUNT(*), SUM(Importe), MIN(importe),MAX(importe),AVG(importe) FROM pedidos GROUP BY rep;

e) Vistas compuestas Una vista compuesta extrae sus datos de dos o tres tablas diferentes y presentan los resultados de la consulta como nica tabla virtual. CREATE VIEW <nombre de la vista> (<col 1>, <co2>, ... ) AS SELECT <cola>, <colb>, ... FROM <tabla 1>, <tabla2>, ... WHERE <condicionl> AND <condicion2> Donde: col 1, col 2, ...nombres de las columnas de la vista. cola, colb ... nombres de las columnas de las tablas especificadas por FROM. Sobre esta nueva vista puede hacerse todo tipo de consultas y accesos a datos. CREATE VIEW info_pedido (num_pedido, empresa, nombre_rep, importe) AS SELECT num_pedido, empresa, nombre_rep, importe FROM pedidos, clientes, repventas WHERE clie=num_clie AND rep_clie = 1O3;

ACTUALIZACIN DE UNA VISTA

En una vista se puede insertar una fila de datos, suprimirla y actualizarla. Cualquier tipo de modificacin realizada en la vista implica una modificacin en la/s tabla/s original/es.
EL ESTNDAR ANSI/ISO PARA ACTUALIZACIONES DE VISTAS

Bajo el estndar ANSI/ISO una vista puede ser actualizada si la consulta que define satisface las siguientes restricciones.

VERSIN 1

JPV- 99

38 / 49

ANEXOS A CURSO PL/SQL

las filas duplicadas no deben ser eliminadas de los resultados de la consulta. la vista debe tener una nica tabla fuente para la cual el usuario tiene los privilegios requeridos. Si la tabla fuente es una vista debe cumplir estos criterios. la lista de seleccin no puede contener expresiones, columnas calculadas o funciones de columna. las condiciones de bsqueda especificadas en WHERE no pueden incluir una subconsulta. Solo pueden aparecer condiciones de bsqueda simples fila a fila. la consulta no debe incluir una clusula GROUP BY o HAVING.

Estas reglas sobre actualizaciones de vistas son muy restrictivas. En realidad las reglas especficas que determinan si una vista puede ser actualizada o no varan de un producto RDBMS a otro, y suelen estar bastante detalladas. En ORACLE una vista puede ser actualizada si la consulta de la que deriva contiene cumple las siguientes restricciones: no contiene una unin de tablas. no contiene la clusula GROUP BY. no contiene la clusula DISTINT.

COMPROBACIN DE ACTUALIZACIN DE VISTAS

Existe una opcin de comprobacin de actualizacin de vistas: CHECK OPTION. Esta opcin se especifica en la sentencia CREATE VIEW de la siguiente forma: CREATE VIEW <nombre de la vista> AS SELECT * FROM <nombre de la tabla> WHERE <condicin> WITH CHECK OPTION Con esta opcin, se comprueba automticamente cada operacin INSERT y UPDATE sobre la vista para asegurarse de que las filas resultantes satisfagan el criterio de bsqueda de la definicin de vista. Si una fila insertada o modificada no satisface la condicin, la sentencia INSERT o UPDATE fallara y la operacin no se llevara a cabo. Con esto se consigue la integridad de las bases de datos, pues si se omitiera esta opcin y se intentara actualizar una fila en la vista que no satisficiera el criterio de bsqueda, el RDBMS la actualizara en la/s tabla/s fuente pero no en la vista. Si posteriormente se realiza una consulta dicha fila no aparecera en la vista. Con la opcin de comprobacin se impide que modificaciones efectuadas a travs de la vista afecten a datos que no son accesibles al usuario en primera instancia.

VERSIN 1

JPV- 99

39 / 49

ANEXOS A CURSO PL/SQL

CREATE VIEW repeste AS SELECT * FROM repventas WHERE oficina_rep IN(11, 12, 13) WITH CHECK OPTION;

SUPRESIN DE VISTAS (DROP VIEW)

DROP VIEW <nombre de la view>; donde <nombre de la view> es el nombre dado por nosotros a esta VIEW en la sentencia de creacin CREATE VIEW. DROP VIEW oficinas1;

CREACIN DE SINNIMOS (CREATE SYNONYM)


Un sinnimo es un nombre definido para representar el nombre de una tabla que pertenece a otro usuario. Si se tiene permiso para acceder a la tabla de otro usuario se debe poner usuario.nombre de la tabla.nombre de la columna Para simplificar esto se puede sustituir usuario.nombre de la tabla por un sinnimo: CREATE [PUBLIC] SYNONYM <nombre sinnimo> FOR <usuario>.<nombre de la tabla> PUBLIC especifica que el sinnimo puede ser empleado por todos los usuarios de la base de datos. Si se omite PUBLIC, por defecto el sinnimo solo es accesible a su creador. CREATE SYNONYM OFICIAS FOR ADMIN_PP.OFICINAS

SUPRESIN DE SINNIMOS (DROP SYNONYM)

DROP SYNONYM <nombre del sinnimo> DROP SYNONYM OFICINAS


VERSIN 1 JPV- 99 40 / 49

ANEXOS A CURSO PL/SQL

CAMBIOS DE NOMBRE (RENAME)


Existe un comando o sentencia SQL que permite la modificacin del nombre de una tabla, vista o sinnimo. Este comando es especfico del SQL de ORACLE. La sentencia a la que nos referimos es RENAME. RENAME nombre_antiguo TO nuevo_nombre; donde: nombre_antiguo Es el nombre que posea la tabla, sinnimo o vista. nuevo_nombre Es el nombre que desearnos asignar.

CREACIN DE NDICES (CREATE INDEX)


INDICE:es una estructura que proporciona un acceso rpido a las filas de una tabla en base a los valores de una o ms columnas. Almacena valores y punteros a las filas en donde se producen los valores. En el ndice los valores dados estn dispuestos en orden creciente o decreciente de modo que el RDBMS puede buscar rpidamente el ndice para encontrar un valor particular. A continuacin puede seguir el puntero para localizar la fila que contiene al valor. El ndice informa al RDBMS en que lugar del disco esta localizada la fila. Todo esto acelera enormemente la ejecucin de las sentencias SQL con condiciones de bsqueda. Desventajas de !os ndices: el ndice consume espacio en el disco. debe actualizarse cada vez que se aade una fila a la tabla y cada vez que la columna indexada se actualiza en una fila existente.

Utilidad: para condiciones de bsqueda. para consultas a tabla ms frecuentes que inserciones y actualizaciones.

El RDBMS siempre establece un ndice para la clave primaria, ya que presupone que el acceso a la tabla se efectuar ms frecuentemente a travs de la clave primaria. CREATE [UNIQUE] INDEX <nombre del ndice> ON <nombre de la tabla> ( col l, col2, ...) UNIQUE es opcional. Indica que los valores de las columnas deben ser nicos. CREATE UNIQUE INDEX ped_prod_idx ON pedidos(fab, producto);

VERSIN 1

JPV- 99

41 / 49

ANEXOS A CURSO PL/SQL

ELIMINACIN DE NDICES (DROP INDEX)

DROP INDEX <nombre del ndice> DROP INDEX ped_prod_idx; ORACLE: Soporta la misma sintaxis para crear y borrar ndices. Entre otras cosas se puede especificar en qu TABLESPACE se quiere almacenar el ndice: CREATE [UNIQUE] INDEX <nombre del ndice> ON <nombre de la tabla> (col1 [ASC | DESC], col2 [ASC|DESC], ...) [TABLESPACE <tablespace>] ASC especifica que el ndice recorre valores en orden ascendente. DESC especifica que el ndice recorre valores en orden descendente. Si no se especifica nada se toma ASC por defecto.

VERSIN 1

JPV- 99

42 / 49

ANEXOS A CURSO PL/SQL

4. DCL. DATA CONTROL LANGUAGE.

SEGURIDAD DEL SISTEMA.


Solamente los usuarios autorizados pueden acceder a la BD. Cuando un usuario se conecta emplea un nombre de usuario y una clave. En ese momento se verifica si se trata de un usuario autorizado y en caso afirmativo cuales son sus privilegios de acceso. Los privilegios de un usuario se agrupan en dos familias: Privilegios de sistema: aquellos que indican si el usuario tiene permiso para realizar ciertas acciones sobre un conjunto de objetos (p.e. el derecho a crear tablespaces o a borrar filas de cualquier tabla). Privilegios de objetos: aquellos que indican si el usuario tiene permiso para realizar ciertas acciones sobre un objeto concreto (p.e. borrar filas de la tabla EMP).

La cantidad de distintos privilegios que se pueden dar a un usuario es muy grande, por ello, para evitar tener que dar los privilegios de uno en uno a los usuarios se usan los roles. Un role es un conjunto de privilegios. Los roles predefinidos por ORACLE son: 1. CONNECT: permite conectase y acceder a las tablas pblicas y a aquellas para las que se le hayan otorgado permisos. Contiene entre otros los privilegios alter session , create database link , create sequence , create session , create synonym , create table , create view . 2. RESOURCE: permite al usuario crear sus propios objetos. Los privilegios son create procedure , create sequence , create table , create trigger . 3. DBA: el administrador de sistema. Tiene todos los privilegios de sistema.

ACCESO A LOS OBJETOS.


Los objetos de una base de datos son propiedad del usuario que los creo y slo son visibles por su dueo inicialmente. Para que otros usuarios puedan acceder a ellos, el propietario debe conceder a estos usuarios unos privilegios.
CONCESIN DE PRIVILEGIOS.

Para conceder privilegios a un usuario se emplea la sentencia GRANT: GRANT {privilegio [,privilegio,...] | ALL} ON objeto TO {usuario [,usuario...] | PUBLIC} | WITH GRANT OPTION

VERSIN 1

JPV- 99

43 / 49

ANEXOS A CURSO PL/SQL

Donde privilegio es el comando que se autoriza que el usuario ejecute sobre el objeto. Estos pueden ser: ALTER, DELETE, INDEX, SELECT, UPDATE, DROP,... La opcin ALL otorga todos los privilegios y PUBLIC hace referencia al conjunto de todos los usuarios. Finalmente, WITH GRANT OPTION permite al usuario que recibe estos privilegios transmitirlos a otros usuarios.
RETIRADA DE PRIVILEGIOS.

El propietario de los objetos pueda retirar los privilegios concedidos sobre sus objetos a otros usuarios empleando la sentencia REVOKE: REVOKE {privilegio [,privilegio,...] | ALL} ON objeto TO {usuario [,usuario...] | PUBLIC} Quitar el privilegio a un usuario tambin significa quitrselo a los usuarios a los que este hubiera transmitido dichos privilegios. Nota: la concesin y retirada de roles a un usuario o de privilegios a un role sigue las mismas reglas sintcticas que acabamos de indicar.

VERSIN 1

JPV- 99

44 / 49

ANEXOS A CURSO PL/SQL

ANEXO 3: TABL AS DEL DICCIONARIO.

TABLAS DEL DICCIONARIO.

Toda la informacin de las tablas est registrada en el diccionario del sistema (Data Dictionary), que son tablas especiales que se crean en la instalacin de ORACLE (que son administradas por el sistema). Conjunto de tablas y vistas que contienen informacin sobre la base de datos (se crean automticamente cuando se crea esa base). Se pueden consultar las tablas y vistas del diccionario con la sentencia SELECT. Tablas: DICTIONARY Contiene una descripcin de las tablas que constituyen el diccionario. ALL_CATALOG Contiene todas las tablas, vistas y sinnimos accesibles por el usuario. ALL_OBJECTS Contiene todos los objetos (tablas, vistas, ndices, ) propiedad del usuario o a los que puede acceder. USER_CATALOG Contiene todas las tablas, vistas, sinnimos y secuencias propiedad del usuario. USER_OBJECTS Contiene todos los objetos propiedad del usuario. USER_SOURCE Contiene toda la informacin procedimientos y funciones. ALL_TAB_COLUMNS Muestra nombres y definiciones de las columnas a las que el usuario puede acceder.
VERSIN 1

sobre

paquetes,

cuerpos

de

paquetes,

USER_TAB_COLUMNS Muestra nombres y definiciones de las columnas propiedad del usuario. USER_INDEXES Contiene informacin sobre los ndices creados por el usuario. ALL_SYNONYMS
JPV- 99 45 / 49

ANEXOS A CURSO PL/SQL

Muestra informacin sobre los sinnimos accesibles por el usuario. USER_SYNONYMS Muestra informacin sobre los sinnimos creados por el usuario. USER_TAB_GRANTS Describe los privilegios de accesos a tablas otorgados por el propietario a los dems usuarios. Tambin registra los privilegios concedidos al usuario por los dems usuarios. ALL_USERS Contiene la lista de los usuarios de la base. ALL_VIEWS Contiene el nombre de las vistas accesibles por el usuario. USER_VIEWS Contiene las sentencias utilizadas en la definicin de las vistas creadas por el usuario.

VERSIN 1

JPV- 99

46 / 49

ANEXOS A CURSO PL/SQL

ANEXO 4: OPERADORES

OPERADORES
Se utilizan para manipular datos de forma individual y devolver un valor. Suelen estar representados por caracteres especiales o palabras claves.

OPERADOR () +, *, / || = <>,!=, = >, < >=, <= [NOT] IN ANY, ALL [NOT] BETWEEN c1 AND c2 [NOT] EXISTS [NOT] LIKE IS [NOT] NULL NOT AND OR UNION INTERSECT MINUS

DESCRIPCIN Modificar prioridad de operadores. Sumar y restar. Multiplicar y dividir. Concatenar cadenas de caracteres. Igual. Distinto. Mayor y menor. Mayor o igual y menor o igual. Pertenencia a un conjunto. Permiten realizar comparaciones con subconsultas. Mayor o igual que c1 y menor igual que c2. Verdadero si la subconsulta devuelve filas. Verdadero si es similar al patrn de referencia. Comprueba si el valor es nulo. Negacin lgica. Y lgica. O lgica. Une los resultados de varias consultas. Filtra el resultado de dos consultas a aquellas filas que se encuentran en ambas. Filtra el resultado de dos consultas a aquellas filas que se encuentran en la primera pero no en la segunda.

VERSIN 1

JPV- 99

47 / 49

ANEXOS A CURSO PL/SQL

OPERADORES LGICOS
Para construir la condicin de la consulta necesitamos conocer los operadores lgicos, por eso a continuacin damos una lista de los operadores ms usados, agrupados en cuatro grupos: 1. 2. 3. 4. Valor nico:Comprueban un valor simple. Lista de valores:Comprueban ms de un valor. Combinaciones lgicas:Combinan expresiones lgicas. Negacin:Invierte el resultado de la expresin con operadores de valor nico o de lista de valores.

VALOR NICO > < >= <= =


Operadores clsicos de comparacin: mayor, menor, mayor e igual, menor e igual, igual a.

!= <> ^=
Operador "Distinto de" en sus tres formas.

IS NULL
Comprueba la ausencia de datos (valor nulo). No se puede usar la comparacin = NULL.

LIKE
Selecciona registros segn el reconocimiento de un patrn de consulta.

LISTA DE VALORES BETWEEN valor AND valor


Comprueba que el valor se encuentre en el rango de valores.

IN (valor,...,valor)
Verifica si el valor pertenece a la lista de valores. Combinaciones lgicas.

AND
Retorna Verdadero si todas las condiciones son verdaderas.

OR
Retorna Verdadero si alguna de las condiciones es verdadera.

VERSIN 1

JPV- 99

48 / 49

ANEXOS A CURSO PL/SQL

NEGACIN NOT
Invierte el resultado de una expresin lgica, por ejemplo. IS NOT NULL NOT BETWEEN valor AND valor NOT IN (valor,...,valor) NOT LIKE

PATRN DE CONSULTA
Una de las herramientas lgicas ms poderosas de SQL es el reconocimiento de un patrn de consulta, instrumento ste que permite la bsqueda por nombre, direccin u otro dato parcialmente recordado. Los patrones de consulta juegan un papel importante en el momento de realizar consultas, ya que es comn que necesitemos encontrar un texto y no recordemos exactamente cmo fue ingresado. Con el uso del operador LIKE podemos comparar patrones y ubicar un texto, independientemente de la posicin en que se encuentre. Para la definicin del patrn de consulta existen dos tipos de caracteres especiales: % (signo de porcentaje) llamado comodn, representa cualquier cantidad de espacios o caracteres en esa posicin. Significa que se admite cualquier cosa en su lugar: un caracter, cien caracteres o ningn caracter. _ (signo de subrayado) llamado marcador de posicin, representa exactamente una posicin e indica que puede existir cualquier caracter en esa posicin. Listar los clientes que tengan la palabra LIBRO a partir de la 5 posicin en el nombre.

SELECT nombre,direccion,telefono FROM clientes WHERE nombre LIKE '____LIBRO%';

VERSIN 1

JPV- 99

49 / 49