0% encontró este documento útil (0 votos)
20 vistas65 páginas

Introducción a SQL y PL/SQL

Este documento proporciona una introducción a SQL y PL/SQL. Explica los componentes básicos de una base de datos relacional como tablas, filas, columnas y claves. Luego describe las características y comandos principales de SQL como SELECT para recuperar datos y JOIN para combinar tablas. Finalmente, introduce conceptos de PL/SQL como bloques, variables, tipos de datos e interacción con la base de datos.

Cargado por

magalipappa
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
20 vistas65 páginas

Introducción a SQL y PL/SQL

Este documento proporciona una introducción a SQL y PL/SQL. Explica los componentes básicos de una base de datos relacional como tablas, filas, columnas y claves. Luego describe las características y comandos principales de SQL como SELECT para recuperar datos y JOIN para combinar tablas. Finalmente, introduce conceptos de PL/SQL como bloques, variables, tipos de datos e interacción con la base de datos.

Cargado por

magalipappa
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

Introducción a SQL y PL/SQL

INDICE

Introducción a las Base de Datos 3


Base de Datos 3
Los componentes del Modelo Relacional 3
Características del SQL 4
Introducción a comandos SQL 4
Comandos SQL 4
Visualización de la estructura de una tabla 4
Escritura de Comandos SQL 5
Tipos de Datos 5
Diccionario de Datos 6
Recuperación de Datos 7
Concatenación de Columnas 8
Utilización de DISTINCT 8
Ordenando la Salida 8
Restricción de la Salida 9
Operador IN 10
Operador LIKE 10
Operador BETWEEN 11
Grabar y ejecutar un SQL 11
Acceso a datos con condiciones múltiples 11
Reglas de precedencia 12
JOIN 13
Equijoins 13
Non-Equijoins 13
Outer-Joins 13
Producto Cartesiano 14
Alias 14
Alias de una tabla 14
Alias de una columna 14
Funciones 15
Funciones a nivel fila 15
Funciones de grupo 20
Clausula Group By y Having 21
Expresiones con sentencia SELECT 22
Union 22
Intersect 22
Minus 22
Creación de Tablas 23
Constraints 23
Modificación de la Estructura de una Tabla 25
Eliminación de una Tabla 26
Permisos sobre Tablas 27
Sinónimos 27
Creación de Sinónimos 27
Eliminación de Sinónimos 28
Vistas 29
Crear una Vista 29
Borrar una Vista 30
Secuencias 30
Crear una Secuencia 30
Uso de las Secuencias 31
Modificar una Secuencia 32
Borrar una Secuencia 32
-1-
Introducción a SQL y PL/SQL

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

INTRODUCCION A LAS BASES DE DATOS

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.

Los componentes del modelo relacional

 Tabla (Relación): Estructura de almacenamiento básica de una base de datos


relacional. Sirve para almacenar datos del mismo tipo. Representa una entidad única o
una asociación entre entidades.

 Columna (Campo): Representa un y sólo un Atributo de la Entidad representada por


la tabla. Está formada por: Nombre, Conjunto de Valores. Una columna se identifica
siempre por su nombre, nunca por su posición. El orden de las columnas en una tabla
es irrelevante.

 Fila (Registro): Representa una OCURRENCIA de la entidad o asociación


representada por la taba. El orden en que las filas se almacenan en la tabla es
irrelevante.

 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 Primaria (Primary Key): Columna o conjunto de columnas que permiten


identificar cada ocurrencia de la tabla.

 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

CARACTERISTICAS DEL SQL

SQL es el lenguaje que permite la comunicación con el Sistema de Gestión de la Base


de Datos con ORACLE. Tiene las siguientes propiedades:

 Unificado: Es un lenguaje para todo tipo de usuarios.


 No Procedimental: El usuario especifica QUE quiere, no DONDE
ni COMO.
 Relacionalmente Completo: Permite la realización de cualquier
consulta de datos (Puede construirse una consulta que
devuelva una tabla entera, o un campo de una tabla, o un
determinado subconjunto de una tabla,...).

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.

INTRODUCCION A COMANDOS SQL

Comandos SQL

Los comandos SQL permiten acceder y manipular los datos almacenados en una base de
datos.
Los mismos son:

 Recuperación de Datos: SELECT: Recupera datos desde la


base de datos.
 Lenguaje de manipulación de datos (DML): INSERT, UPDATE Y
DELETE: Inserta, actualiza y borra datos de una tabla.
 Lenguaje de definición de datos (DDL): CREATE, ALTER,
DROP, RENAME Y TRUNCATE: Crean, modifican y elimina
estructuras de datos (tablas).
 Control de transacción: COMMIT, ROLLBACK Y SAVEPOINT:
Graban y vuelven atrás las modificaciones hechas por los
comandos DML.
 Lenguaje de control de datos: GRANT Y REVOKE: Modifican
permisos sobre los objetos de la base de datos.

Visualización de la estructura de una Tabla

Este comando es utilizado para visualizar la estructura de una tabla u objeto. La sintaxis
es:

DESCRIBE <owner>.<tabla u objeto>


DESC <owner>.<tabla u objeto>

-4-
Introducción a SQL y PL/SQL

Escritura de Comandos SQL

Existen ciertas reglas, las cuales nos ayudaran a entender mejor un SQL cuando lo
veamos:

 Los comandos pueden contar de una o más líneas


 Usualmente las cláusulas son ubicadas en diferentes líneas
para facilitar la lectura
 Se deben utilizar tabulaciones y/o identaciones para facilitar
la lectura de los querys
 Las abreviaturas y separación de palabras no están permitidas
 Generalmente, los comandos y las palabras claves se escriben
en mayúsculas, mientras que el resto de las palabras, tales
como tablas, columnas, etc., se ingresan en minúsculas.
 Los comandos SQL no son case sensitive.
 Al escribir un comando en SQL*Plus, el mismo se almacena
en el prompt SQL y las líneas subsiguientes están numeradas.
El archivo se llama [Link]. Corresponde al buffer SQL.
 En el buffer puede ser ejecutada una sentencia por vez. Para
ello, se puede ejecutar una sentencia de las siguientes
formas:
o Topear punto y coma al final de la cláusula
o Topear / al final de la cláusula
o Topear el comando run en el prompt SQL

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.

 RAW y LONG RAW


Equivalente a VARCHAR2 y LONG, respectivamente, pero usados para
almacenamiento orientado a byte o datos binarios.

-5-
Introducción a SQL y PL/SQL

DICCIONARIO DE DATOS

El diccionario de datos es uno de los componentes más importantes de las bases de


datos Oracle. Esta compuesto por tablas y vistas que contienen información sobre todos
los objetos creados en una base de datos. Es actualizado y mantenido automáticamente
por el motor de la base de datos.
Al diccionario de datos se accede a través de vistas. Existen cuatro clases y se
identifican por como comienzan sus nombres:

 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:

SELECT apellido_responsable||´, ´||nombre_responsable


FROM clientes;

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:

SELECT apellido_responsable||´, ´||nombre_responsable “Apellido y Nombre”


FROM clientes;

Utilización de DISTINCT

Al comando DISTINCT se lo utiliza para recuperar valores no duplicados. Por ejemplo: si


necesitamos recuperar los tipos de categoría que existen en la tabla de clientes,
tendríamos que:

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:

SELECT DISTINCT categoría


FROM clientes;

Ordenando la salida

-8-
Introducción a SQL y PL/SQL

Si se necesita especificar el orden de la salida de un query determinado, se utiliza la


cláusula ORDER BY. Se puede ordenar por una o varias columnas específicas o se puede
ordenar por posición.

Ejemplo de orden específico

SELECT apellido_responsable,
Nombre_responsable
FROM clientes
ORDER BY apellido_responsable;

Ejemplo de orden por posición

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

No siempre se conoce el valor exacto a buscar. Se pueden seleccionar filas que


coincidan con un patrón de caracteres usando el operador LIKE. La operación de
coincidencias se conoce como una búsqueda que incluye comodines. Se pueden utilizar
dos símbolos para construir la búsqueda:

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

Ejemplo 1: Recuperar los productos que comiencen con la letra C.

SELECT *
FROM productos
WHERE nombre_producto LIKE ‘C%’;

Ejemplo 2: Recuperar los productos cuyo segundo carácter sea P.

SELECT *
FROM productos
WHERE nombre_producto LIKE ‘_P%’;

Ejemplo3: Recuperar los productos cuyo contenido contenga el carácter 2.

SELECT *
FROM productos
WHERE nombre_producto LIKE ‘%2%’;

Operador BETWEEN

Este operador se lo utiliza para recuperar registros dentro de un rango de valores.

Ejemplo1: Recuperar todos los clientes cuyo Id se encuentra en 1 y 10.

SELECT apellido_responsable
FROM clientes
WHERE id_cliente BETWEEN 1 AND 10;

Grabar y ejecutar un SQL

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]

Acceso a datos con condiciones múltiples

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%’;

Ejemplo utilizando el operador OR: Recuperar los proveedores cuyos nombres


comiencen con T o M.

SELECT *
FROM proveedores
WHERE nombre_proveedor LIKE ‘T%’
OR nombre_proveedor LIKE ‘M%’;

Reglas de precedencia

Se pueden combinar los operadores AND y OR en la misma expresión lógica. Los


resultados de todas las condiciones se combinan en el orden determinado por la
precedencia de los operadores conectores.
Cuando los operadores tienen igual precedencia, se ejecutan de izquierda a derecha.
Cada AND se ejecuta primero y luego cada OR. AND tiene prioridad más alta que OR.

Orden de evaluación Operador


1 Todos los operadores de comparación (=, <>,
>, <, <=, >=, IN, LIKE, IS NULL, BETWEEN)
2 AND
3 OR

Para modificar las reglas de precedencia se pueden utilizar paréntesis.


Ejemplo: En base al siguiente analizar el funcionamiento de los paréntesis.

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

Cuando existe una clave para igualar dos tablas.

Sintaxis:

SELECT tabla1.columna1, tabla2.columna2


FROM tabla1, tabla2
WHERE tabla1.columna1 = tabla2.columna2;

Ejemplo de Join Simple: Recuperar todos los proveedores y sus productos.

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 =.

Ejemplo de non-equijoins: Recuperar las facturas y su nivel de venta.

SELECT id_factura, importe_neto, nivel


FROM facturas_cab, nivel_venta
WHERE facturas_cab.importe_neto BETWEEN nivel_venta.importe_desde AND
nivel_venta.importe_hasta;

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

Ejemplo de outer-join: Recuperar todos los clientes y facturas (tengan o no).

SELECT a.id_cliente, b.id_factura


FROM clientes a, facturas_cab b
WHERE a.id_cliente = b.id_cliente (+);

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.

Ejemplo de producto cartesiano:

SELECT *
FROM proveedores, productos;

Ejemplo sin producto cartesiano:

SELECT *
FROM proveedores, productos
WHERE proveedores.id_proveedor = productos.id_proveedor;

ALIAS

Alias de una tabla

El alias de una tabla tiene por el objeto la simplificación de la escritura de un query.

Sintaxis
SELECT [Link],
[Link]
FROM tabla1 alias1, tabla2 alias2
WHERE [Link] = [Link];

Alias de una columna

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

Las funciones pueden utilizarse para:

 Realizar cálculos sobre datos


 Modificar datos individualmente
 Agrupar salidas
 Modificar formatos para que den una salida más presentable
 Convertir los tipos de datos de las columnas.

Existen dos tipos diferentes de funciones:

 Funciones a Nivel Fila


 Funciones a Nivel de Grupo de Filas

Funciones a nivel Fila

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:

 Una consulta suministrada por el usuario


 Un valor de variable
 Un nombre de columna
 Una expresión

Como características podemos mencionar:

 Manipulan ítems de datos


 Aceptan uno o más argumentos y devuelven un valor
 Actúan sobre cada fila retornada
 Devuelven un resultado por fila
 Pueden modificar el tipo de datos
 Pueden estar anidadas. Se pueden invocar una dentro de otra
 Se pueden usar en las cláusulas SELECT, WHERE y ORDER
BY.

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

Existen diferentes tipos de funciones:

 Carácter: Aceptan caracteres como datos de entrada y pueden


devolver caracteres o números.

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:

SELECT UPPER (apellido_responsable)


FROM clientes;

SELECT LOWER (apellido_responsable)


FROM clientes;

SELECT INITCAP (nombre_proveedor)


FROM proveedores;

SELECT SUBSTR (apellido_responsable, 4, 2)


FROM clientes;

SELECT NVL (cuit, 99999999999999)


FROM clientes;

SELECT LENGTH (categoria)


FROM clientes;

 Número: Aceptan solamente números como datos de entrada


y devuelven valores numéricos.

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

MOD MOD (m,n)


Devuelve el resto de la división m por n

Ejemplos:

SELECT ROUND (12.4567, 2),


ROUND (12.4567, 0),
ROUND (12.4567)
FROM [Link];

SELECT TRUNC (12.4567, 2),


TRUNC (12.4567)
FROM [Link];

SELECT MOD (1600, 300)


FROM [Link];

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.

 Fechas: Oracle almacena las fechas en un formato numérico


interno que representa lo siguiente:
o Siglo
o Año
o Mes
o Día
o Horas
o Minutos
o Segundos
El formato por defecto de Oracle es DD-MON-YY.

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];

Operadores artiméticos de fechas:

Operación Resultado Descripción


Fecha + número Fecha Agrega una cantidad de días a la
fecha
Fecha – número Fecha Resta una cantidad de días a la
fecha
Fecha – fecha Nro. De días Resta una fecha de otra. Cantidad
de días entre fechas.

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:

SELECT MONTHS_BETWEEN (’01-jan-05’, ’01-aug-05’)


FROM [Link];

SELECT ADD_MONTHS (sysdate, 2)


FROM [Link];

SELECT LAST_DAY (sysdate)


FROM [Link];

- 19 -
Introducción a SQL y PL/SQL

 Conversión: Estas funciones se utilizan para transformer el


formato de un dato.

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.

Para las fechas, el formato puede ser:


DD: día
MM: mes numérico
MON: formato default para el mes. (JAN, FEB, MAR,
APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC)
YY: año en dos posiciones
YYYY: año en cuatro posiciones
CC: Siglo
Q: trimestre del año
HH o HH12 o HH24: Hora
MI: minutos
SS: Segundos
Se pueden separar por cualquier carácter o espacios.
Por ejemplo: ‘DD-MM-YYYY HH:MI:SS’

Para los números, el formato puede ser:


9: posición numérica
0: muestra ceros a la izquierda
$: signo dólar a la izquierda
.: punto decimal en la posición especificada
,: especifica separador de miles
MI: signo menos a la derecha para negativos
PR: pone negativos entre paréntesis

TO_DATE TO_DATE (carácter, ´formato´)


Convierte al carácter en formato fecha. El formato
puede ser:
DD: Día
MM: mes
MON: formato default para el mes. (JAN, FEB, MAR,
APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC)
YY: año en dos posiciones
YYYY: año en cuatro posiciones
CC: Siglo
Q: trimestre del año
HH o HH12 o HH24: Hora
MI: minutos
SS: Segundos
TO_NUMBER TO_NUMBER (carácter)
Devuelve el carácter pasado a formato numérico. Si
no se puede pasar porque es un signo o una letra,
Oracle da error.

Ejemplos:

- 20 -
Introducción a SQL y PL/SQL

SELECT TO_CHAR (SYSDATE, ‘DD-MM-YYYY HH24:MI’)


FROM [Link];

SELECT TO_CHAR (1234.12, ‘9,999,999’)


FROM [Link];

SELECT TO_DATE (‘20050301’, ‘YYYYMMDD’)


FROM [Link];

SELECT TO_NUMBER (‘1234’)


FROM [Link];

SELECT TO_NUMBER (‘con error’)


FROM [Link];

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:

SELECT SUM (importe_neto),


COUNT (*),
AVG (importe_neto),
MAX (importe_neto),
MIN (importe_neto)
FROM facturas_cab;

- 21 -
Introducción a SQL y PL/SQL

CLAUSULA GROUP BY Y HAVING

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;

Reglas para la utilización:

 Si se incluye una function de grupo en una cláusula SELECT,


no se puede seleccionar resultados individuales a menos que
la columna aparezca en la cláusula GROUP BY. Es decir que
todas las columnas utilizadas en la cláusula SELECT y que no
están afectadas por la función de grupo deben estar en la
cláusula GROUP BY.
 Con el uso de la cláusula WHERE, se puede excluir filas antes
de la división en grupos.
 No se puede usar notación de posición o el alias de columna
en la cláusula GROUP BY.
 Por defecto, las filas se ordenan en forma ascendente de
acuerdo a la lista GROUP BY. Esto se puede modificar
utilizando la cláusula ORDER BY.

Ejemplo de GROUP BY:

SELECT owner dueño,


COUNT (*) “Cantidad de tabas”
FROM all_tables
GROUP BY owner;

Ejemplo de GROUP BY y HAVING:

SELECT owner dueño,


COUNT (*) “Cantidad de tabas”
FROM all_tables
GROUP BY owner
HAVING COUNT(*) > 15;

- 22 -
Introducción a SQL y PL/SQL

EXPRESIONES CON SENTENCIAS SELECT

Existen tres tipos de operadores : UNION, INTERSECT, MINUS.

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:

SELECT id_proveedor, localidad


FROM proveedores
WHERE localidad ='Capital Federal'
UNION
SELECT id_proveedor, localidad
FROM proveedores
WHERE nombre_proveedor LIKE ‘T%’;

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:

SELECT id_proveedor, localidad


FROM proveedores
WHERE localidad ='Capital Federal'
INTERSECT
SELECT id_proveedor, localidad
FROM proveedores
WHERE nombre_proveedor LIKE ‘T%’;

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:

SELECT id_proveedor, localidad


FROM proveedores
WHERE localidad ='Capital Federal'
MINUS
SELECT id_proveedor, localidad
FROM proveedores
WHERE nombre_proveedor LIKE ‘T%’;
Reglas para el manejo de operadores de conjuntos:

 Pueden ser encadenados en cualquier combinación: SELECT . .


. UNION SELECT . . . INTERSECT . . .
- 23 -
Introducción a SQL y PL/SQL

 Los conjuntos son evaluados de izquierda a derecha.


 No existe jerarquía de procedencia en el uso de estos
operadores, pero puede ser forzada mediante paréntesis.
 Los operadores de conjuntos pueden emplearse con conjuntos
de diferentes tablas siempre que se apliquen las siguientes
reglas:
o Las columnas son relacionadas en orden, de izquierda a derecha.
o Los nombres de las columnas son irrelevantes.
o Los tipos de datos deben coincidir.(Se pueden utilizar funciones de
conversión de ORACLE para comparar tipos de datos distintos).

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]);

donde: schema es el dueño de la tabla


table es el nombre de la tabla
column es el nombre del campo
datatype tipo de dato y longitud
DEFAULT valor por defecto
Constraint restricción de integridad como parte de la columna
Table constraint restricción de integridad como parte de la tabla

Reglas para los nombres:


 Deben comenzar con una letra y pueden tener una longitud de
1-30 caracteres de largo.
 Deben contener únicamente los caracteres A-Z, a-z, 0-9, _, $ y
#.
 No se puede duplicar el nombre de otro objeto que sea propio
del mismo usuario.
 No se puede utilizar palabras reservadas.

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

Niveles de Constraints: Las constraints se pueden crear a nivel columna o tabla.

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 [CONSTRAINT constraint_name] TIPO_CONSTRAINT


Tabla Hace referencia a una o más columnas y se define separadamente
de las definiciones de las columnas de la tabla. Puede definirse
cualquier tipo de restricción excepto NOT NULL.

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:

CREATE TABLE Curso.Ejemplo1


(Id NUMBER (10) CONSTRAINT ejemplo1_pk PRIMARY KEY,
Nombre VARCHAR2(10) CONSTRAINT ejemplo1_nn1 NOT NULL,
Apellido VARCHAR2(20) NOT NULL,
Id_Cliente NUMBER (10) CONSTRAINT ejemplo1_fk REFERENCES clientes (id_cliente),
Calle VARCHAR2(20) DEFAULT ‘XX’,
Numero VARCHAR2(20) NOT NULL,
Localidad VARCHAR2(20) NOT NULL,
CONSTRAINT ejemplo1_uk UNIQUE (Nombre, Apellido)
);

CREATE TABLE Curso.Ejemplo2


(Campo1 NUMBER NOT NULL,
Campo2 VARCHAR2(10),
Campo3 DATE
);

MODIFICACION DE LA ESTRUCTURA DE UNA TABLA

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.

Sintaxis para agregar una columna

ALTER TABLE <table>


ADD ( column1 datatype [DEFAULT expr1] [NOT NULL],
Column2 datatype …
);

donde: table es el nombre de la tabla a modificar


column es el nombre de la nueva columna
datatype tipo de dato y longitud
DEFAULT para incorporarle un valor por defecto
NOT NULL agrega una constraint de campo obligatorio

Sintaxis para modificar una columna

ALTER TABLE <table>


MODIFY (column1 datatype [DEFAULT expr1] [NOT NULL],
Column2 datatype …
);

donde: table es el nombre de la tabla a modificar


column es el nombre de la nueva a modificar
datatype tipo de dato y longitud
DEFAULT para incorporarle un valor por defecto
NOT NULL agrega una constraint de campo obligatorio

- 27 -
Introducción a SQL y PL/SQL

Sintaxis para eliminar una columna

ALTER TABLE <table>


DROP (column1, Columnn …
);

donde: table es el nombre de la tabla a modificar


column es el nombre de la nueva a eliminar

Sintaxis para agregar una constraint

ALTER TABLE <table>


ADD CONSTRAINT <constraint> type (column);

donde: table es el nombre de la tabla a modificar


constraint nombre de la restricción
type tipo de constraint
column nombre de la columna/s afectada/s por la constraint

Ejemplos:

ALTER TABLE clientes


ADD (Cantidad_hijos NUMBER(2) DEFAULT 0 NOT NULL);

ALTER TABLE clientes


MODIFY (Cantidad_hijos NUMBER(3));

ALTER TABLE clientes


DROP (Cantidad_hijos);

ALTER TABLE clientes


ADD CONSTRAINT clientes_pk PRIMARY KEY (id_cliente);

ELIMINACION DE UNA TABLA

Para eliminar una tabla se utiliza el commando DROP TABLE.

Sintaxis

DROP TABLE <table> [CASCADE CONSTRAINT];

Donde: table es el nombre de la tabla a ser borrada


CASCADE CONSTRAINT elimina todas las constraints dependientes

Ejemplo:

DROP TABLE ejemplo2;

- 28 -
Introducción a SQL y PL/SQL

PERMISOS SOBRE TABLAS

Para otorgar permisos sobre una tabla se utiliza el comando GRANT. La sintaxis es la
siguiente:

GRANT (<privilegio1, privilegio2, … | ALL)


ON <objeto>
TO <usuario, rol, PUBLIC>;

Donde: privilegio es el permiso que se le va a dar. (SELECT, INSERT, etc.)


ALL significa que se otorgan todos los permisos
ON objeto al que se le va a dar permiso
TO identifica a quien se le otorgan permisos
PUBLIC Otorga privilegios sobre el objeto a todos los usuarios

Ejemplo:

GRANT Select
ON clientes
TO Scout;

Para eliminar un permiso se utiliza el comando REVOKE. La sintaxis es la siguiente:

REVOKE (<privilegio1, privilegio2, … | ALL)


ON <objeto>
FROM <usuario, rol, PUBLIC>;

Donde: privilegio es el permiso que se le va a dar. (SELECT, INSERT, etc.)


ALL significa que se otorgan todos los permisos
ON objeto al que se le va a dar permiso
FROM identifica a quien se le quitaran permisos
PUBLIC Otorga privilegios sobre el objeto a todos los usuarios

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:

 Públicos: este tipo de sinónimos se utiliza para que lo puedan


ver todos los usuarios que tengan permisos para acceder a ese
objeto. No es necesario dar permiso sobre cada objeto para que
lo puedan ver. Estos sinónimos solo los puede crear un usuario
con privilegios DBA.
 Privados: son sinónimos que solo los pueden ver el usuario que
los creó. Si o si necesita tener permiso sobre el objeto al cual se
le quiere crear el sinónimo.

Sintaxis
CREATE [PUBLIC] SYNONYM <synonym>
FRO <object>;

Donde: PUBLIC crea un sinónimo accesible por todos los usuarios


Synonym es el nombre que se le quiere dar
Object identifica el objeto para el cual se crea el sinónimo

Reglas:

 El objeto no puede estar contenido dentro de un package


 Un nombre de sinónimo privado debe ser distinto a todos los
demás objetos propios del mismo usuario.

Ejemplo Sinónimo Privado: Acceder al usuario scout. Intentar visualizar la tabla


clientes sin anteponer el dueño de la misma. Crear un sinónimo privado sobre dicho
objeto.

CREATE SYNONYM clientes


FOR [Link];

Ejemplo Sinónimo Publico: Acceder al usuario curso. Crear un sinónimo público


llamado COMPRAS_PROVEEDOR para el objeto [Link].

CREATE PUBLIC SYNONYM compras_proveedores


FOR [Link];

Eliminación de Sinónimos

Para eliminar un sinónimo se utiliza el comando DROP SYNONYM. Los sinónimos


públicos solo pueden ser eliminados con un usuario que tenga perfil DBA.

Sintaxis
DROP [PUBLIC] SYNONYM <synonym>;

- 30 -
Introducción a SQL y PL/SQL

VISTAS

Crear una Vista

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.

Ventajas de las vistas:

 Restringen el acceso a la base de datos porque la vista puede


mostrar una porción selectiva de la misma.
 Permite a los usuarios realizar una consulta simple para
recuperar datos de una consulta más compleja.
 Provee independencia de los datos para usuarios y aplicaciones.
Con una vista se pueden acceder a datos de varias tablas.

Sintaxis
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW <vista>
[(alias1, alias2, …)]
AS <subconsulta>
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];

Donde: OR REPLACE recrea la vista si ya existe


FORCE crea la vista sin importar de que exista o no la
tabla
NOFORCE verifica existencia de las tablas en la base
Vista nombre de la vista a crear
Alias alias para los campos de la subconsulta
Subconsulta query que define la vista
WITH CHECK OPTION especifica que solamente las filas accesibles a la
vista pueden ser insertadas o actualizadas
Constarint es el nombre asignado a la restricción anterior
WITH READ ONLY asegura que ninguna operación DML pueda
realizarse sobre la vista

Reglas:

 Cuando una vista es simple (contiene a una tabla y no contiene


funciones), se pueden realizar operaciones de tipo DML, es decir
que se pueden modificar datos.
 El query que se utiliza para la creación de una vista no puede
llevar la cláusula ORDER BY.
 Si no se específica el nombre de la vista, Oracle asignará un
nombre SYS_C y un número.

- 31 -
Introducción a SQL y PL/SQL

Ejemplo:

CREATE OR REPLACE VIEW clientes_RI


AS SELECT *
FROM Clientes
WHERE categoria = ‘RI’;

CREATE OR REPLACE VIEW clientes_prueba


AS SELECT a.id_cliente, b.id_factura, b.importe_neto
FROM clientes a, facturas_cab b
WHERE a.id_cliente = b.id_cliente;

Confirmación de creación:

DESC clientes_ri

DESC clientes_prueba

SELECT * FROM user_views;

Borrar una Vista

Para borrar una vista se utiliza el comando DROP VIEW.

Sintaxis
DROP VIEW <vista>;

SECUENCIAS

Crear una Secuencia

Un generador de secuencias puede ser utilizado para que automáticamente se genere


una secuencia de números para las filas de una tabla. Una secuencia es un objeto de
la base de datos creado por un usuario y puede ser compartido por otros usuarios.
Un uso típico de las secuencias es para crear un valor de Primary Key, el mismo debe
ser único para cada fila. La secuencia es generada e incrementada o decrementada
por una rutina interna de Oracle. Este tipo de objetos permite ahorrar tiempos
porque reduce y simplifica la cantidad de líneas de código de una aplicación y
también reduce los acceso a la base de datos.

Sintaxis
CREATE SEQUENCE <sequence>
[INCREMENT BY n]
[START WITH n]
[(MAXVALUE n | NOMAXVALUE)]
[(MINVALUE n | NOMINVALUE)]
[(CYCLE | NOCYCLE)]
[(CACHE n | NOCACHE)];

Donde : secuencia nombre de la secuencia a crear


INCREMENT BY n de a cuantos se va a incrementar (defecto 1)
START WITH n desde donde comienza la secuencia (defecto 1)
MAXVALUE n valor tope
MINVALUE n valor mínimo
NOMAXVALUE sin valor máximo. Valor por defecto
- 32 -
Introducción a SQL y PL/SQL

NOMINVALUE sin valor mínimo. Valor por defecto


CYCLE|NOCYCLE especifíca que la secuencia continúa generando valores
después de haber alcanzado su valor máximo o su valor mínimo o bien no
genera adicionales. (defecto NOCYCLE)
CACHE|NOCACHE especifica cuantos valores serán preasignados y
mantenidos en memoria por el servidor de Oracle. Por defecto es de 20
valores.

Ejemplo:

CREATE SEQUENCE sq_clientes_id


INCREMENT BY 1
START WITH 5000
(NOMAXVALUE)
(NOMINVALUE);

Confirmación de creación:

SELECT sequence_name, min_value, max_value, increment_by, last_number


FROM user_sequences;

Uso de las secuencias

Para la utilización de las secuencias existen dos pseudocolumnas. Entonces tenemos


NEXTVAL y a CURRVAL. La primera nos especifíca un nuevo número de secuencia e
incrementa al secuenciador. La segunda nos dice cual es el último valor generado.

Sintaxis

<secuencia>.NEXTVAL
<secuencia>.CURRVAL

Reglas para el uso de NEXTVAL y CURRVAL:

 Se puede utilizar en sentencias SELECT, UPDATE e INSERT.


 No se puede utilizar en una vista
 No se puede utilizar con la cláusula DISTINCT
 No se puede utilizar en subconsultas
 No se puede utilizar en las cláusulas GROUP BY, ORDER BY y
HAVING
 No se puede utilizar en la expresión DEFAULT de los comandos
CREATE TALBE y ALTER TABLE.

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

Modificar una secuencia

Para modificar una secuencia se utiliza el commando ALTER SEQUENCE.

Sintaxis
ALTER SEQUENCE <secuencia>
[INCREMENT BY n]
[START WITH n]
[(MAXVALUE n | NOMAXVALUE)]
[(MINVALUE n | NOMINVALUE)]
[(CYCLE | NOCYCLE)]
[(CACHE n | NOCACHE)];

Donde : secuencia nombre de la secuencia a modificar


INCREMENT BY n de a cuantos se va a incrementar (defecto 1)
START WITH n desde donde comienza la secuencia (defecto 1)
MAXVALUE n valor tope
MINVALUE n valor mínimo
NOMAXVALUE sin valor máximo. Valor por defecto
NOMINVALUE sin valor mínimo. Valor por defecto
CYCLE|NOCYCLE especifíca que la secuencia continúa generando valores
después de haber alcanzado su valor máximo o su valor mínimo o bien no
genera adicionales. (defecto NOCYCLE)
CACHE|NOCACHE especifica cuantos valores serán preasignados y
mantenidos en memoria por el servidor de Oracle. Por defecto es de 20
valores.

Borrar una secuencia

Para borrar una secuencia se utiliza el comando DROP SEQUENCE.

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.

Los índices pueden ser creados de dos maneras:

 Automáticamente: un índice único es creado cuando se define


una constraint PRIMARY KEY o UNIQUE en el momento de
creación de la constraint.
 Manualmente: los usuarios pueden crear índices manualmente
para las columnas de una tabla.

- 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

CREATE UNIQUE INDEX IDX_facturas_cab_UK


ON curso.facturas_cab (id_factura);

CREATE INDEX IDX_facturas_cab_01


ON curso.facturas_cab (id_cliente);

¿Cuándo crear un índice?

 Cuando una columna es usada frecuentemente en una cláusula


WHERE o en una condición de JOIN.
 Cuando la columna tiene un amplio rango de valores.
 Cuando la columna contiene un amplio rango de valores en nulo.
 Cuando dos o más columnas son usadas juntas en una cláusula
WHERE o en una condición de JOIN.
 Cuando la tabla es grande y se espera que la mayoría de las
consultas recuperen menos del 2 al 4% de las filas.

¿Cuándo no crear un índice?

 Cuando la tabla es pequeña


 Cuando las columnas no son usadas con fecuencia en
condiciones de consultas
 Cuando se espera que la mayoría de las consultas recuperen
más del 2 al 4% de las filas
 Cuando la tabla es actualiza frecuentemente

Confirmación de la creación de un índice:

SELECT b.index_name, b.column_name, b.column_position col_pos,


[Link]
FROM user_indexes a, user_ind_columns b
WHERE a.index_name = b.index_name
AND b.table_name = ‘FACTURAS_CAB’;

- 35 -
Introducción a SQL y PL/SQL

Eliminación de un índice

DROP INDEX <nombre del índice>

PROCESAMIENTO DE TRANSACCIONES

El servidor de Oracle asegura consistencia de los datos basándose en transacciones.


Las transacciones otorgan más flexibilidad y control cuando cambian los datos y
aseguran consistencia en los datos ante una eventual falla del sistema.
Las transacciones consisten en comandos DML que llevan a cabo un cambio en los
datos de manera consistente.

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

¿Cuándo comienza y cuando finaliza una transacción?

Una transacción comienza cuando se encuentra el primer comando SQL ejecutable y


finaliza cuando ocurre una de las siguiente opciones:

 Un comando COMMIT o ROLLBACK


 Un comando DDL, tal como CREATE o un comando DCL.
 Se detectan errores de base de datos
 El usuario finaliza una sesión de SQL*Plus
 Una falla o caída del sistema

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

Parámetros por posición

Se utilizan cuando sabemos, desde el SQL, en que lugar vienen posicionados los
parámetros.

Ejemplo: Archivo [Link]

SELECT *
FROM clientes
WHERE id_cliente = &1
AND categoria = &2;

Ejecución: @[Link] 1 ´RI´

Parámetros por nombre

Se utilizan cuando no sabemos la posición en que vienen los parámetros, entonces


se utilizan nombres para reconocerlos.

Ejemplo: Archivo [Link]

SELECT *
FROM clientes
WHERE id_cliente = &id_del_cliente
AND categoria = &categoria_del_cliente;

Ejecución: @[Link] 1 ´RI´

COMANDO SPOOL

El comando spool tiene por objetivo grabar la salida de uno o varios queries a un
archivo. La sintaxis es la siguiente:

Spool <path><nombre salida>


… ejecución de uno o más queries
spool off

La extención por defecto es .lst. Si se necesita utilizar otra se debe especificar.

- 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, …);

Donde: tabla es el nombre de la tabla en la que se insertara el registro


Columna es la columna de la tabla.
Dato es el valor que va a llevar cada columna

Ejemplo

INSERT INTO CLIENTES (id_cliente,


Razon_social,
Apellido_responsable,
Nombre_responsable,
Cumple_responsable)
VALUES (1500,
‘Accenture’,
‘Accenture’,
‘Jose’,
TO_DATE(’10-10-1960’, ‘DD-MM-YYYY’));

Ejemplo con parámetros

INSERT INTO PRODUCTOS


VALUES (&id,
‘&nombre’,
&id_proveedor);

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>];

donde: tabla tabla en la que se actualizaran los datos


- 38 -
Introducción a SQL y PL/SQL

columna campo de la tabla que se va a actualizar


valor nuevo valor para el campo
condición delimitador de la actualización
Ejemplo

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>];

Donde: tabla tabla de la que se elminarán los registros


Condición delimitador de la eliminación

Ejemplo

DELETE FROM facturas_cab


WHERE cantidad_elementos = NULL;

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.

¿Cuáles sentencias están permitidas?

 SELECT
 UPDATE
 CREATE (tablas o vistas)
 DELETE
 INSERT

¿Qué operadores están permitidos?

 EXISTS
 NOT EXISTS
 IN
 NOT IN
 Operadores lógicos (=, <, >, <=, >=, <>)

- 39 -
Introducción a SQL y PL/SQL

Reglas para su uso:


 Para poder ejecutar un subquery es necesario que el mismo esté
entre paréntesis
 Al momento de ejecutar un query que contiene un subquery,
primero se ejecuta el subquery y luego el query en sí
 Un subquery puede retornar una o más filas o columnas
 Un subquery puede ser usado en múltiples condiciones dentro de
un WHERE
 Un subquery puede ser usado en una cláusula FROM
 Un subquery puede ser usado en una cláusula HAVING
 Un subquery no puede ser utilizado en la cláusula SELECT
 Un subquery no puede llevar un ORDER BY

Tipos de subconsultas:
 Single Row
 Multiple Row
 Multiple column
 Carrelated

Single Row

Es un subquery que retorna un solo valor. Existen 6 operadores permitidos: =, <>,


>, <, >, >=, <=.

Ejemplo de SELECT: Recuperar el cliente con mayor edad.

SELECT apellido, nombre, cumple_responsable


FROM clientes
WHERE cumple_responsable =
(SELECT min(cumple_responsable)
FROM clientes);

Ejemplo de UPDATE: Actualizar el nombre del cliente de mayor edad, concatenarle la


fecha de cumpleaños a la derecha del nombre.

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.

CREATE TABLE clientes2 AS


SELECT *
FROM clients
WHERE cumple_responsable =
(SELECT min(cumple_responsable)
FROM cliente);

- 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.

INSERT INTO clientes2


SELECT *
FROM clientes
WHERE cumple_responsable <>
(SELECT min(cumple_responsable)
FROM cliente);

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.

SELECT apellido_responsable, nombre_responsable


FROM clientes
WHERE nombre_responsable IN (
SELECT nombre_responsable
FROM clientes
WHERE nombre_responsable IN (‘Diego’, ‘Pedro));

Ejemplo de operador NOT IN: Recuperar los clientes que no tengan facturas.

SELECT apellido_responsable, nombre_responsable


FROM clientes
WHERE id_cliente NOT IN (
SELECT id_cliente
FROM facturas_cab);

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.

SELECT apellido_responsable, nombre_responsable, cumple_responsable


FROM clientes
WHERE (id_cliente, to_char(cumple_responsable, ‘ddmm’)) IN
(SELECT id_cliente, to_char(fecha_factura, ‘ddmm’)
FROM facturas_cab);

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

Un subquery puede ser indentificado como correlative cuando en el subquery se hace


referencia a una columna del query principal. Para estos casos tanto las tablas del
subquery como las del Quero principal deben llevar alias.

Ejemplo con operador IN: Recuperar las facturas de cada cliente, los cuales hayan
tenido descuentos.

SELECT id_factura, id_cliente, importe_descuento, importe_neto


FROM facturas_cab A
WHERE id_factura IN
(SELECT id_factura
FROM facturas_det B
WHERE A.id_cliente = B.id_cliente
AND importe_descuento > 0);

Ejemplo con operador EXISTS: Recuperar los clients que tengan facturas.

SELECT apellido_responsable, nombre_responsable


FROM clientes A
WHERE EXISTS
(SELECT 1
FROM facturas_cab B
WHERE A.id_cliente = B.id_cliente);

- 42 -
Introducción a SQL y PL/SQL

FORMATOS DE SALIDA

Formato general del archivo

La estructura general de un archivo .sql es la siguiente:

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:

SET <valor> <expresión>

Donde: valor variable de ambiente SQL*PLUS que se quiere


modif.
Expresión es el nuevo valor que va a llevar

- 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

COLUMN <campo | alias > FORMAT <expresión> [valores]

Donde: campo|alias es la columna recuperada en el SELECT del SQL


Expresión es el formato en sí
Valores demás formatos que se le pueden definir a esa columna

Definición de Títulos

Para la utilización de títulos se utiliza el comando TTITLE. La sintaxis es la siguiente:

Sintaxis

TTITLE [RIGHT | CENTER | LEFT ] <texto entre ‘ ‘ > -


SKIP n [RIGHT | CENTER | LEFT ] <texto entre ‘ ‘ >

Donde: right|center|left es la alineación que va a tener


- es el separador de renglones
SKIP n cantidad de renglones que va a saltar
después del título

- 44 -
Introducción a SQL y PL/SQL

Definición de cortes

Determina los saltos de páginas o renglones en un reporte. Los renglones se


concatenan con el carácter.

Sintaxis

BREAK ON <campo> SKIP <n o PAGE>

Donde: campo campo por el cual se va a hacer corte


SKIP n o PAGE especifica la cantidad de renglones a saltar o corte de
página

Comando PROMPT

Determina una leyenda que sale en SQL*PLUS. El mismo no se imprime en el archivo


de salida.

Sintaxis

PROMPT <texto>

Donde: texto es texto libre a escribirse

Comando COMPUTE

Sintaxis

COMP[UTE] [funcion]
OF [columna o alias]
ON [REPORT o ROW]

Donde: función es la función que se va a realizar (suma, cuenta,


etc)
OF columnas sobre las que se va a realizar la operación
ON define los cortes de la operación

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

/* área de declaración de formatos de columnas y títulos */


TTITLE CENTER ‘Listado de Clientes y Facturas’ –
SKIP 2 LEFT ‘Se listaron todos los meses’
COLUMN id_cliente FORMAT 9999999 HEADING ‘Nro Cliente’
COLUMN id_factura FORMAT 9999999 HEADING ‘Nro Factura’
COLUMN ff FORMAT A10 HEADING ‘Fecha Fact.’
COLUMN importe_neto FORMAT 9999999.99 HEADING ‘Importe’

/* area de declaración de cortes */


BREAK ON id_cliente SKIP page

/* area de declaración de computos */


COMPUTE SUM OF importe_neto ON id_cliente

/* Creación del spool */


Spool c:\temp\prueba_salida.txt

/* 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

PL/SQL es una extensión de SQL que incorpora muchas características de lenguajes


de programación modernos. Permite manipular datos, declarar variables, interactuar
con SQL hacia la base de datos, dividir los programas en bloques, etc.

Beneficios al utilizar PL/SQL

 Modularización en el desarrollo de programas


o Agrupar sentencias que tengan algo en común en bloques
o Poder anidar bloques
o Particionar programas complejos en pequeños bloques bien definidos y
manejables

 Declaración de Identificadores
o Declarar variables simples, complejas, constantes, cursores,
excepciones

 Programación con estructuras de control


o Permite sentencias condicionantes, ciclos (loop) y combinaciones entre
ellas

 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.

Tipo programa Descripción Uso


Bloque anónimo Bloque PL/Sql sin nombre Todos los ambientes de
PL/SQL
Función de base Programa almacenado en la Todos los ambientes de
base de datos SQL
Procedimiento de base Programa almacenado en la Todos los ambientes de
base de datos SQL
Función de aplicación Programa construido en una Solo en la herramienta
aplicación Oracle en que se desarrolló
Procedimiento de Programa construido en una Solo en la herramienta
aplicación aplicación Oracle en que se desarrolló
Package Programa almacenado en la Todos los ambientes SQL
base de datos
Trigger de base Programa almacenado en la Todos los ambientes SQL
base de datos
Trigger de aplicación Programa construido en una Solo en la herramienta
aplicación Oracle en que se desarrolló
Programa Programa almacenado en un Solo en SQL*Plus
independiente archivo de extensión .sql

Bloques de PL/SQL

Un bloque de PL/SQL puede, a lo sumo, estar formado por tres partes.

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

Sección Descripción Inclusión


Declarativa Contiene todas las variables, constantes, cursores Opcional
y excepciones definidas por el usuario que serán
referenciadas dentro de la sección ejecutable
Ejecutable Contiene sentencias SQL para manipular datos en Obligatoria
la base y sentencias PL/SQL para manipular datos
dentro del bloque
Manejo de Especifica las acciones que se van a tomar ante la Opcional
Errores aparición de un error

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.

Ejemplo de archivo PL/SQL

DECLARE

v_primera NUMBER(2);
v_segunda NUMBER(2);
v_resultado NUMBER(2);

BEGIN

v_resultado: v_primera + v_segunda;

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>)

Donde mensaje puede ser cualquier texto. Admite el uso de funciones

Declaración de variables

En PL/SQL es necesario que se declaren todas las variables o constantes que se van a
utilizar.

Sintaxis

<nombre> [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];

Donde: nombre es el nombre de la variable


CONSTANT especifíca si es una constante. Opcional
Datatype tipo de dato y tamaño
NOT NULL define si es obligatorio. Opcional
:= valor inicial de la variable. Constante
DEFAULT expr Valor inicial de la variable. Expresión

Los nombres de las variables no deben ser mayores a 30 caracteres. El primer


carácter debe ser una letra y el resto pueden ser números, letras o símbolos
especiales.

Tipos de datos

PL/SQL soporta todos los tipos de datos que utiliza SQL.

Tipo de datos Descripción


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
VARCHAR2(s) Carácter de longitud variable de tamaño máximo s. La
longitud mínima es 1 y la máxima es 2000
DATE Fecha y hora entre el 1 de enero de 4712 A.C. y el 31 de
diciembre de 4712 D.C.
CHAR (s) Carácter de longitud fija de tamaño s. La longitud mínima
es 1 y la máxima es 255
LONG Valores de tipo carácter de longitud variable de hasta 2
Gbytes. Se permite solo una columna tipo LONG por
tabla
RAW y LONG RAW Equivalente a VARCHAR2 y LONG respectivamente, pero
usados para almacenamiento orientado a byte o datos
binarios.

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

<nombre variable> <tabla>.<campo>%TYPE;

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;

Asignar valores a variables

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

<nombre variable>:= <valor nuevo>;

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:

 Funciones numéricas de una fila


 Funciones de carácter
 Funciones de conversión de datos
 Funciones de fecha y hora
 Combinación de funciones
 Operaciones aritméticas

Las funciones de grupo no están permitidas en la asignación de valores de PL/SQL.

INTERACCION CON LA BASE DE DATOS

Cuando se necesita extraer información o aplicar cambios a la base de datos, se debe


utilizar el lenguaje SQL. Para ello PL/SQL soporta dicho lenguaje.

Comandos SQL incluidos:

 Obtención de datos utilizando el comando SELECT.


 Modificación de datos utilizando comandos DML (UPDATE,
INSERT, etc.)
 Control de transacciones mediante COMMIT y ROLLBACK.

Recuperando datos con PL/SQL

Para recuperar datos se utiliza la sentencia SELECT, la cual va a contener una


cláusula obligatoria llamada INTO.

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, ..;

Donde: variable variable creada para recuperar los datos

- 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;

Manipulando datos con PL/SQL

Para manipular datos se utiliza las siguientes sentencias:

 Para actualizar registros se utiliza UPDATE


 Para agregar nuevos registros se utiliza INSERT
 Para eliminar registros se utiliza DELETE

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

Se puede cambiar el flujo lógico de sentencias PL/SQL mediante el uso de estructuras


de control.
Existen dos tipos de estructuras de control:

 Estructura de control condicionales con la sentencia IF


 Estructura de control de ciclos
o LOOP básico repite una sentencia o una serie de sentencias
indefinidamente
o LOOP FOR repite una sentencia o una serie de sentencias un número
fijo de veces basado en un contador
o LOOP WHILE repite una sentencia o una serie de sentencias hasta que
la condición deja de ser verdadera
- 54 -
Introducción a SQL y PL/SQL

o La sentencia EXIT termina con la ejecución de cualquier loop

Sentencia IF

Permite realizar acciones en forma selectiva, dependiendo del cumplimiento de las


condiciones. Una condición puede estar compuesta por más de una sub-condición y
las mismas deben estar separadas por los operadores lógicos AND y OR.

Sintaxis

IF condicion THEN
Sentencias;
[ELSIF condicion THEN
Sentencias;]
[ELSE
Sentencias;]
END IF;

Ejemplo

IF v_categoria = ‘RI’ THEN


v_ri:= v_ri + 1;
ELSIF v_categoria = ‘RNI’ THEN
v_rni:= v_rni + 1;
ELSE
v_nc:= v_nc + 1;
END IF;

LOOP Básico

Es el tipo de ciclos más simples, que consiste en una secuencia de sentencias


encerradas entre los delimitadores LOOP y END LOOP. Para evitar que este tipo de
LOOPs entre en un ciclo infinito se puede utilizar la sentencia EXIT.

Sintaxis

LOOP
Sentencias;
Sentencias;

EXIT [WHEN condicion]
END LOOP;

Donde: WHEN se utilize para condicionar la salida.

- 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;

EXIT WHEN v_contador = 20000;


END LOOP

END;

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

FOR index IN [REVERSE] inicio..fin LOOP


Sentencias;
Sentencias;

END LOOP;

Donde: index es un valor entero que se incrementa


automáticamente hasta alcanzar el valor de “fin”. No es necesario declarar la
variable index.
REVERSE indica que el ciclo va del “fin” al “inicio”
Inicio límite inferior
Fin límite superior

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

WHILE condición LOOP


Sentencias;
Sentencias;

END LOOP;

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

Cuando ejecutamos una sentencia SELECT, Oracle genera un arreglo de datos y lo


guarda en un buffer hasta que termina su ejecución y luego lo perdemos. PL/SQL nos
permite que manipules dicho arreglo sin perderlo. Para manipularlo se utilizan
cursores.

Los cursores se declaran como variables y luego en la zona de sentencias se lo abre,


se lo utiliza y se lo cierra.

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

Donde: nombre es el nombre con el que se va a invocar al cursor


OPEN se utiliza para abrir el cursor
FETCH pasa los campos seleccionados en el SELECT a variables
CLOSE se utiliza para cerrar el cursor.

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;

Cursores con Loops FOR

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;

Donde i es el nombre del registro a recuperar.

- 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

PL/SQL permite el manejo de errors mediante excepciones, que son identificadores


propios de Oracle que se disparan cuando la ejecución de un bloque termina con
algún error o cuando se defina que se ejecute una excepción.

PL/SQL permite capturar dichas excepciones con el objeto de que no se vea


interrumpida la ejecución de un programa. Un bloque de PL/SQL (BEGIN…END) puede
contener un solo grupo de excepciones.

Existen tres tipos de excepciones:

 Errores predefinidos por Oracle: son errores frecuentes.


 Errores no predefinidos por Oracle: son el resto de los errores no
frecuentes.
 Errores definidos por el usuario: una condición que el
programador decide que no es normal.

Sintaxis
EXCEPTION
WHEN excepcion1 [OR excepcion2] THEN
Sentencias;
WHEN excepcion2 [OR excepcion3] THEN
Sentencias;
WHEN …

Donde excepción es el nombre de la excepción predefinida


Sentencias acciones a seguir para esa excepción.

- 59 -
Introducción a SQL y PL/SQL

Excepciones definidas:

Nombre Nro. Error Descripción


NO_DATA_FOUND ORA-01403 Es cuando un SELECT no devuelve datos
TOO_MANY_ROWS ORA-01422 Es cuando un SELECT INTO devuelve más de
un registro
INVALID_CURSOR ORA-01001 Cuando se hace referencia a un cursor que
no esta abierto
ZERO_DIVIDE ORA-01476 Cuando se divide por cero
DUP_VAL_ON_INDEX ORA-00001 Cuando se intenta insertar un valor duplicado
ante un índice UNIQUE
OTHERS Contempla el resto de los errores

Existen variables que devuelven el código y descripción de un error:

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.

CREATE OR REPLACE PROCEDURE [Link]


(param1 IN|OUT datatype,
Param2 … ) IS
<declaración de variables>
BEGIN
<sentencias>
END;

Donde: [Link] es el nombre del procedimiento y el dueño


Paramn son los parámetros de entrada/salida
IN define un parámetro como de entrada
OUT define un parámetro como de salida
IN OUT define un parámetro como de entrada/salida
Datatype tipo de dato del parámetro

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.

CREATE OR REPLACE FUNCTION [Link]


(param1 IN datatype,
Param2 …) RETURN datatype IS
<declaración de variables>
BEGIN
<sentencias>
RETURN <salida>
END;

Donde: [Link] es el nombre de la función y el dueño


Paramn son los parámetros de entrada
Datatype tipo de dato del parámetro
RETURN datatype define el tipo de dato de la salida
RETURN salida es la salida en si y es obligatorio

- 61 -
Introducción a SQL y PL/SQL

EJERCICIOS

1. Recuperar el id de la factura, la fecha de la factura y el importe


neto de la cabecera de la factura. Editar el query y grabarlo bajo
el nombre clase_1.sql
2. Recuperar el nombre del proveedor y la dirección de la tabla de
proveedores. Editar el query y grabarlo bajo el nombre
clase_2.sql
3. Recuperar el id de la factura, la fecha de la factura, el importe
bruto, el importe de descuento y el importe neto de la cabecera
de la factura. Todos los campos deben estar separados por el
carácter ‘*’. Editar el query y grabarlo bajo el nombre
clase_3.sql
4. Recuperar todos los campos de la tabla de detalle de factura
separados por ‘;’. Editar el query y grabarlo bajo el nombre
clase_4.sql
5. Recuperar las localidades de la tabla de proveedores. Luego
recuperar solo las distintas. Editar el query y grabarlo bajo el
nombre clase_5.sql
6. Recuperar los distintos id de clientes de la cabecera de factura.
Editar el query y grabarlo bajo el nombre clase_6.sql
7. Ordenar alfabéticamente los proveedores por nombre y
localidad. Luego ordenarlos por localidad y nombre. Realizar el
mismo ejercicio de manera ascendente y descendente. Editar el
query y grabarlo bajo el nombre clase_7.sql
8. Recuperar el id de la factura, la fecha y el importe neto
ordenado descendentemente por importe de factura. Editar el
query y grabarlo bajo el nombre clase_8.sql
9. Recuperar los id de factura, id de producto e importe neto del
detalle de factura cuando el producto sea 100. Editar el query y
grabarlo bajo el nombre clase_9.sql
10. Recuperar los proveedores (todos los datos) de Capital federal.
Editar el query y grabarlo bajo el nombre clase_10.sql
11. Recuperar los id de cliente y razón social de la tabla de clientes
cuyos números de clientes sean 2, 4, 6, 8 y 10. Editar el query y
grabarlo bajo el nombre clase_11.sql
12. Recuperar el id de factura, el id de producto e importe neto del
detalle de factura cuando el producto sea 100, 200 y 300. Editar
el query y grabarlo bajo el nombre clase_12.sql
13. Recuperar los id de clientes, la razón social y la categoría de
todos aquellos clientes cuya categoría comience con ‘R’. Editar el
query y grabarlo bajo el nombre clase_13.sql
14. Recuperar todos los proveedores cuyo segundo carácter del
nombre sea ‘E’. Editar el query y grabarlo bajo el nombre
clase_14.sql
15. Recuperar los id de cliente, la razón social y el cumpleaños de
todos aquellos clientes cuyo cumpleaños este entre 01-01-1970
y el 01-01-1980. Editar el query y grabarlo bajo el nombre
clase_15.sql
16. Recuperar todos los productos cuyo id de producto se encuentre
entre 1000 y 2000. Editar el query y grabarlo bajo el nombre
clase_16.sql
17. Recuperar apellido, nombre, cumpleaños y categoría de todos
aquellos clientes que tengan categoría ‘RI’ (responsable

- 62 -
Introducción a SQL y PL/SQL

inscripto) y que hayan nacido después del año 1962. Editar el


query y grabarlo bajo el nombre clase_17.sql
18. Recuperar todos aquellos productos (todos los campos) cuyos id
de proveedor sea 1000 y que el nombre del producto comience
con ‘A’. Editar el query y grabarlo bajo el nombre clase_18.sql
19. Recuperar los id de cliente que tengan informado el número de
cuit y que la categoría sea Responsable NO inscripto. Editar el
query y grabarlo bajo el nombre clase_19.sql
20. Recuperar la razón social, id del cliente entre paréntesis, el id de
factura, fecha de factura, importe neto de todos los clientes que
tengan facturas. Editar el query y grabarlo bajo el nombre
clase_20.sql
21. Recuperar el id de la factura, el id del cliente, el importe neto de
la cabecera, el id del producto y el importe neto del detalle.
Separa los campos por ‘;’ y colocarle como título “Facturas
Emitidas”. Editar el query y grabarlo bajo el nombre clase_21.sql
22. Recuperar el id del cliente, el nombre del cliente, el id de factura
y el importe neto de todos los clientes que tengan facturas y
cuyo nivel de venta sea 1. Editar el query y grabarlo bajo el
nombre clase_22.sql
23. Recuperar el nombre del proveedor con el id de proveedor
concatenado entre paréntesis y el nombre del producto con el id
del producto entre paréntesis. Recuperar todos los proveedores,
tengan o no producto. Editar el query y grabarlo bajo el nombre
clase_23.sql
24. Recuperar el id del cliente, la razón social y el id de factura, la
fecha de la factura, el id del producto y el importe neto del
detalle de la factura, el nombre del producto y el nombre del
proveedor con su id correspondiente entre paréntesis. Recuperar
solamente los datos cuyos proveedores sean de Capital Federal.
Editar el query y grabarlo bajo el nombre clase_24.sql
25. Recuperar un listado de proveedores. El nombre en mayúsculas,
la dirección en minúsculas y a la localidad concatenarle adelante
la cadena de caracteres “LOCALIDAD: “ y mostrar solo las
primeras palabras en mayúsculas. Solo traer proveedores de
Capital Federal. Editar el query y grabarlo bajo el nombre
clase_25.sql
26. Recuperar los productos que comiencen con”P”. Editar el query y
grabarlo bajo el nombre clase_26.sql
27. Recuperar las cabeceras de facturas (id de factura, id del cliente,
importe neto y cantidad de elementos). Si alguno de los valores
no existe (nulo) informar 999. Editar el query y grabarlo bajo el
nombre clase_27.sql
28. Recuperar el owner, el nombre de las tablas y el ancho del
nombre. Utilizar la tabla de todas las tablas. Ordenarlo de mayor
a menor. Editar el query y grabarlo bajo el nombre clase_28.sql
29. Recuperar de las cabeceras de factura el id de factura, id del
cliente, importe neto, el 10.5% del importe neto (título:
“Comisión base”), el 10.5% del importe neto redondeado y
multiplicado por el resto de dividirlo por 1234 (título: “Comisión
1”) y el mismo porcentaje truncado (título: “Comisión 2”). Editar
el query y grabarlo bajo el nombre clase_29.sql
30. Calcular cuantos días faltan hasta fin de año. Editar el query y
grabarlo bajo el nombre clase_30.sql

- 63 -
Introducción a SQL y PL/SQL

31. Calcular cuantos días han pasado desde su cumpleaños y


cuantos faltan hasta para el próximo. Editar el query y grabarlo
bajo el nombre clase_31.sql
32. Calcular cuantos meses han pasado desde su cumpleaños y
cuantos faltan hasta para el próximo. Editar el query y grabarlo
bajo el nombre clase_32.sql
33. Sumar a la fecha de hoy 125 días e informar el último día de ese
mes. Editar el query y grabarlo bajo el nombre clase_33.sql
34. Recuperar el id del cliente, la razón social, el id de la factura, la
fecha de la factura (formato dd-mm-yyyy), el importe bruto, el
importe de descuentos, el importe neto (con el signo $ y dos
decimales) y una columna con la fecha 20 de Julio de 2003.
Editar el query y grabarlo bajo el nombre clase_34.sql
35. Pasar a formato texto el resultado de dividir -1234 por 5678.
Colocar el signo $, usar 2 decimales y colocarle el signo – si es
negativo. Editar el query y grabarlo bajo el nombre clase_35.sql
36. Crear una tabla de igual estructura que la de clientes que
contengan: clientes cuyo cuit este informado, clientes que
tengan factura con fecha de enero del 2003. Clientes cuya
categoría sea responsable inscripto y responsable no inscripto.
Editar el query y grabarlo bajo el nombre clase_36.sql
37. Sobre la tabla creada en el punto 36 eliminar el cliente no
inscripto de mayor edad. Editar el query y grabarlo bajo el
nombre clase_37.sql
38. Sobre la tabla creada insertar clientes (desde la tabla de clientes
con categoría “Sujeto no categorizado” y con fecha de
nacimiento anterior al 01-01-1970. Editar el query y grabarlo
bajo el nombre clase_38.sql
39. Sobre la tabla creada recuperar todos los clientes que sean
“Sujetos no categorizados” y que no tengan facturas. Editar el
query y grabarlo bajo el nombre clase_39.sql
40. Armar una consulta que informe cuales son los clientes
“Responsables No Inscripto” que figuran en la tabla clientes y no
existen en la tabla creada en el punto 36. Editar el query y
grabarlo bajo el nombre clase_40.sql
41. Listar todos los productos con su precio unitario que figuran en
el detalle de la factura de los clientes (de la tabla creada).
Informar el nombre de los mismos. Solo debe seleccionarse los
productos de los proveedores de Capital Federal. Editar el query
y grabarlo bajo el nombre clase_41.sql
42. Listar todas las facturas con los siguientes datos: fecha de
factura, importe bruto, descuento y neto. Deben tener en el
detalle, nro de orden mayor a 100 y solo se deben tomar los
códigos que estén entre 100 y 300. Editar el query y grabarlo
bajo el nombre clase_42.sql
43. Informar cuales son los productos que no figuran en ninguna
factura y cuyos proveedores son de Capital Federal.
44. Infornar cuales son los productos que se vendieron en el mes
vigente. Editar el query y grabarlo bajo el nombre clase_44.sql
45. Listado de clientes que solo poseen una factura y que la misma
esté vinculada con proveedores de Capital Federal. Editar el
query y grabarlo bajo el nombre clase_45.sql

- 64 -
Introducción a SQL y PL/SQL

TABLAS DE NUESTRO CURSO

- 65 -

También podría gustarte