Introducción a SQL y PL/SQL
Introducción a SQL y PL/SQL
INDICE
Indices 32
Creación de Indices 32
Eliminación de un Indice 34
Procesamiento de Transacciones 34
Comando COMMIT 34
Comando ROLLBACK 34
Pasaje de Parámetros 35
Parámetros por posición 35
Parámetros por nombre 35
Comando SPOOL 35
Manipulación de Datos 36
Comando Insert 36
Comando Update 36
Comando Delete 37
Subconsultas 37
Single Row 38
Multiple Rows 39
Multiple Column 39
Correlate 40
Formatos de Salida 41
Formato general del archivo 41
Comandos SET 41
Formateo de columnas 42
Definición de títulos 42
Definición de cortes 43
Comando PROMPT 43
Comando COMPUTE 43
Generalidades PL/SQL 45
Beneficios al utilizar PL/SQL 45
Programas de PL/SQL 46
Bloques de PL/SQL 46
Tipo de Bloque 47
Comentarios 47
Mostrar mensajes 48
Declaración de variables 48
Tipos de Datos 48
Bloques anidados 49
Asignar valores a variables 49
Interacción con la Base de Datos 50
Recuperando datos con PL/SQL 50
Manipulando datos con PL/SQL 51
Controles de Flujo 52
Sentencia IF 53
LOOP Básico 53
LOOP FOR 54
LOOP WHILE 55
Cursores 55
Cursores con Loops FOR 56
Manejo de Errores 57
Procedimientos y Funciones 59
Procedimientos 59
Funciones 59
Ejercicios 60
Tablas de Nuestro Curso 63
-2-
Introducción a SQL y PL/SQL
Base de Datos.
Una base de datos relacional es una colección de objetos y/o relaciones que almacenan
datos. Es también un conjunto de tablas y sus relaciones que mantienen cierta
integridad. Las funciones necesarias que debe contener una base de datos relacional
son:
Permitir introducir datos.
Permitir la extracción de datos.
Almacenar datos.
Protección de datos.
Procesamiento de los datos.
Valor: En cada hueco de intersección entre una fila y una columna aparece un valor
único, no un grupo repetitivo de valores. Un caso particular es el Valor Null, el cual
Representa la ausencia de información, o una propiedad no aplicable. No ocupa espacio
en la Base de Datos.
Clave Externa (Foreign Key): Representa las relaciones entre tablas. Es una
columna o grupo de columnas de una tabla cuyos valores deben corresponderse con los
de la clave primaria de alguna otra tabla.
-3-
Introducción a SQL y PL/SQL
El nombre SQL proviene de Structured Query Language, pero esto no significa que SQL
sea sólo un lenguaje de consulta. SQL en este momento es un lenguaje capaz de ser
utilizado para Consultas, Actualización, Definición de Datos, Control, Consistencia,
Concurrencia y Diccionario de datos.
Comandos SQL
Los comandos SQL permiten acceder y manipular los datos almacenados en una base de
datos.
Los mismos son:
Este comando es utilizado para visualizar la estructura de una tabla u objeto. La sintaxis
es:
-4-
Introducción a SQL y PL/SQL
Existen ciertas reglas, las cuales nos ayudaran a entender mejor un SQL cuando lo
veamos:
TIPOS DE DATOS
CHAR (s)
Carácter de longitud fija de tamaños. Estos campos pueden contener cualquier
carácter alfanumérico, en mayúsculas o minúsculas, más caracteres especiales tales
como +, -, $, etc. Longitud máxima 255 caracteres.
LONG
Valores de tipo carácter de longitud variable hasta 2 Gbytes. Se permite sólo una
columna LONG por tabla.
VARCHAR2 (s)
Igual a CHAR pero su longitud es variable. Si el valor del campo no completa el
total de lo definido, no se rellena con blancos.
NUMBER (p,s)
Valor numérico con un máximo de dígitos p y una cantidad de dígitos s a la
derecha del punto decimal. La longitud máxima es de 38 dígitos significativos.
DATE
Los datos de este tipo contienen fecha y hora entre el 1 de enero de 4712 a.c. y
el 31 de diciembre de 4712 d.c.
-5-
Introducción a SQL y PL/SQL
DICCIONARIO DE DATOS
USER_
Contienen los objetos propios de los usuarios. Por ejemplo: tablas creadas por el
usuario, USER_TABLES.
ALL_
Contiene los objetos a los cuales el usuario tiene acceso, además de los propios.
Por ejemplo: tablas a las cuales se tiene acceso, ALL_TABLES.
DBA_
Contiene todos los objetos de la base de datos.
V$
Muestran información acerca de performance y lockeos. Estas vistas sólo están
disponibles para DBAs.
Además existen ciertas vistan que no utilizan los prefijos antes mencionados.
DICTIONARY
Contiene todas las tablas, vistas y sinónimos del diccionario de datos.
TABLE_PRIVILEGES
Permisos sobre objetos sobre los cuales el usuario es quien los otorga, los recibe
o es el propietario.
IND
Es un sinónimo para USER_INDEXES.
-6-
Introducción a SQL y PL/SQL
RECUPERACION DE DATOS
Con el fin de extraer datos de la base se necesita usar el comando SELECT del lenguaje
SQL.
Sintaxis
SELECT [DISTINCT] *,
Tabla.columna1 alias,
Tabla.columna2 alias,
…
FROM Tabla1 alias1,
Tabla2 alias2,
…
WHERE condición1
AND/OR condición2
AND/OR condiciónn
ORDERY BY Tabla.campo1,
Tabla.campo2,
…
GROUP BY tabla.campo1,
Tabla.campo2,
…;
SELECT
Es una lista de por lo menos una columna. Se separan con comas.
DISTINCT
Suprime duplicados. Es opcional.
*
Recupera todas las columnas de las tablas del FROM.
Columna
Nombre de algún campo de las tablas utilizadas en el FROM.
Alias
Se utiliza para identificar en todo el query que tabla se esta utilizando. Es opcional.
FROM
Lista de tablas a utilizar.
WHERE
Lista de condiciones que se van a tener en cuenta al momento de recuperar los
registros.
ORDER BY
Es el orden que van a tener los registros de salida. Es opcional.
HAVING
Se utiliza para restringir registros cuando se agrupan tablas.
Para recuperar todas las columnas de una tabla se puede utilizar el elemento *. Por
ejemplo: se necesita recuperar todas las columnas de la tabla clientes. Sería:
-7-
Introducción a SQL y PL/SQL
SELECT *
FROM Clientes;
En cambio, si se quiere recuperar solo algunas columnas se las debe especificar una por
una. Por ejemplo: recuperar nombre y apellido de todos los clientes. Quedaría:
SELECT apellido_responsable,
Nombre_responsable
FROM clientes;
Concatenación de Columnas
Para juntar las columnas en un query, es necesario utilizar el elemento concatenador ||.
El mismo se utiliza para concatenar caracteres. Por ejemplo: si para el caso anterior
necesitaríamos que el apellido y el nombre estén juntos tendríamos que realizar el
siguiente query:
SELECT apellido_responsable||nombre_responsable
FROM clientes;
Al realizar esto vemos que quedan totalmente pegados. Se necesita separarlos por una
coma o un espacio. Entonces quedaría:
Entonces vemos que quedan concatenados correctamente. Para que se pueda visualizar
un título correcto se pueden utilizar alias para las columnas. Los mismos se pueden
utilizar en todas las columnas recuperadas en un SELECT y se deben colocar separados
con un espacio, luego de cada columna entre comillas. Por ejemplo:
Utilización de DISTINCT
SELECT categoría
FROM clientes;
Esto nos recuperaría todos los registros de la tabla clientes, pero nosotros necesitamos
sólo los distintos valores de categoría que existen en ella. Entonces tendríamos que
realizar el siguiente query:
Ordenando la salida
-8-
Introducción a SQL y PL/SQL
SELECT apellido_responsable,
Nombre_responsable
FROM clientes
ORDER BY apellido_responsable;
SELECT apellido_responsable,
Nombre_responsable
FROM clientes
ORDER BY 1;
Además, se puede especificar por cada columna del ORDER BY si la columna tiene que
ordenarse de forma Ascendente (ASC) o Descendente (DESC). El valor por defecto es
ASC. Ejemplo:
SELECT apellido_responsable,
Nombre_responsable
FROM clientes
ORDER BY apellido_responsable DESC;
Restricción de la salida
Se puede restringir las filas recuperadas usando la cláusula WHERE. Dicha cláusula
contiene una o varias condiciones, las cuales se deben cumplir para que se recupere
algún registro determinado. Se ubican después de la cláusula FROM. Sintaxis:
SELECT apellido_responsable
FROM clientes
WHERE categoría = ‘RI’
ORDER BY apellido_responsable;
Cuando se compara contra un character o una fecha, los valores deben estar encerrados
entre comillas simples.
-9-
Introducción a SQL y PL/SQL
Los operadores se utilizan para realizar las comparaciones. Devuelven verdadero o falso.
Pueden dividirse en tres conjuntos:
Operadores de comparación:
Símbolo Significado
= Igualdad
<> Desigualdad
¡=
^=
> Mayor
< Menor
>= Mayor e igual
<= Menor e igual
Operadores SQL
Símbolo Significado
IN Dentro de
BETWEEN x AND y Entre x e y
LIKE Parecido o una parte
IS NULL Es nulo
IS NOT NULL Es no nulo
Operadores lógicos
Símbolo Significado
NOT Niega la condición
AND Hace un “y” lógico entre dos
condiciones
OR Hace un “o” lógico entre dos
condiciones
Operador IN
Se lo utiliza para restringir la salida a una lista de valores determinados. Por ejemplo:
Listar los proveedores cuyas localidades se encuentre dentro de Martinez y Lomas de
Zamora.
SELECT *
FROM proveedores
WHERE localidad IN (‘Martinez’, ‘Lomas de Zamora’);
Operador LIKE
Símbolo Significado
% Representa cualquier secuencia de cero o más
caracteres
_ Denota un solo carácter
- 10 -
Introducción a SQL y PL/SQL
SELECT *
FROM productos
WHERE nombre_producto LIKE ‘C%’;
SELECT *
FROM productos
WHERE nombre_producto LIKE ‘_P%’;
SELECT *
FROM productos
WHERE nombre_producto LIKE ‘%2%’;
Operador BETWEEN
SELECT apellido_responsable
FROM clientes
WHERE id_cliente BETWEEN 1 AND 10;
Para grabar un query que se esta utilizando, se lo tiene que primero editar desde
SQL*PLUS mediante el comando edit o ed. El mismo abre el block de notas y se lo
puede grabar en cualquier lado. Los archivos de queries llevan la extensión .sql.
Para ejecutar un query grabado en un archivo, es necesario utilizar el comando Stara o
@.
Sintaxis:
Start <path><[Link]>
@ <path><[Link]>
Ejemplo:
@ c:\temp\[Link]
start c:\temp\[Link]
Para poder utilizar más de una restricción, es necesario la utilización de los operadores
lógicos AND y OR. El operador AND retorna VERDADERO si ambas condiciones evaluadas
son verdaderas, mientras que el operador OR retorna VERDADERO si alguna de las
condiciones es VERDADERA.
Ejemplo utilizando el operador AND: Recuperar los proveedores de Capital Federal, cuyo
nombre comienzan con T.
- 11 -
Introducción a SQL y PL/SQL
SELECT *
FROM proveedores
WHERE localidad = ‘Capital Federal’
AND nombre_proveedor LIKE ‘T%’;
Ejemplo utilizando el operador OR: Recuperar los proveedores de Capital Federal o los
que cuyo nombre comiencen con T.
SELECT *
FROM proveedores
WHERE localidad = ‘Capital Federal’
OR nombre_proveedor LIKE ‘T%’;
SELECT *
FROM proveedores
WHERE nombre_proveedor LIKE ‘T%’
OR nombre_proveedor LIKE ‘M%’;
Reglas de precedencia
SELECT *
FROM proveedores
WHERE localidad = ‘Capital Federal’
AND nombre_proveedor LIKE ‘T%’
OR nombre_proveedor LIKE ‘M%’;
SELECT *
FROM proveedores
WHERE localidad = ‘Capital Federal’
AND (nombre_proveedor LIKE ‘T%’
OR nombre_proveedor LIKE ‘M%’);
- 12 -
Introducción a SQL y PL/SQL
JOIN
Cuando se requieren datos a partir de más de una tabla se utiliza una condición join.
Las filas de una tabla pueden ser combinadas con las de otra tabla de acuerdo con
valores comunes existentes en las columnas correspondientes:
Existen tres tipos principales de condiciones de join:
Equijoins
Non-equijoins
Outer-joins
Equijoins
Sintaxis:
SELECT *
FROM proveedores, productos
WHERE proveedores.id_proveedor = productos.id_proveedor;
Non-equijoins
Cuando no existe una clave para igualar dos tables y se debe utilizar alguna
combinación de campos. Es decir que no se utiliza el comparador =.
Outer-joins
Si una fila no satisface una condición del join, entonces no aparecerá en el resultado de
la consulta. Las filas faltantes pueden ser recuperadas si en la condición se utiliza un
operador de outer-join. El operador es un signo más encerrado entre paréntesis (+), y
se ubica en el lado del join donde no hay valores de correspondencia con los de la otra
tabla.
El operador outer-join solo puede aparecer de uno de los lados de una condición. No se
puede utilizar con el operador IN o ser unida con otra condición por el operador OR.
Sintaxis
SELECT tabla1.columna1, tabla2.columna2
FROM tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna2 (+);
- 13 -
Introducción a SQL y PL/SQL
PRODUCTO CARTESIANO
Se llama así cuando se omite una condición de join o cuando se define una condición de
join y es inválida. El resultado es la combinación de todas las filas de la primer tabla con
todas las de la segunda tabla. Para evitar un producto cartesiano, se debe incluir
siempre una condición de join válida en la cláusula WHERE.
SELECT *
FROM proveedores, productos;
SELECT *
FROM proveedores, productos
WHERE proveedores.id_proveedor = productos.id_proveedor;
ALIAS
Sintaxis
SELECT [Link],
[Link]
FROM tabla1 alias1, tabla2 alias2
WHERE [Link] = [Link];
Cuando se realiza una consulta, los nombres de las columnas se usan como cabecera de
presentación. Si éste resulta demasiado largo, corto o críptico, puede cambiarse
utilizarse un alias para la misma.
Sintaxis
SELECT columna “alias”
FROM tabla;
- 14 -
Introducción a SQL y PL/SQL
FUNCIONES
Estas funciones se usan para manipular ítems de datos. Aceptan uno o más argumentos
y devuelven un valor por cada fila que recupera la consulta.
Un argumento puede ser:
Sintaxis
Function_name (columna|expresión, [arg1, arg2, …])
Donde function_name: es el nombre de la función.
Columna: es una columna de una tabla.
Expresión: es una cadena de caracteres o una expresión calculada.
Arg1, arg2: es cualquier argumento pasado.
- 15 -
Introducción a SQL y PL/SQL
Función Uso
UPPER UPPER (columna|expresión)
Devuelve el carácter en mayúsculas
LOWER LOWER (columna|expresión)
Devuelve el carácter en minúsculas
INITCAP INITCAP (columna|expresión)
Devuelve la primer letra de cada palabra en
mayúsculas
SUBSTR SUBSTR (columna|expresión, x, y)
Devuelve el campo a partir de la posición x, y
caracteres
NVL NVL (columna|expresión, columna|expresión)
Si el primer valor es nulo, devuelve el segundo
LENGTH LENGHT (columna|expresión)
Devuelve la cantidad de caracteres
CONCAT CONCAT (columna1|expresión1, columna2|expresión2)
Concatena la primer cadena de caracteres con la
segunda. Es equivalente al operador ||.
Ejemplos:
Función Uso
ROUND ROUND (columna|expresión, n)
Redondea la columna o expresión con los decimales de
n. Por defecto redondea a un número entero
TRUNC TRUNC (columna|expresión, n)
Trunca la columna o expresión en la posición n de los
decimales. Si se omite el valor n devuelve el número
entero
- 16 -
Introducción a SQL y PL/SQL
Ejemplos:
DUAL: La tabla dual es propiedad del usuario SYS y puede ser accedida por todos los
usuarios. Contiene una columna, DUMMY y una fila con el valor X.
SYSDATE: Es una función de fecha que devuelve fecha y hora corriente. Se puede usar
como si fuera una columna.
Ejemplo:
SELECT SYSDATE
FROM [Link];
Ejemplos:
SELECT sysdate,
Sysdate + 10,
Sysdate – 10
FROM [Link];
- 17 -
Introducción a SQL y PL/SQL
- 18 -
Introducción a SQL y PL/SQL
Funciones de fechas:
Función Uso
MONTHS_BETWEEN MONTHS_BETWEEN (fecha1, fecha2)
Devuelve la diferencia en meses entres esas dos
fechas. El resultado puede ser positivo o
negativo
ADD_MONTHS ADD_MONTHS (fecha, n)
Agrega n meses a la fecha pasada como
parámetro
LAST_DAY LAST_DAY (fecha)
Devuelve la fecha del último día del mes
Ejemplos:
- 19 -
Introducción a SQL y PL/SQL
Función Uso
TO_CHAR TO_CHAR (numero|fecha, [‘formato’])
Convierte al número o fecha en alfanumérico con el
formato pasado como parámetro. Los formatos
siempre van entre comillas simples.
Ejemplos:
- 20 -
Introducción a SQL y PL/SQL
Funciones de Grupo
En contraste con las funciones a nivel fila, éstas funciones operan sobre conjuntos de
filas para dar un resultado por cada uno de ellos.
Dichos grupos pueden estar constituidos por la tabla entera o por partes de la misma.
Este tipo de funciones aparecen en la cláusula SELECT y HAVING.
Función Uso
SUM SUM (DISINCT|ALL|n)
Suma los valores de n ignorando valores nulos
COUNT COUNT (DISTINCT|ALL|n)
Cantidad de registros n. No cuenta los nulos. Para
contar todos los registros se utiliza *, que incluye
registros nulos o duplicados
AVG AVG (DISTINCT|ALL|n)
Valor promedio de n, ignorando los valores nulos
MAX MAX (DISTINCT|ALL|n)
Valor máximo de n
MIN MIN (DISTINCT|ALL|n)
Valor mínimo de n
La cláusula DISTINCT hace que la función considere solo los valores no duplicados, mientras que ALL incluye
todos los valores. Si no se pone nada, por defecto toma ALL.
Ejemplo:
- 21 -
Introducción a SQL y PL/SQL
Por defecto, todas las filas de una tabla se tratan como un grupo. Con el fin de obtener
grupos más pequeños, se usa la cláusula GROUP BY en la sentencia SELECT. Además se
puede utilizar la cláusula HAVING cuando se quiere restringir un grupo resultante.
Funciona de manera similar al WHERE. De esta manera se pueden usar funciones de
grupo y éstas cláusulas para obtener información de resumen o totalizadores para cada
grupo.
Sintaxis:
SELECT columna1, columna2, <función de grupo>
FROM tabla
WHERE condiciones
GROUP BY <columnas para agrupar>
HAVING <condiciones de grupo>
ORDER BY orden;
- 22 -
Introducción a SQL y PL/SQL
Union
Unión combina todas las filas del primer conjunto con todas las filas del segundo.
Cualquier duplicación de filas producida en el conjunto resultado, se reducirá a una fila
única.
Ejemplo:
Intersect
INTERSECT examinará las filas de los conjuntos de entradas y devolverá aquellas que
aparezcan en ambos. Todas las filas duplicadas serán eliminadas antes de la
generación del conjunto resultante.
Ejemplo:
Minus
MINUS devuelve aquellas filas que están en el primer conjunto pero no en el segundo.
Las filas duplicadas del primer conjunto se reducirán a una fila única antes de que
empiece la comparación con el otro conjunto.
Ejemplo:
CREACION DE TABLAS
Para la creación de tablas se utiliza el comando de SQL CREATE TABLE. Este comando
tiene un efecto inmediato sobre la base de datos y también graba información en el
Diccionario de Datos.
Sintaxis:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[constraint],
…
[table constraint]);
CONSTRAINTS
Las restricciones se utilizan para asegurar cierta integridad en la base de datos. Dichas
restricciones pueden ser utilizadas para garantizar el cumplimiento de reglas a nivel
tabla y/o en cualquier momento en que una fila sea insertada, actualizada o borrada.
La operación debe ser satisfecha para que la operación tenga éxito. Otro uso que se le
da es para evitar que se borre una tabla si ésta depende de otra.
Reglas:
Si no se le asigna un nombre, Oracle coloca un nombre ‘SYS_C’
y un número, por lo que se recomienda escribir uno.
Las constraints se pueden crear en el momento de crear la
tabla o posteriormente mediante la sentencia ALTER TABLE.
- 24 -
Introducción a SQL y PL/SQL
- 25 -
Introducción a SQL y PL/SQL
Nivel Descripción
Columna Hace referencia a una única columna y es definida dentro de la
especificación de la columna propietaria. Puede definirse cualquier
tipo de restricción de integridad.
Column,
[COSNTRAINT constraint_name] TIPO_CONSTRAINT
(column1, column2, …)
Tipos de Constraints
Constraint Descripción
NOT NULL Especifíca que esta columna no puede contener un valor nulo.
Solo se puede definir a nivel columna.
UNIQUE Especifíca una columna o combinación de ellas cuyos valores
deben ser únicos para todas las filas en la tabla.
Crea un índice UNIQUE automáticamente.
Se puede definir en todos los niveles.
PRIMARY KEY Identifica unívocamente a cada fila de la tabla.
Se permite una sola PK por tabla. Puede estar compuesta por
más de una columna.
No permite valores nulos.
Crea un índice UNIQUE automáticamente.
Se puede definir en todos los niveles.
FOREIGN KEY Establece y garantiza una relación foránea entre la columna y
una columna de la tabla referenciada.
Se puede definir en todos los niveles.
Palabras Claves:
FOREIGN KEY: es usada para definir la columna en la tabla hija,
cuando se estable la relación a nivel de tabla.
REFERENCES: identifica la tabla y columna de la tabla padre.
ON DELETE CASCADE: Indica que cuando la fila en la tabla padre
es borrada, las filas dependientes en la tabla hija también serán
borradas.
- 26 -
Introducción a SQL y PL/SQL
Ejemplo:
Una vez que se han creado las tablas, se puede modificar dicha estructura utilizando el
comando ALTER TABLE. Se puede agregar o eliminar columnas, modificar la longitud
de las columnas y agregar o eliminar constraints.
- 27 -
Introducción a SQL y PL/SQL
Ejemplos:
Sintaxis
Ejemplo:
- 28 -
Introducción a SQL y PL/SQL
Para otorgar permisos sobre una tabla se utiliza el comando GRANT. La sintaxis es la
siguiente:
Ejemplo:
GRANT Select
ON clientes
TO Scout;
Ejemplo:
REVOKE Select
ON clientes
TO Scott;
SINONIMOS
Creación de Sinónimos
Un sinónimo es un objeto que se crea para simplificar el acceso a otros objetos. Para
referirse a una tabla de otro usuario, se necesita prefijar el nombre de la tabla con el
nombre del dueño de la misma.
Creando un sinónimo se elimina la necesidad de clarificar el nombre del objeto con el
esquema o dueño y provee un nombre alternativo para una tabla, vista, secuencia,
procedimientos u otros objetos.
- 29 -
Introducción a SQL y PL/SQL
Tipos de sinónimos:
Sintaxis
CREATE [PUBLIC] SYNONYM <synonym>
FRO <object>;
Reglas:
Eliminación de Sinónimos
Sintaxis
DROP [PUBLIC] SYNONYM <synonym>;
- 30 -
Introducción a SQL y PL/SQL
VISTAS
Una vista es una tabla lógica basada en otras tablas o vistas. Una vista no contiene
datos propios, sino que es un medio para que se puedan ver o cambiar los datos de
una agrupación de datos. La vista esta formada por una sentencia SELECT, la que se
almacena en el Diccionario de Datos y cada vez que se le hace referencia, la misma
se eejcuta.
Sintaxis
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW <vista>
[(alias1, alias2, …)]
AS <subconsulta>
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
Reglas:
- 31 -
Introducción a SQL y PL/SQL
Ejemplo:
Confirmación de creación:
DESC clientes_ri
DESC clientes_prueba
Sintaxis
DROP VIEW <vista>;
SECUENCIAS
Sintaxis
CREATE SEQUENCE <sequence>
[INCREMENT BY n]
[START WITH n]
[(MAXVALUE n | NOMAXVALUE)]
[(MINVALUE n | NOMINVALUE)]
[(CYCLE | NOCYCLE)]
[(CACHE n | NOCACHE)];
Ejemplo:
Confirmación de creación:
Sintaxis
<secuencia>.NEXTVAL
<secuencia>.CURRVAL
Ejemplo de uso:
SELECT sq_clientes_id.CURRVAL
FROM dual;
SELECT sq_clientes_id.NEXTVAL
FROM dual;
- 33 -
Introducción a SQL y PL/SQL
Sintaxis
ALTER SEQUENCE <secuencia>
[INCREMENT BY n]
[START WITH n]
[(MAXVALUE n | NOMAXVALUE)]
[(MINVALUE n | NOMINVALUE)]
[(CYCLE | NOCYCLE)]
[(CACHE n | NOCACHE)];
Sintaxis
DROP SEQUENCE <secuencia>;
INDICES
Creación de índices
Es un objeto de la base de datos que provee de un acceso directo y más rápido a las
filas de una tabla. Su propósito es reducir la necesidad de E/S a disco mediante una
estructura especial que le permite ubicar rápidamente los datos. El índice es
automáticamente usado y mantenido por el Servidor de Oracle. Los índices son lógica
y físicamente independientes de la tabla sobre la que se aplican. Esto significa que
pueden ser creados o eliminados en cualquier momento y no tiene efectos sobre la
tabla base u otros índices.
- 34 -
Introducción a SQL y PL/SQL
Tipos de índices
Tipo Descripción
UNICO Asegura que los valores de las columnas que lo
compongan no se dupliquen
NO UNICO Este tipo de índices se crean para asegurar
consultar más rápidas y seguras
COLUMNA SIMPLE Cuando el índice está formado solamente por una
columna
CONCATENADO o Cuando el índice está compuesto por más de una
COMPUESTO columna. Puede contener hasta 16 columnas
Sintaxis
CREATE [UNIQUE] INDEX <indice>
ON tabla (columna1, columna2, …);
Ejemplo
- 35 -
Introducción a SQL y PL/SQL
Eliminación de un índice
PROCESAMIENTO DE TRANSACCIONES
Tipo de transacciones
Tipo Descripción
Manipulación de datos Consiste en un número cualquiera de sentencias DML
DML que el servidor Oracle trata como una entidad simple
o unidad de trabajo lógica
Definición de datos DDL Consiste en una sentencia DDL solamente
Control de datos DCL Consiste en una sentencia DCL solamente
Después que finaliza una transacción, la primer sentencia ejecutable que se dispare
dará comienzo a una nueva transacción.
Comando COMMIT
Esta comando finaliza la transacción actual haciendo que todos los cambios realizados
en la misma se hagan permanentes.
Sintaxis
COMMIT;
Comando ROLLBACK
Este comando finaliza la transacción actual descartando todos los cambios realizados
en la misma. Es decir que se vuelve atrás todo lo realizado en esa transacción.
Sintaxis
ROLLBACK;
- 36 -
Introducción a SQL y PL/SQL
PASAJE DE PARAMETROS
Los parámetros son valores que se le pueden pasar en la ejecución de un archivo SQL
para que éste los tome y los procese. De esta manera nos evitamos tener que abrir y
cerrar el archivo SQL cada vez que queramos cambiarlo. Existen básicamente dos
formas de pasar parámetros:
Por posición
Por nombre
Se utilizan cuando sabemos, desde el SQL, en que lugar vienen posicionados los
parámetros.
SELECT *
FROM clientes
WHERE id_cliente = &1
AND categoria = &2;
SELECT *
FROM clientes
WHERE id_cliente = &id_del_cliente
AND categoria = &categoria_del_cliente;
COMANDO SPOOL
El comando spool tiene por objetivo grabar la salida de uno o varios queries a un
archivo. La sintaxis es la siguiente:
- 37 -
Introducción a SQL y PL/SQL
Ejemplo
Spool c:\temp\[Link]
SELECT *
FROM clientes;
Spool off
MANIPULACION DE DATOS
Comando Insert
Este commando DML se utiliza para agregar datos a una tabla. Cuando se inserta un
registro en una tabla y un campo no es especificado el valor que le asigna Oracle es
NULL.
Sintaxis
INSERT INTO <tabla> [(columna1, columna2, …)]
VALUES (dato1, dato2, …);
Ejemplo
Comando Update
Este comando DML se utiliza para modificar datos de una tabla. Si se omiten
condiciones de restricción (WHERE), se actualizarán todos los registros de la tabla.
Sintaxis
UPDATE <tabla>
SET columna1 = valor1,
[columna2 = valor2, …]
[WHERE <condicion>];
UPDATE facturas_cab
SET cantidad_elementos = null
WHERE cantidad_elementos = 0;
Comando DELETE
Este comando DML se utiliza para elminar registros de una tabla. Si se omiten
condiciones de restricción (WHERE), se elminaran todos los registros de la tabla.
Sintaxis
DELETE FROM <tabla>
[WHERE <condición>];
Ejemplo
ROLLBACK;
SUBCONSULTAS (Subqueries)
Una subconsulta es una sentencia SELECT que esta incluída en una cláusula de otra
sentencia SQL. Es decir, una consulta que aparece dentro de otra consulta.
SELECT
UPDATE
CREATE (tablas o vistas)
DELETE
INSERT
EXISTS
NOT EXISTS
IN
NOT IN
Operadores lógicos (=, <, >, <=, >=, <>)
- 39 -
Introducción a SQL y PL/SQL
Tipos de subconsultas:
Single Row
Multiple Row
Multiple column
Carrelated
Single Row
UPDATE clientes A
SET nombre = nombre ||
(SELECT TO_CHAR(cumple_responsable)
FROM clientes B
WHERE A.id_cliente = B.id_cliente)
WHERE cumple_responsable =
(SELECT min(cumple_responsable)
FROM clientes);
Ejemplo de CREATE TALBE: Crear la tabla clientes2 con la información del cliente con
mayor edad.
- 40 -
Introducción a SQL y PL/SQL
Ejemplo de INSERT: Insertar en la tabla clientes2 todos los clients de la tabla clients
con excepción del cliente mayor.
Ejemplo de DELETE: Borrar el cliente con mayor edad de la tabla cliente2. Contar los
registros antes y después de borrar.
DELETE FROMclientes2
WHERE cumple_responsable =
(SELECT min(cumple_responsable)
FROM cliente2);
Múltiple Rows
Los múltiple rows subqueries son consultas que retornan uno o más registros de una
tabla. Existen 2 operadores posibles: IN (dentro de), NOT IN (no dentro de).
Ejemplo de operador IN: Recuperar los clientes que se llaman Diego y Pedro.
Ejemplo de operador NOT IN: Recuperar los clientes que no tengan facturas.
Múltiple Column
Los multiple column subqueries son consultas que peden retornar más de una
columna para un Quero determinado. Los operadores permitidos son los mismos que
para los otros subqueries.
- 41 -
Introducción a SQL y PL/SQL
Ejemplo de SELECT: Recuperar los clientes que tengan facturas y que hayan
comprado el día de su cumpleaños.
Ejemplo de UPDATE: Actualizar los clients que tienen categoría “RI” (colocar
Responsable Inscripto) y que no tienen completo el campo de cantidad_empleados
(colocar 0).
UPDATE clientes
SET (categoría, cantidad_empleados ) =
(SELECT ‘Responsable Inscripto’, 0
FROM dual)
WHERE categoría = ‘RI’
AND cantidad_empleados is null;
Correlate
Ejemplo con operador IN: Recuperar las facturas de cada cliente, los cuales hayan
tenido descuentos.
Ejemplo con operador EXISTS: Recuperar los clients que tengan facturas.
- 42 -
Introducción a SQL y PL/SQL
FORMATOS DE SALIDA
COMIENZO
/* área de seteos */
/* área de declaración de formatos de columnas y títulos */
/* área de declaración de cortes */
/* creación del spool */
/* SQL o SQLs */
/* Cierre de spool */
/* Cierre de seteos */
FIN
Comandos SET
Valor Uso
TAB Puede ser ON u OFF
Determina si el formato de la tabulación es TAB o
espacios
FEED[BACK] Puede ser ON u OFF
Determina la cantidad de registros seleccionados
LINE[SIZE] Determina la cantidad de caracteres por línea de la
salida
NULL text Determina el carácter que representará a un valor
nulo
PAGES[IZE] Determina las líneas por página
SPA[CE] Determina la cantidad de espacios que separa a
dos columnas
UND[ERLINE] Puede ser ON u OFF y el carácter.
Determina el carácter para subrayar los títulos de
cada columna
WRA[P] Puede ser ON u OFF
Determina si se truncan los valores de una
columna
VERIFY Puede ser ON u OFF
Muestra el reemplazo de los valores de los
parámetros.
Sintaxis:
- 43 -
Introducción a SQL y PL/SQL
Formateo de columnas
Valor Uso
CLEAR Borra los atributos de una columna
FORMAT Especifica el formato de una columna.
Puede ser para alfanuméricos A<n> donde n es la
cantidad de caracteres posibles; o puede ser 9999,
dependiendo de la cantidad de 9 del formato del
campo de salida
HEA[DING] Define el título de una columna
JUS[TIFY] Pede ser L[EFT] o C[ENTER] o R[IGHT]
Determina la alineación de los valores de una
columna
NEW[LINE] Comienza una nueva línea cuando se muestra el
valor de una columna
NOPRI[NT] o PRI[INT] Determina si se imprime o no una columna
WRA[PPED] o Determina si un campo alfanumérico es truncado o
TRU[NCATED] no
Sintaxis
Definición de Títulos
Sintaxis
- 44 -
Introducción a SQL y PL/SQL
Definición de cortes
Sintaxis
Comando PROMPT
Sintaxis
PROMPT <texto>
Comando COMPUTE
Sintaxis
COMP[UTE] [funcion]
OF [columna o alias]
ON [REPORT o ROW]
Funciones
Valor Uso
AVG Específica el promedio
COU[NT] Cuenta la cantidad para ese corte
MAX[IMUM] Máximo
MIN[IMUM] Mínimo
SUM Totaliza la columna
- 45 -
Introducción a SQL y PL/SQL
Ejemplo
COMIENZO
/* área de seteos */
SET FEED OFF
SET LINE 132
SET PAGES 60
/* SQL o SQLs */
SELECT id_cliente, id_factura, to_char(fecha_facturacion, ‘DD-MM-YYYY’) ff,
Importe_neto
FROM facturas_cab
ORDER BY id_cliente, id_factura, fecha_factura, importe_neto;
/* cierre de spool */
Spool off
/* cierre de seteos */
SET FEED ON
FIN
- 46 -
Introducción a SQL y PL/SQL
GENERALIDADES DE PL/SQL
Declaración de Identificadores
o Declarar variables simples, complejas, constantes, cursores,
excepciones
Manejo de errores
o Procesar errores emitidos por la base de datos
o Definir condiciones de error
Integración
o Tanto procedimientos como triggers, funciones y/o packages permitesn
que un programa se utilice en cualquier herramienta de Oracle y no
sea necesario replicarlo.
- 47 -
Introducción a SQL y PL/SQL
Programas de PL/SQL
Toda unidad de PL/SQL comprende uno o más bloques. Estos bloques pueden estar
separados o anidados uno dentro de otro. Así, un bloque puede representar una
pequeña parte de otro bloque, que a su vez puede ser parte de la unidad de
programa completa.
Bloques de PL/SQL
DECLARE - Opcional
- variables, constantes y cursores
BEGIN - Obligatorio
- Sentencias SQL
- Sentencias de Control PL/SQL
EXCEPTION - Opcional
- Acciones que se llevaran a cabo al producirse un error.
END; - Obligatorio
- 48 -
Introducción a SQL y PL/SQL
Tipo de Bloque
Podemos definir que existen dos tipos de bloques para la construcción de programas.
Bloques anónimos: No poseen nombres. Son declarados en alguna parte de la
aplicación y cuando son invocados el motor de PL/SQL los ejecuta. Un ejemplo de
este tipo de bloques son los triggers.
Bloques definidos: Son los que se definen bajo un nombre y se los declara como
procedimientos o funciones. Por ejemplo las funciones o procedimientos de base.
DECLARE
v_primera NUMBER(2);
v_segunda NUMBER(2);
v_resultado NUMBER(2);
BEGIN
END;
Comentarios
Siempre es aconsejable el uso de los comentarios para una mejor comprensión de los
programas. PL/SQL permite dos formas de generar comentarios:
Forma Uso
- Con los dos guiones se pueden hacer comentarios de
una sola línea.
Ejemplo:
-- Comienzo del bloque de datos.
/* */ De esta manera se puede delimitar cuando se
comienza y cuando se termina de escribir un
comentario. Admite más de un renglón.
Ejemplo:
/* Parámetros
P1 = nombre del cliente
P2 = nombre del proveedor
*/
- 49 -
Introducción a SQL y PL/SQL
Mostrar mensajes
Cuando se utiliza PL/SQL en alguna herramienta que le permita visualizar las salidas
del proceso (SQL*Plus por ejemplo), se pueden mostrar mensajes en pantalla.
La sintaxis es la siguiente:
SET SERVEROUTPUT ON
DBMS_OUTPUT.PUT_LINE (<mensaje>)
Declaración de variables
En PL/SQL es necesario que se declaren todas las variables o constantes que se van a
utilizar.
Sintaxis
Tipos de datos
Además de estos tipos de datos soporta tipos complejos de datos tales como tables
(arreglos de una dimensión) o record (arreglos de más de una dimensión).
- 50 -
Introducción a SQL y PL/SQL
Uso del %TYPE: Cuando se declara variables a las cuales se les va a asignar un valor
correspondiente a un campo de una tabla de la base de datos, se debe asegurar que
la definición de variables sean del tipo y precisión correctos para evitar futuros
errores. Para ello PL/SQL provee de un atributo que se puede utilizar en el momento
de declarar una variable y que hace referencia al tipo de dato definido en la base de
datos.
Sintaxis
Ejemplo
V_cliente clientes.id_cliente%TYPE;
Bloques anidados
Una de las ventajas que brinda PL/SQL es la posibilidad de anidar bloques. Para ello
debemos tener en cuenta que las operaciones definidas en un sub-bloque tienen un
alcance definido. Por ejemplo si se define una variable en un sub-bloque, la misma no
puede ser utilizada en el bloque principal porque no es reconocida.
DECLARE
x NUMBER(2);
BEGIN
…
DECLARE
y NUMBER(2); alcance de y alcance
de x
BEGIN
…
END;
…
END;
Para asignar o reasignar valores a una variable. Se debe escribir una sentencia de
asignación propia de PL/SQL. Para ello se utiliza el operador de asignación (:=).
Sintaxis
Ejemplo
v_cliente:= 1500;
- 51 -
Introducción a SQL y PL/SQL
La mayoría de las funciones válidas a nivel fila en SQL pueden ser utilizadas en una
asignación de valor. Dichas funciones son:
Sintaxis
SELECT [DISTINCT] *,
Tabla.columna1 alias,
…
INTO variable1, variable2, …
FROM tabla1 alias1, …
WHERE condicion1
AND/OR condicionn
ORDER BY tabla.campo1, …
GROUP BY tabla.campo1, ..;
- 52 -
Introducción a SQL y PL/SQL
Ejemplo
SET SERVEROUTPUT ON
DECLARE
v_categoria [Link]%TYPE;
BEGIN
BEGIN
SELECT categoría
INTO v_categoria
FROM clientes
WHERE id_cliente = 1;
END;
DBMS_OUTPUT.PUT_LINE(‘Categoria del cliente 1: ‘||v_categoria);
END;
Las sintaxis de dichos comandos son las mismas que para SQL, con la diferencia que
se pueden utilizar los nombres de variables para cualquier operación.
- 53 -
Introducción a SQL y PL/SQL
Ejemplo
SET SERVEROUTPUT ON
DECLARE
v_categoria [Link]%TYPE;
BEGIN
BEGIN
DELETE FROM clientes
WHERE id_cliente = 1000;
END;
BEGIN
SELECT categoría
INTO v_categoria
FROM clientes
WHERE id_cliente = 1;
END;
DBMS_OUTPUT.PUT_LINE(‘Categoria del cliente 1: ‘||v_categoria);
BEGIN
INSERT INTO clientes
(id_cliente,
Razon_social,
Apellido_responsable,
Nombre_responsable,
Cumple_responsable,
Categoría)
VALUES
(1000,
‘Telefónica de Argentina’,
‘Perez’,
‘Juan’,
Do_date(‘01011950’, ‘ddmmyyyy’),
v_categoria)
END;
BEGIN
UPDATE clientes
SET cantidad_empleados = 0
WHERE id_cliente = 1000;
END;
COMMIT;
END;
CONTROLES DE FLUJO
Sentencia IF
Sintaxis
IF condicion THEN
Sentencias;
[ELSIF condicion THEN
Sentencias;]
[ELSE
Sentencias;]
END IF;
Ejemplo
LOOP Básico
Sintaxis
LOOP
Sentencias;
Sentencias;
…
EXIT [WHEN condicion]
END LOOP;
- 55 -
Introducción a SQL y PL/SQL
Ejemplo
DECLAR
V_contador NUMBER(10):= 10;
BEGIN
…
LOOP
INSERT INTO productos
VALUES
(v_contador,
‘Producto ‘||to_char(v_contador),
100);
v_contador:= v_contador + 1;
LOOP FOR
Tiene la misma estructura que el loop ya visto. Además posee una sentencia de
control delante de la palabra clave LOOP que determina la cantidad de iteraciones
que realizará el ciclo.
Sintaxis
Ejemplo
…
BEGIN
…
FOR i IN 10000..20000 LOOP
INSERT INTO productos
VALUES
(i,
‘Producto ‘||to_char(i),
100);
END LOOP;
…
- 56 -
Introducción a SQL y PL/SQL
LOOP WHILE
Se puede utilizar este tipo de ciclos cuando se necesita que la cantidad de veces que
se ejecute se base en una condición lógica. Es decir, que el ciclo se ejecutará siempre
y cuando sea TRUE y ante la aparición de un valor FALSE se finaliza el ciclo.
Sintaxis
Ejemplo
DECLARE
v_contador NUMBER(10):= 10000;
BEGIN
…
WHILE v_contador <= 20000 LOOP
INSERT INTO productos
VALUES
(v_contador,
‘Producto ‘||to_char(v_contador),
100);
v_contador:= v_contador + 1;
END LOOP;
END;
CURSORES
Sintaxis
DECLARE
CURSOR <nombre> IS
Sentencia SELECT;
…
BEGIN
OPEN <nombre>;
…
FETCH <nombre> INTO variable1, variable2, …;
…
CLOSE <nombre>;
END;
- 57 -
Introducción a SQL y PL/SQL
Ejemplo
DECLARE
CURSOR clientes IS
SELECT id_cliente, razon_social
FROM clientes
ORDER BY id_cliente;
v_cliente NUMBER(10);
v_razon_social VARCHAR2(100);
BEGIN
OPEN clientes;
LOOP
FETCH clientes INTO v_cliente, v_razon_social;
DBMS_OUTPUT.PUT_LINE(‘Cliente: ‘||v_cliente||’ [Link]: ‘||v_razon_social);
EXIT WHEN v_clientes > 10;
END LOOP;
CLOSE clientes;
END;
Otra forma de utilizar cursores es mediante LOOP FOR. Este tipo de cursores finaliza
cuando la sentencia SELECT no recupera más datos.
Sintaxis
DECLARE
CURSOR <nombre> IS
Sentencia SELECT;
…
BEGIN
FOR i IN <nombre> LOOP
Sentencias;
END LOOP;
END;
- 58 -
Introducción a SQL y PL/SQL
Ejemplo
DECLARE
CURSOR clientes IS
SELECT id_cliente, razon_social
FROM clientes
ORDER BY clientes;
BEGIN
FOR i IN clientes LOOP
DBMS_OUTPUT.PUT_LINE(‘Cliente: ‘||i.id_cliente||’ [Link]: ‘||i.razon_social);
END LOOP;
END;
MANEJO DE ERRORES
Sintaxis
EXCEPTION
WHEN excepcion1 [OR excepcion2] THEN
Sentencias;
WHEN excepcion2 [OR excepcion3] THEN
Sentencias;
WHEN …
- 59 -
Introducción a SQL y PL/SQL
Excepciones definidas:
Variable Descripción
SQLCODE Retorna el número del código del error. Se puede asignar a
una variable tipo number
SQLERRM Retorna el mensaje asociado con el error. Posee un formato
alfanumérico
Ejemplo
DECLARE
V_contador NUMBER(10):= 10000;
BEGIN
WHILE v_contador <= 20000 LOOP
BEGIN
INSERT INTO productos
VALUES
(v_contador,
‘Producto ‘||to_char(v_contador),
100);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
V_contador:= v_contador – 1;
END;
V_contador: v_contador + 1;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Error: ‘||to_char(sqlcode));
DBMS_OUTPUT.PUT_LINE(‘Mensaje: ‘||sqlerrrm);
- 60 -
Introducción a SQL y PL/SQL
PROCEDIMIENTOS Y FUNCIONES
Procedimientos
Los procedimientos son muy similares a las funciones. Se diferencian con que pueden
devolver más de un valor. Se almacena como un objeto en la base de datos.
Funciones
Las funciones son bloques de PL/SQL que aceptan uno o varios argumentos o
parámetros y devuelven un resultado. Son almacenadas en la base de datos y se
pueden ejecutar desde todas las herramientas que permitan un acceso a la base de
datos. Se almacena como un objeto de la base de datos.
- 61 -
Introducción a SQL y PL/SQL
EJERCICIOS
- 62 -
Introducción a SQL y PL/SQL
- 63 -
Introducción a SQL y PL/SQL
- 64 -
Introducción a SQL y PL/SQL
- 65 -