100% encontró este documento útil (2 votos)
3K vistas

Curso SQL PLSQL

Este documento presenta los temas de un curso sobre SQL y SQL*Plus. Entre los temas se incluyen introducciones a Oracle y SQL*Plus, objetos de base de datos como tablas y vistas, tipos de datos SQL, creación y modificación de tablas, índices, y consultas básicas y avanzadas. También cubre conceptos como transacciones, funciones, y la recuperación de datos de tablas y vistas.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (2 votos)
3K vistas

Curso SQL PLSQL

Este documento presenta los temas de un curso sobre SQL y SQL*Plus. Entre los temas se incluyen introducciones a Oracle y SQL*Plus, objetos de base de datos como tablas y vistas, tipos de datos SQL, creación y modificación de tablas, índices, y consultas básicas y avanzadas. También cubre conceptos como transacciones, funciones, y la recuperación de datos de tablas y vistas.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 214

SQL*Plus y

SQL
Temas del Curso
• Introducción a Oracle
• Objetos de la base de datos
• Terminología
• Dos Tipos de ordenes SQL
• SQL*Plus a Introducción
• Seleccionando columnas
• Seleccionando renglones
• Visualizando el diccionario de datos
• Nomenclatura para la creación de tablas y vistas
• Tipos de datos
• Constraints
• Creación de Tablas
• Modificación de Tablas
Temas del Curso
Continuación:...
• Definición de vistas
• Creación de vistas
• Vistas con alias para columnas
• Creación de vistas con WHIT CHECK OPTION
• Accesos a tablas y vistas
• Otorgando privilegios a tablas y vistas
• Sinónimos
• Creación de sinónimos
• Eliminar privilegios: REVOKE
• Índices
• Reglas para la creación de índices
• Creación de índices
• Eliminando índices
Temas del Curso
Continuación:...
• Tablas del diccionario de datos para índices
• Creación de secuencias
• Insertando datos
• Actualizando datos
• Borrando datos
• Proceso de transacciones
• Valores y funciones numéricas
• Referencia a valores y funciones numéricas
• Valores y funciones de fechas
• Referencia a valores y funciones de carateer
• Otras funciones
• Funciones de grupo
Temas del Curso
Continuación:...
• Comandos de SQL*Plus
• Creación de un archivo de reporte
• Consultas avanzadas
• Subconsultas
Introducción a Oracle
 Objetos de la base de datos:
­ TABLE: Objeto de la base de datos que almacena los
datos.
­ VIEW: Permite ver una selección personalizada de una o
más tablas, utilizando una consulta SQL que se
almacena en la base de datos.
­ INDEX: Permite el acceso rápido a los datos en las
tablas.
­ SYNONYM: Es un nombre alternativo de un objeto de
base de datos
­ SEQUENCE: Genera números consecutivos, se puede
mantener la integridad de los datos.
Objetos de la base de datos
­ DATA DICTIONARY: Conjunto de tablas y vistas en las
cuales Oracle contiene información sobre las tablas
creadas por los usuario.
­ ROLE: Conjunto de privilegios que se agrupan y
conceden a los usuarios.
­ DATABASE LINK: Referencia a una base de datos
remota.
Terminología
 DDL (Data Definition Languaje) . Sentencias SQL
que se usan para la creación de objetos en la
base de datos y para la administración de estos
(CREATE, ALTER, GRANT)
 DML (Data Manipulation Languaje). Sentencias
SQL usadas para la manipulación de datos
(INSERT, UPDATE, DELETE).
 COMMIT: Guarda los registros en la base de
datos.
 ROLLBACK: Acción que realiza Oracle cuando se
realizan modificaciones a la base de datos y
luego se decide no guardar esta acción en la
base de datos.
Terminología
 QUERY: Recuperar o consultar información de la
base de datos.
 Programs Units: Las funciones son
operaciones que se realizan sobre los datos y
que modifican sus características.
 CONSTRAINTS: Reglas de integridad que se
deben cumplir para los datos que se almacenan
en la base de datos, existen diferentes reglas de
integridad dependiente de los requerimientos
del negocio.
Dos tipos de ordenes SQL
 Las dos principales categorías de ordenes son: el
DDL (Data Definition Languaje) y el DML (Data
Manipulation Languaje)
 DDL ** ESTRUCTURAS**
­ La creación de un objeto de base de datos
­ La eliminación de un objeto de base de datos
­ La modificación de un objeto de la base de datos
­ La concesión de privilegios sobre un objeto de la base
de datos
­ La revocación de privilegios sobre un objeto de la base
de datos.
Dos tipos de ordenes SQL
 ALTER TABLE
­ Añade una columna, modifica una columna.
 ALTER TABLE ADD CONSTRAINT
­ Añade un constraint a una tabla existente
 CREATE TABLE
­ Crea una tabla.
 CREATE INDEX
­ Crea un índice.
 DROP TABLE
­ Elimina un tabla de la base de datos.
 DROP INDEX
­ Elimina un índice.
Dos tipos de ordenes SQL
 GRANT
­ Otorga privilegios o roles a un usuario o a otro rol.
 TRUNCATE
­ Borra todas los registros de una tabla datos y libera
espacio.
 REVOKE
­ Elimina los privilegios de un usuario o de un rol.
Dos tipos de ordenes SQL
 DML
­ Permite insertar, actualizar, borrar y seleccionar datos
de la base de datos
 INSERT
­ Inserta registros a una tabla
 DELETE
­ Borra registros de una tabla
 UPDATE
­ Modifica registros de una tabla
 SELECT
­ Recupera registros de una tabla o vista
Dos tipos de ordenes SQL
 COMMIT
­ Guarda los datos en la base de datos.
 ROLLBACK
­ Finaliza la transacción sin guardar los datos en la base
de datos.
SQL*Plus Introducción
 Para iniciar una sesión SQL*Plus (Windows)
­ Pulse el icono SQL*Plus localizado en la carpeta Oracle
para Windows NT
­ En el cuadro de dialogo CONNECT introduzca el nombre
de usuario y contraseña:
­ Nombre de usuario : SCOTT
­ Contraseña: TIGER
­ Nombre del servicio: (se debe configurar primero el
servicio usando Oracle Net8 Easy Config)
 Salir de una sesión SQL
­ SQL> exit
Seleccionando Columnas
 Sintaxis Básica del QUERY:
SELECT ...
FROM ...
 Seleccionar todas las columnas de una tabla:
SELECT columna [,columna ,columna ...]
FROM nombre_tabla
ó
SELECT *
FROM nombre_tabla
Seleccionando Columnas
 Despliegue todas las columnas de la tabla
department
SQL> SELECT *
2 FROM department;
 Use el comando DESCRIBE para desplegar los
nombres de las columnas
SQL> DESC[RIBE] department
 Para desplegar una columna en especifico
SQL> SELECT name
2 FROM department;
Seleccionando Columnas
 Despliegue el nombre y número de todos los
departments
SQL> SELECT name, department_id
2 FROM department;
 La cláusula DISTINCT despliega los valores
únicos en una columna
SQL> SELECT DISTINCT columna [, columna]
2 FROM nombre_tabla;
Ejemplo:
SQL> SELECT DISTINCT job_id
2 FROM employee;
Seleccionando Columnas
 En el SELECT se pueden definir alias para los
encabezados de columna
 Despliegue job_id con el encabezado Trabajo
SQL> SELECT DISTINCT job_id Trabajo
2 FROM employee;

o para un encabezado con espacios en el nombre:

SQL> SELECT DISTINCT job_id “Id de Empleo”


2 FROM employee;
Selecionando Renglones
 La cláusula WHERE permite especificar una
condición y seleccionar renglones específicos en
un tabla
 SINTAXIS

SQL> SELECT columna [, columna ,columna ...]


2 FROM tabla
3 WHERE condición
4 [{AND|OR} condición]
Seleccionando Renglones
 Componentes de la condición
­ Nombre de la columna, expresión o constante
­ Operador de comparación
­ Nombre de columna, expresión o constante
 Las constantes tipo caracter y fecha se deben
encerrar entre comillas simples.
 Las constantes tipo caracter son sensibles a
mayúsculas y minúsculas, y los datos tipo fecha
deben estar en el formato DD-MON-YY (si está
en inglés la instalación).
Seleccionando Renglones
 Operadores de comparación:

= Igual a
!= <> Diferente de
> Mayor que
>= Mayor o igual a
< Menor que
<= Menor o igual que
BETWEEN.. AND.. Entre dos valores
IN (lista) Igual a cualquier miembro de la lista
IS NULL Es un valor nulo
LIKE Busca un patrón de caracteres
Seleccionando Renglones
 Ejemplos:
Seleccione el número de empleado, apellido y salario para
todos los empleados de el departamento 30
SQL> SELECT employee_id, last_name, salary
2 FROM employee
3 WHERE department_id = 30;
Despliegue el nombre del empleado, puesto y salario para
todos los empleados excepto los gerentes
SQL> SELECT employee_id, job_i, salary
2 FROM employee
3 WHERE job_id <> 671;
Seleccionando Renglones
 El operador BETWEEN permite seleccionar renglones
que contengan valores dentro de un rango
Despliegue el nombre del empleado, puesto, y número de
departamento para aquellos contratados entre Enero 1 de
1982 y Enero 1 de 1983.
SQL> SELECT last_name, job_id, department_id, hire_date
2 FROM employee
3 WHERE hire_date BETWEEN
4 to_date('01-JAN-82‘) AND to_date('01-JAN-83‘);
Seleccionando Renglones
 El operador IN permite seleccionar valores que
coincidan con uno de los valores en la lista
Despliegue el nombre del empleado, puesto y número de
departamento para todos los empleados que estén en el
puesto de CLERK y ANALYST.
SQL> SELECT last_name, job_id, department_id
2 FROM employee
3 WHERE job_id IN (667, 669);
Seleccionando Renglones
 Valores nulos:
IS NULL e IS NOT NULL
Listar todos los empleados que no son candidatos para
recibir comisión (el valor de la columna comisión es NULO)
SQL> SELECT last_name, job_id
2 FROM employee
3 WHERE commission IS NULL;
Seleccionando Renglones
 Para buscar una cadena de caracteres se utiliza el
operador LIKE con algunos caracteres comodín:

% Igual a cualquier número de caracteres


_ Igual a un solo carácter
Despliegue el nombre del empleado, puesto, número de
departamento y fecha de contrato para todos aquellos
empleados cuyo apellido empiece M mayúscula.
SQL> SELECT last_name, job_id, department_id
2 ,hire_date
3 FROM employee
4 WHERE last_neme LIKE 'M%';
Seleccionando Renglones
 Empleamos el operador NOT para negar
condiciones con estos operadores:

NOT BETWEEN ... AND ..


NOT IN (lista)
IS NOT NULL
NOT LIKE
Seleccionando Renglones
 La cláusula WHERE puede calificar y seleccionar
renglones especificando mas de una condición
de búsqueda, estas condiciones se pueden unir
por medio de expresiones lógicas:
 Expresiones lógicas
­ AND
­ OR
 Precedencia
­ =,!=, >,>=,<,<=, IN, LIKE, IS NULL, BETWEEN. AND .
­ NOT, AND , OR
­ Para anular las reglas de precedencia coloque
paréntesis
Seleccionando Renglones
Despliegue el nombre del empleado, puesto y salario para
los gerentes que ganen $1,500 o más , también incluya a
los vendedores.
SQL> SELECT last_name, job_id, salary
2 FROM employee
3 WHERE salary >= 1500
4 AND job_id = 671
5 OR job_id =670;
Despliegue nombre del empleado, puesto y salario para
los gerentes y vendedores que ganen $1,500 o mas.
SQL> SELECT last_name, job_id, salary
2 FROM employee
3 WHERE salary >= 1500
4 AND (job_id = 671 OR job_id = 670)
Seleccionando Renglones
 Sintaxis del SELECT
SELECT ...
FROM ...
WHERE ...
ORDER BY ...
 La cláusula ORDER BY puede ordenar:
­ Ascendente
­ Descendente
­ Por múltiples columnas
­ Por la posición de columnas
Seleccionando Renglones
 Despliegue el salario, puesto y nombre del empleado, para
el departamento 10 en orden ascendente de salario.
SQL> SELECT salary, last_name, job_id
2 FROM employee
3 WHERE department_id = 10
4 ORDER BY salary;
 Despliegue el salario, puesto y nombre del empleado, para
el departamento 10 en orden descendente de salario.
SQL> SELECT salary, last_name, job_id
2 FROM employee
3 WHERE department_id = 10
4 ORDER BY salary DESC;
Seleccionando Renglones
 Despliegue el nombre del empleado, puesto y salario , para
aquellos empleados en el departamento 30.
Ordene los resultados por puesto. Si hay mas de un
empleado con el mismo puesto, ordénelos por salario en
orden descendente y finalmente por su apellido.
SQL> SELECT first_name, job_id, salary
2 FROM employee
3 WHERE department_id = 30
4 ORDER BY job_id, salary DESC, last_name;
Seleccionando Renglones
 Despliegue el nombre del empleado, salario y puesto , para
el departamento 10 en orden ascendente de salario
SQL> SELECT first_name, salary, job_id
2 FROM employee
3 WHERE department_id = 10
4 ORDER BY 2;
Visualizando el
Diccionario de Datos
 El diccionario de datos es un grupo de tablas y
vistas que contiene información sobre las tablas,
privilegios de acceso a usuarios y características
de la base de datos
 Tablas del diccionario de datos mas
frecuentemente usadas:
­ USER_CATALOG: Tablas, vistas, sinónimos y secuencias
pertenecientes al usuario
­ USER_CONSTRAINTS: Información sobre las
restricciones en las tablas del usuario
­ USER_INDEXES: Descripción de los índices del usuario.
Visualizando el
Diccionario de Datos
­ USER_SEQUENCES: Descripción de las secuencias del
usuario
­ USER_SYNONYMS: Descripción de los sinónimos del
usuario
­ USER_TABLES: Descripción de las tablas del usuario
­ USER_USERS: Información sobre el usuario actual
­ USER_VIEWS: Descripción de las vistas pertenecientes
al usuario
­ ALL_TABLES: Descripción de todas las tablas
accesibles al usuario
Nomenclatura para la
Creación de Tablas y Vistas
 Creación de tablas
 El nombre de una tabla debe seguir las reglas
estándar de nomenclatura de Oracle
­ Nombre de la tabla
­ Nombre de la columna
­ Tipo de dato de la columna
 Reglas de nomenclatura
­ Debe de ser un nombre con una longitud de 1 a 30
carácter alfabeto
­ Solamente debe contener los caracteres A-Z, a-z, 0-9,
_ (subrayado)
­ No debe ser una palabra reservada de Oracle
Nomenclatura para la
Creación de Tablas y Vistas
­ No debe ser igual al nombre de otro objeto dentro del
mismo usuario de ORACLE
 Nota:
­ Los nombres de tablas son lo mismo ya sea en
mayúsculas o minúsculas ( por ejem: EMP = eMP)
Tipos de Datos
 CHAR(n)
­ Especifica una cadena de caracteres de longitud fija, el
tamaño máximo es de 255 bytes y el default es de 1
byte.
 VARCHAR2(n)
­ Especifica un cadena de caracteres de longitud
variable, la cual tiene un tamaño de longitud máxima
en bytes. El tamaño máximo es de 2000.
 NUMBER(n,d)
­ Valores numéricos consistentes de los dígitos 0-9, con
signo (+,-), opcional y un punto decimal.
Tipo de datos

La precisión n, puede tener un rango de 1 a 38 y la


escala d puede tener un rango de -84 a 127, donde n
es el numero máximo de dígitos y d es el numero
máximo de decimales.
 LONG
­ Cadena de caracteres de longitud variable que puede
contener hasta 2GB.
 DATE
­ Valores tipo fecha y hora, desde Enero 1º, 4712 A.C. A
Diciembre 31, 4712 D.C.
Tipos de datos
 RAW(n)
­ Datos en binario, cuyo tamaño es en bytes. El tamaño
máximo es de 255 bytes y este debe ser especificado
para la columna de tipo RAW.
 LONG RAW
­ Datos en binario de longitud variable de tamaño hasta
de 2 gigabytes.
Constraints
 PRIMARY KEY
­ Identifica de forma única a cada renglón de la tabla
 CHECK
­ Especifica una condición que cada renglón en la tabla
puede satisfacer
 FOREING KEY
­ Designa una columna o combinación de columnas
como la llave foránea
 REFERENCES
­ Establece y obliga una relación entre esta columna y la
columna de la llave primaria de la tabla referenciada
Constraints
 [NOT] NULL
­ Especifica que esta columna no debe de tener un valor
nulo
­ Especifica una o varias columnas cuyos valores deben
ser únicos a través de todos los renglones. Oracle crea
un índice único para asegurar este constraint
 ON DELETE CASCADE
­ Especifica que Oracle mantendrá la integridad
automáticamente removiendo los valores de la llave
foránea dependiente si se remueven los valores de la
llave primaria o única
Creación de Tablas
 Sintaxis
CREATE TABLE [ usuario].tabla
({columna1 tipo_de_dato [DEFAULT expr]
[constraint_de_columna]}
[ , {columna1 tipo_de_dato [DEFAULT expr]]
[constraint_de_columna]}]...);
 Ejemplo
­ Cree la tabla de empleados
Creación de Tablas
CREATE TABLE empleados
(No_Empleado NUMBER(4)
CONSTRAINT pk_emp PRIMARY KEY,
Nombre VARCHAR2(10)
CONSTRAINT nn_nombre NOT NULL
CONSTRAINT upper_nombre CHECK
(nombre=UPPER(nombre) ),
Trabajo VARCHAR2(9),
Gerente NUMBER(4)
CONSTRAINT fk_gerente REFERENCES
Empleados(No_Empleado),
Fecha_Contratacion DATE DEFAULT SYSDATE,
Salario NUMBER(10,2)
CONSTRAINT dc-salario CHECK (salario>500),
Comision NUMBER(9,2) DEFAULT 0,
No_Departamento NUMBER(2)
CONSTRAINT nn_No_dept NOT NULL
CONSTRAINT fk_No_dept REFERENCES
dept(deptno));
Creación de Tablas
 La cláusula AS en el estatuto CREATE TABLE,
permite crear una nueva tabla, usando los
atributos de columna y datos dentro de una
tabla existente.
 Sintaxis
CREATE TABLE tabla
AS sentencia select;

 Ejemplo
CREATE TABLE hdates
AS SELECT employee_id, last_name, hire_date
FROM employee
WHERE department_id = 10;
Modificación de Tablas
 La sentencia ALTER TABLE se utiliza para alterar
la definición de una tabla:
­ Añadiendo columnas o restricciones
­ Modificando definiciones de columnas (tipos de
datos,no nulos, etc.)

 Sintaxis ADD
ALTER TABLE tabla
ADD ({columna1 tipo_de_dato [DEFAULT expr]
[constraint_de_columna]}
[ , {columna1 tipo_de_dato [DEFAULT expr]]
[constraint_de_columna]}]...);
Modificación de Tablas
 Ejemplo
Añada una tabla a la tabla HDATES para almacenar el
número de gerente

ALTER TABLE hdates


ADD (manager NUMBER(4));

 Sintaxis MODIFY
ALTER TABLE tabla
MODIFY ({columna1 tipo_de_dato [DEFAULT expr]
[constraint_de_columna]}
[ , {columna1 tipo_de_dato [DEFAULT expr]]
[constraint_de_columna]}]...);
Modificación de tablas
 Ejemplo
­ Modifique la tabla hdates para que almacene 18
caracteres en el nombre

ALTER TABLE hdates


MODIFY (last_name CHAR(18));

 Sintaxis-Borrar (DROP) un constraint


ALTER TABLE tabla
DROP { PRIMARY KEY
| UNIQUE (columna [, columna]...]
| CONSTRAINT constraint}
[CASCADE ];
Modificación de Tablas
 Ejemplo:
Elimine la clave primaria de la tabla dept

ALTER TABLE department


DROP PRIMARY KEY CASCADE;

La opción CASCADE borra las llaves foráneas que hagan


referencia a la llave primaria
Modificación de Tablas
 Modificación de Tablas
­ Para remover una columna de una tabla use la
sentencia: DROP COLUMN

Sintaxis:

ALTER TABLE nombre_tabla


DROP COLUMN nombre_columna

Ejemplo:

ALTER TABLE hdates


DROP COLUMN manager;
Definición de vistas
 Una vista es una representación lógica de una o
mas tablas. Una vista no contiene datos. Todos
los datos son derivados de la(s) tabla(s)
subyacentes.

 Ventajas de las vistas


­ Seguridad
­ Conveniencia
Creación de Vistas
 La creación de vistas es semejante a la creación
de tablas empleando la cláusula AS SELECT
 Sintaxis
CREATE VIEW [ OR REPLACE ] vista [(alias, [alias] ...)]
AS sentencia_select;
 Ejemplo
Cree una vista que contenga el número, nombre y
puesto para todos los empleados en el departamento
10

CREATE VIEW empvu10


AS SELECT employee_id, last_name, job_id
FROM employee
WHERE department_id=10;
Creación de vistas
 Sintaxis , borrar una vista
DROP VIEW vista;

 Ejemplo
­ Elimine la vista empvu10
DROP VIEW empvu10;
Vista con alias para columnas
 Ejemplo
Cree una vista que contenga el número de empleado,
(con el encabezado ID_NUMBER), nombre (con el
encabezado EMPLOYEE) y puesto (con el encabezado
TITLE) para el departamento 10

CREATE VIEW empvu10 (id_number, employee, title)


AS SELECT employee_id, last_name, job_id
FROM employee
WHERE department_id=10;
Vista con alias para columnas
 Ejemplo
Cree una vista que contenga el numero de empleado,
nombre y el cálculo del salario anual para del
departamento 10. Nombre a la columna calculada
ANNUAL_SALARY.

CREATE VIEW salvu10


AS SELECT employee_id, last_name, salary * 12
ANNUAL_SALARY
FROM employee
WHERE department_id = 10;
Creación de vistas con
WITH CHECK OPTION
 La opción WITH CHECK OPTION asegura que los
INSERT´s y UPDATE`s ejecutados a través de las
vistas no afecten a los datos a los que la vista no
ha permitido seleccionar.

 Sintaxis
CREATE VIEW vista [ (alias, [alias]...) ]
AS sentencia
WITH CHECK OPTION [CONSTRAINT constraint]];
Creación de vistas con
WITH CHECK OPTION
 Ejemplo
Cree una vista que contenga todas las columnas de la
tabla employee para el departamento 20 con WITH
CHECK OPTION

CREATE VIEW empvu20


AS SELECT *
FROM employee
WHERE department_id=20
WITH CHECK OPTION;
Acceso a tablas y vistas
 El privilegio de DBA le permite a un
desarrollador tener muchos privilegios
requeridos para usar los objetos de base de
datos
 Privilegios del Sistema
­ DBA Todos los privilegios
• SELECT
• CREATE
• DROP
• GRANT/REVOKE
• Ejecutar exports e imports de la base de datos completa
• Modificar la estructura de la base de datos
• RESOURCE
• CONNECT
Otorgar privilegios
a tablas y vistas
 Los dueños de tablas controlan el acceso a los
objetos dentro de su rango de pertenencia.
 Privilegio de Acceso a Tablas
­ Crear uno mismo una tabla
­ Obtener privilegios del dueño de la tabla
 Como el DBA o dueño de tabla, el comando
GRANT y sus opciones se utilizan para
proporcionar diversos niveles de acceso a los
objetos de la base de datos.
Otorgar privilegios
a tablas y vistas
 Sintaxis
GRANT privilegio, privilegio ... [o ALL]
ON tabla/vista
TO usuario1, usuario2... [o PUBLIC]
[WITH GRANT OPTION];

 Ejemplo:
Conceder todos los privilegios a todos los usuarios
sobre la tabla emp

GRANT ALL ON employee TO PUBLIC;


Otorgar privilegios
a tablas y vistas
 Ejemplo:
Otorgue privilegio de SELECT a curso1 para la tabla
department

GRANT SELECT ON department TO curso1;


Otorgar privilegios
a tablas y vistas
 Ejemplo:
Otorgue privilegios de SELECT a curso1 para la tabla
department permitiendo a curso1 otorgar los mismos
privilegios a otros

GRANT SELECT ON dept TO jones WITH GRANT OPTION;


Sinónimos
 Los sinónimos pueden ser creados por razones
de seguridad y conveniencia.
 Niveles de sinónimos
­ Públicos
­ Privados
 Ventajas de emplear sinónimos
­ Referencia a Tablas/Vistas sin especificar al dueño (o
base de datos)
­ Flexibilidad para adaptarse a una convención de
nomenclatura mas significativa
Creación de Sinónimos
 Sintaxis - Sinónimo público o privado
CREATE [PUBLIC] SYNONYM sinónimo FOR tabla;

 Ejemplo
Cree el sinónimo DATES para la tabla HDATES de Ward

CREATE SYNONYM dates FOR hdates;


Eliminar privilegios: REVOKE
 Privilegios del sistema
­ Solamente pueden ser eliminados por el DBA
 Privilegios sobre objetos
­ Pueden eliminarse en cualquier momento
 Los privilegios de objeto se eliminan de la
siguiente manera:

REVOKE INSERT ON employee FROM curso1;


Índices
 Los índices son estructuras opcionales asociadas
a tablas empleadas para agilizar la ejecución de
consultas o garantizar la existencia única de un
renglón específico
 El servidor Oracle acceda datos en dos formas
mutuamente exclusivas
­ FULL TABLESCAN (secuencial)
­ INDEX (selectiva)
Reglas para crear índices

 La regla general para indexar es: crear un índice


si se anticipa que habrá recuperación frecuente
de menos del 10 - 15% de los renglones en una
tabla grande y además las columnas son
frecuentemente referenciadas por una cláusula
WHERE
 Características de las columnas para indexación:
­ La columna es usada frecuentemente en cláusulas
WHERE
­ Cada valor es único
­ Amplio rango de valores
­ Muchos nulos/relativamente pocos valores
Creación de índices

 Sintaxis - Índice sencillo

CREATE INDEX indice ON tabla (columna [, columna]...)

 Ejemplo:
Cree un índice sobre la columna employee_id de la tabla
employee

CREATE INDEX i_emp_ename ON employee(employee_id);


Creación de índices
 Índice usado
SQL>SELECT *
2 FROM employee
3 WHERE last_name = ‘SMITH’;

 Índice no usado
SQL> SELECT *
2 FROM employee;
Eliminando índices
 El comando DROP sirve para remover índices de
la base de datos.
 Sintaxis :
DROP INDEX nombre_indice;

 Ejemplo :
Borre el índice i_emp_ename;

DROP INDEX i_emp_ename;


Tabla de
Diccionario de datos

 Ejemplo:
Despliegue los índices existentes sobre la tabla employee

SQL> SELECT index_name


2 FROM user_indexes
3 WHERE table_name = ‘EMPLOYEE’;
Creación de Indices
 Los índices únicos sirven para asegurar que no
existan dos renglones con valores idénticos en
las columnas indexadas
 Sintaxis :
CREATE UNIQUE INDEX nombre_indice
ON TABLA { columna [, columna]...};
 Ejemplo :
Cree un índice sobre la columna employee_id de la
tabla employee para mejorar el performance y la
existencia de valores únicos para los números de
empleados
CREATE UNIQUE INDEX i_emp_emp_id
ON employee(employee_id);
Creación de Indices
 Un máximo de 16 columnas pueden ser incluidas en
un solo índice
 Ejemplo
Cree un índice para las columnas employee_id y last_name
CREATE INDEX i_emp_id_last_name
ON employee (employee_id, last_name);
Creación de Secuencias
 Se crean secuencias para generar números
enteros únicos para múltiples usuarios. Los
números de secuencia pueden ser usados para
generar llaves primarias automáticamente
 Sintaxis abreviada :

CREATE SEQUENCE secuencia


[INCREMEMENT BY (1|n) ]
[START WITH n]
[ (MAXVALUE n | NOMAXVALUE) ]
[ (MINVALUE n | NOMINVALUE )] ...;
Creación de Secuencias

 Ejemplos :
Cree una secuencia para employee_id empezando con
el numero 8000
CREATE SEQUENCE s_emp_empno
START WITH 8000;

Cree una secuencia para department_id empezando


con el numero 100 con incrementos de 10 en 10
CREATE SEQUENCE s_dep_deptno
START WITH 100
INCREMENT BY 10;
Creación de Secuencias
 Ejemplo :
Despliegue el siguiente numero de secuencia
disponible para la secuencia s_emp_empno

SQL> SELECT s_emp_empno.nextval


2 FROM dual;

 Eliminar una secuencia de la base de datos

DROP SEQUENCE s_dept_deptno;


Ejercicios
1. Crear un índice llamado I_EMP_EMPNO sobre la
tabla employee que no permita números
duplicados de empleado
2. Crear la secuencia S_DEPT_DEPTNO empezando
con 60 e incrementando de 5 en 5
3. Despliegue la secuencia seleccionando todas las
columnas en la tabla del diccionario de datos
USER_SEQUENCES
4. Use la tabla DUAL para desplegar el siguiente
numero disponible de la secuencia
S_DEPT_DEPTNO
Insertando Renglones
 Con la sentencia INSERT se inserta un renglón a
una tabla
 Sintaxis :
INSERT INTO tabla [ (columna1, columna2 ...)]
VALUES (valor1, valor2 ...);
 Ejemplo
Despliegue la estructura de la tabla DEPT

DESC[RIBE] department;
Insertando Renglones

Inserte el departamento de Finanzas, departamento 50


en Los Angeles , a la tabla department;
SQL> INSERT INTO dept
2 VALUES (50, ‘FINANCE’, ‘LOS ANGELES’);
 Ejemplo :
Inserte valores a todas las columnas de la tabla
employee para un nuevo empleado
SQL> INSERT INTO employee
2 VALUES (1234, ‘EMMETT’, ‘SALESMAN’, 7698,
3 SYSDATE, 2000, NULL, 30);
Insertando Renglones

 Ejemplo :
Inserte un subconjunto de datos de un nuevo
empleado a la tabla employee

INSERT INTO employee (employee_id, last_name,


hire_date, salary, department_id)
VALUES (S_EMP_EMPNO.NEXTVAL, ‘LERNER’,
‘01-JAN-92’, 2000, 30);
Insertando Renglones
 Ejemplos:
Inserte valores a columnas usando parámetros

INSERT INTO department


VALUES (&deptno, ‘&dname’, &loc);
Insertando renglones
de otra tabla

 Se puede utilizar el comando INSERT con un


query para seleccionar renglones de una tabla e
insertarlos en otra
 El query sustituye a la cláusula VALUES

 Ejemplo:
SQL> INSERT INTO old_emp (id, name, department)
2 SELECT employee_id, last_name, department_id
3 FROM employee
4 WHERE department_id IN (10, 20, 30, 40);
Actualizando Renglones
 Se pueden cambiar los datos en una tabla
específica con la sentencia UPDATE
 Sintaxis :
UPDATE tabla
SET columna1=valor, columna2=valor ...
[WHERE condicion]
 Ejemplo :
Despliegue la estructura de la tabla employee
DESC[RIBE] employee
Actualizando Renglones
 Ejemplo - Actualice múltiples columnas
Cambie al empleado numero 7566 al puesto de ventas
del departamento 30

SQL> UPDATE employee


2 SET job_id = 670, department_id=30
3 WHERE employee_id = 7566;

Transferir al empleado 7788 a ventas y darle un


aumento salarial del 5%

SQL> UPDATE employee


1 SET job_id=670, salary = salary*1.05
2 , department_id =30
3 WHERE employee_id = 7788;
Actualizando Renglones

 Ejemplo - Actualice múltiples renglones


A todos los empleados que tienen el job Sales Person
cambiarles la comisión

UPDATE employee
SET commission = 500
WHERE job = 670;
Borrado de Renglones
 La sentencia DELETE borra renglones de una
tabla específica
 Sintaxis :
DELETE tabla
[WHERE condicion];

 Ejemplo :
Borre al empleado 1234 de la tabla employee para
reflejar su despido

DELETE employee
WHERE employee_id = 1234;
Proceso de Transacciones
 Una transacción es definida como todos los
cambios realizados a la base de datos entre
operaciones de COMMIT sucesivas
 Inserciones , borrados, y actualizaciones a las
tablas no se hacen permanentes hasta que el
trabajo es guardado en la base de datos (COMMIT)
 Hasta que la transacción se guarda en la base de
datos, el único que puede ver los cambios es el
usuario que los hizo
 Un COMMIT puede ser explícito o implícito
Proceso de Transacciones
 COMMIT explícito
Borre el usuario LERNER y explícitamente de COMMIT a
la transacción de la base de datos

SQL> DELETE employee


2 WHERE last_name = ‘LERNER’;
SQL> COMMIT;

 COMMIT implícito
­ Los siguientes comandos de SQL causan un commit
implícito:
ALTER, COMMENT, CONNECT,
CREATE, DISCONNECT, DROP, EXIT
GRANT, REVOKE y RENAME
Proceso de Transacciones
 COMMIT automático
­ Los cambios tienen efecto inmediatamente después de
un INSERT, UPDATE o DELETE si la opción AUTOCOMMIT
se encuentra habilitado (sólo en SQL*Plus)
­ Para esto se utiliza el comando SET de SQL*Plus

SET AUTOCOMMIT ON
Proceso de Transacciones
 Controlando cuando tienen efecto los cambios:
ROLLBACK
 El comando ROLLBACK cancela todos los cambios
pendientes regresando al estado en que estaba la
información antes del último COMMIT

 Ejemplo :
Transferir a Jones al grupo de ventas
UPDATE employee
SET job_id =670, department_id=30
WHERE first_name = ‘JONES’;
Proceso de Transacciones
Todos los empleados con el nombre ‘JONES’ son
transferidos al grupo de ventas. Haga rollback a la
transaccion y repita la transaccion especificando el
numero de empleado de Jones

ROLLBACK;

UPDATE employee
SET job_id = 670, department_id =30
WHERE employee_id = 7566;
Proceso de Transacciones
 SAVEPOINT marca un punto dentro de una
transacción particular en el cual se desea hacer
un ROLLBACK parcial de la transacción

 Ejemplo :
Inserte un nuevo departamento a la tabla DEPT y cree
un savepoint para la transacción

INSERT INTO department


VALUES (70, ‘PERSONAL’, 124);

SAVEPOINT A;
Proceso de Transacciones
 Use la sentencia ROLLBACK TO para hacer una
anulación parcial de la transacción

 Ejemplo
Inserte un nuevo departamento a la tabla deparment

INSERT INTO department


VALUES (80, ‘EDUCATION’, 124);

Anule todas las transacciones hasta el SAVEPOINT A;

ROLLBACK TO A;
Ejercicios

1. Inserte sus datos como un nuevo empleado en la


tabla employee;
2. De COMMIT al INSERT;
3. Inserte otro renglón de la tabla employee,
solicitando el número de empleado, el número
de departamento, fecha de contratación y
nombre del empleado
4. Cree un savepoint llamado SP1
5. Añada un nuevo departamento a la tabla
department, número 99, ubicación en Maui y
nombre Education
Ejercicios

1. Haga rollback a savepoint SP1


2. Escriba una consulta para desplegar todos los
datos de la tabla department
3. De commit a los cambios
4. Actualice sus datos de empleado, dándose un
aumento mensual de $1000
5. Dése de baja de la tabla employee
6. Confirme los cambios
Valores y
funciones numéricas
 Los cálculos se llevan a cabo usando las
expresiones aritméticas
+ Suma
- Resta
* Multiplicación
/ División
() Cambio de precedencia

 Los operadores aritméticos pueden ser usados


en la mayoría de las sentencias SQL
 El resultado de los cálculos se puede desplegar
como si fuesen columnas con expresiones
aritméticas en estatutos SELECT
Referencia a valores
y funciones numéricas

 Ejemplo
Despliegue el salario, comisión y compensación total
para todos los vendedores cuya comisión sea mayor al
25% de su salario

SELECT last_name, salary, commission


, salary + commission
FROM employee
WHERE job_id = 670
AND commissiom > 0.25 * salary
ORDER BY 4;
Valores y
funciones numéricas
 Una columna de un renglón sin valor contiene
un valor nulo (NULL)
 Cuando una función o expresión individual se
refiere a una columna que contiene un valor
nulo, el resultado es un nulo
 Ejemplo
Despliegue el nombre del empleado puesto, salario,
comisión y compensación total para los empleados del
departamento 30

SELECT last_name, job_id, salary


, commission, salary + commission
FROM employee
WHERE department_id = 30;
Valores y
funciones numéricas
 Con la función de valor nulo NVL, se convierte
un valor nulo a uno no-nulo con el propósito de
evaluar una expresión
 Cuando NVL evalúa la primer expresión, si es
NOT NULL, regresa expr1, de otra forma regresa
expr2
 Sintaxis :
NVL(expr1, expr2)

SELECT last_name, job_id, salary, commission


, NVL(salary, 0) + NVL(commission,0)
FROM employee
WHERE department_id = 30;
Valores y
funciones numéricas

 Funciones numéricas comunes:


 MOD(a,b)
­ El residuo de a dividido entre b
 SQRT(n)
­ La raiz cuadrada de n
 ROUND(n,d)
­ Redondea n a d dígitos después del decimal
 TRUNC(n,d)
­ Trunca n a d dígitos después del decimal
 POWER(a,n)
­ Eleva a a la n potencia
Valores y
funciones numéricas
 Ejemplo -Función ROUND
Lista el nombre, salario mensual, salario diario (basado
en 22 días de trabajo al mes) y salario diario
redondeado al entero mas próximo para Allen y Jones

SELECT last_name, salary, salary/22, ROUND(salary/22,0)


FROM employee
WHERE first_name IN (‘ALLEN’, ‘JONES’);

Repita la consulta pero con el salario diario truncado al


entero mas próximo para Allen y Jones.

SELECT last_name, salary, salary/22, TRUNC(salary/22,0)


FROM employee
WHERE first_name IN (‘ALLEN’, ‘JONES’);
Valores y
funciones de fecha
 Use las operaciones aritméticas básicas en las
sentencias SQL para ejecutar cálculos sobre
valores de fechas en la base de datos
Fecha + Numero Añade un número de días a la fecha ,
regresando una fecha
Fecha - Numero Resta un número de días a la fecha,
regresando una fecha
Fecha - Fecha Resta una fecha de otra, regresando un
número de días
 Ejemplo
SELECT last_name, hire_date, hire_date + 90 “REVIEW”,
SYSDATE-hire_date dias_transcurridos
FROM employee
WHERE department_id = 10;
Valores y
funciones de fecha
 ADD_MONTHS (date,n)
­ Regresa una fecha n meses después de date de
contratación
 LAST_DAY(date)
­ Regresa el ultimo día del mes de date
 NEXT_DAY(date, day)
­ Regresa la fecha del primer dia day, despues de date
 MONTHS_BETWEEN(date1, date2)
­ Regresa el numero de meses entre date1 y date2
 SYSDATE
­ Regresa la fecha actual
Valores y
funciones de fecha
 La función de conversión TO_CHAR da formato
al desplegado de valores de fecha
 Ejemplo TO_CHAR
­ Despliegue las columnas de contratación para todos
los empleados en el departamento 20 con formato DD
of Month YYYY.
SELECT TO_CHAR(hire_date,’fmDD “de” Month YYYY’)
“Date of Hire”
FROM employee
WHERE department_id= 20;
Referencia a valores y
funciones de caracteres

 Combine columnas y constantes de caracteres


en un formato que sea mas significativo en su
lectura
 Ejemplo - Concatenación
­ Despliegue los nombres de los departamentos
combinados con sus ubicaciones bajo el encabezado
Departamentos.
SELECT description ||‘ - ‘||location_id “DEPARTAMENTOS”
FROM department;
Valores y
funciones de caracteres

 INITCAP(cadena)
­ Regresa la primer letra de cadena en mayúscula y el
resto en minúsculas
 UPPER(cadena)
­ Regresa todos los caracteres de cadena en mayúsculas
 LOWER(cadena)
­ Regresa todos los caracteres de cadena en minúsculas
 LENGTH(cadena)
­ Regresa el numero de caracteres de cadena
Valores y
funciones de caracteres

 La funcione de conversión TO_CHAR también da


formato a valores numéricos
 Ejemplo
­ Despliegue la comisión de cada empleado usando
signos de pesos al principio, comas y 2 decimales

SELECT last_name||’ ‘||first_name Employe,


TO_CHAR(commission,’$9,990.99’) Commision
FROM employee;
Valores y
funciones de caracteres

 La función de conversión TO_DATE da formato a


valores de tipo fecha
 Ejemplo
­ Inserte un nuevo empleado a la tabla EMP, convierta la
cadena de fecha a un formato de fecha oracle

INSERT INTO employee


(employee_id, last_name, hire_date
, department_id)
VALUES (7999, ‘SAMS’,
TO_DATE(‘03-JUL-1991’,’DD-MONTH-YYYY’), 10);
Otras Funciones

 GREATEST(val1,val2)
­ Regresa el valor mayor entre val1 y val2
 LEAST (val1,val2)
­ Regresa el valor menor entre val1 y val2
Ejercicios
1. Despliegue el nombre de los empleados
utilizando la letra inicial mayúscula
2. Calcule el número de meses entre la fecha de
contratación y la de hoy
3. Ordene el resultado anterior por el numero de
meses de empleo. Redondee el numero de
meses al numero entero mayor mas próximo
4. Despliegue el nombre del empleado,
compensación total y fecha de contratación
para todos los empleados cuyo salario sea
mayor a 2 veces su comisión, de formato a la
fecha de contratación para que parezca a 10 de
Diciembre de 1982
Funciones de Grupo
 Las funciones de grupo obtienen resultados
basados en grupos de renglones en vez de un
resultado por renglón
 AVG(sal)
­ Valor promedio de salario
 COUNT(*)
­ Numero de renglones no nulos en un grupo
 MAX(sal)
­ Maximo valor de salario
 MIN(sal)
­ Minimo valor de salario
 SUM(comm)
­ Suma de los valores de comision
Funciones de grupo

 Ejemplo
­ Despliegue el promedio , el mas alto, y la suma de los
salarios para todos los vendedores
SELECT AVG(sal), MAX(sal), SUM(sal)
FROM employee
WHERE job_id = 670;

­ Despliegue el numero de renglones en la tabla EMP, y


el numero de empleados con comisión no nula
SELECT COUNT(*) EMPLOYEES
, COUNT (commission) COMMISION
FROM employee;
Funciones de grupo

 Ejemplo - GROUP BY
­ Despliegue cada departamento y su numero de
personal agrupado por departamento
SELECT department_id, COUNT(*)
FROM employee
GROUP BY department_id;
 Si se seleccionan al mismo tiempo una funcion
de grupo y una columna normal se producira un
mensaje de error
SELECT department_id, COUNT(*)
FROM employee;
Funciones de Grupo

 Ejemplo
­ Despliegue el numero de empleados para cada puesto
dentro de cada departamento

SELECT department_id, job_id, COUNT(*)


FROM employee
GROUP BY department_id, job_id;
Funciones de Grupo

 Para poner una condición usando una función de


grupo se utiliza la cláusula HAVING
 Ejemplo
­ Despliegue el salario anual promedio para todos los
puestos con mas de 2 empleados

SELECT job_id, AVG(salary * 12)


FROM employee
GROUP BY job_id
HAVING count(*)>2
Comandos de SQL*Plus

 ECHO {ON|OFF}
­ ON Los comandos ejecutados desde una archivo seran
desplegados en terminal
­ OFF Suprime el desplegado de los comandos
 FEED[BACK]
• Despliega el numero de registros recuperados en una
consulta, ON u OFF hacen que se despliegue o no el
resultado
Comandos de SQL*Plus

 SPACE {1|n}
­ Ajusta el numero de espacio entre columnas
 PAGESIZE {14|n}
­ Ajusta el numero de líneas por pagina
 SET HEADING {ON|OFF}
­ ON Se despliegan los encabezados de las columnas
­ OFF Se suprimen los encabezados
 SET LINESIZE {n}
­ Fija el numero de caracteres que SQL*Plus despliega
por linea, el default es 80
Comandos de SQL*Plus

 SAVE nomre_archivo{.sql}
­ Crea una archivo script para después ejecutarse. Por
default guarda lo que este en el buffer.
 START nomre_archivo{.sql}
­ Ejecuta un archivo script.
 @ nomre_archivo{.sql}
­ Ejecuta un archivo script, igual que START
 EDIT nomre_archivo.sql
­ Ejecuta un archivo, si no se le pasa nombre de archivo
edita el archivo buffer.
Creación de un
archivo de reporte

 El comando SPOOL crea un archivo de impresión


de el reporte
 Ejemplo
SPOOL salreport
SELECT department_id, INITCAP(last_name),
salary, commission,
NVL(salary,0) + NVL(commission, 0) Tot
FROM employee
ORDER BY department_id, last_name;
SPOOL OFF
Consultas avanzadas

 Un JOIN es la forma del comando SELECT que


combina información de 2 o mas tablas
­ Un JOIN simple o equijoin recupera renglones de 2 o
mas tablas unidas en base a una condición de igualdad
en la cláusula WHERE

 Sintaxis
SELECT [tabla.]columna, [tabla.]columna ...
FROM tabla1, tabla2
WHERE [tabla1.columna]=[tabla2.columna];
Consultas avanzadas

 Ejemplo
­ Despliegue el nombre del empleado, ubicación y
numero de departamento

SELECT employee.last_name, department.location_id


,employee.department_id
FROM employee, department
WHERE employee.department_id=department.department_id
Consultas avanzadas

 Las condiciones de JOIN se especifican junto


con las condiciones del WHERE
 Ejemplo
­ Despliegue el nombre y ubicación del empleado WARD

SELECT employee.ename, department_id.loc


FROM employee, department
WHERE employee.department_id=
department.department_id
AND employee.last_name ='WARD'
Consultas avanzadas

 Un OUTER JOIN combina dos o más tablas para


recuperar información que no tienen relación
directa con la otra tabla

 Sintaxis
SELECT tabla.columna, tabla.columna...
FROM tabla1, tabla2
WHERE tabla1.columna=tabla2.columna(+);
­ ò
SELECT tabla.columna, tabla.columna...
FROM tabla1, tabla2
WHERE tabla1.columna(+)=tabla2.columna;
Consultas Avanzadas

 Ejemplo
­ Despliegue los nombres, numero de departamento y
ubicaciones de oficina de todos los empleados, incluya
en esa lista los números de departamentos y
ubicaciones de oficina que actualmente no tienen
empleados

SELECT employee.last_name
,department.department_id
,department.location_id
FROM employee, department
WHERE employee.department_id(+) =
department.deparment_id
Consultas Avanzadas
 Un SELF JOIN hace un join a una tabla con ella
misma, como si se tratara de dos tablas
separadas, usada en relaciones recursivas.
 Ejemplo
­ Despliegue la asociación del nombre del empleado y
gerente como <nombre_empleado> trabaja para
<nombre_gerente>
SELECT worker.last_name || ' trabaja para ‘
|| manager.last_name
FROM employee worker, employee manager
WHERE worker.manager_id = manager.employee_id
Consultas Avanzadas

 Un non-equijoin recupera renglones de de 2 o


mas tablas basándose en una relación diferente
a la condición de igualdad en la cláusula WHERE
 Ejemplo
­ Despliegue el nombre del empleado y salario para
aquellos en el grado nivel 3
­ *
SELECT emp.last_name , emp.salary
FROM employee emp , salary_grade sal
WHERE sal.grade_id = 3
AND emp.sal BETWEEN sal.lower_bound
AND sal.upper_bound
Subconsultas

 Las subconsultas seleccionan renglones de otra


tabla con una condición que depende de valores
de otra consulta
 Las subconsultas suelen aparecer en la cláusula
WHERE de los siguientes estatutos
­ SELECT
­ INSERT
­ UPDATE
­ DELETE
Subconsultas
 Sintaxis del select
SELECT ...
FROM ...
WHERE ...( SELECT ...
FROM ...
WHERE ...);

­ Las subconsultas pueden tener varios niveles


­ La subconsulta puede acceder tablas que no son
utilizadas por la consulta principal
­ Una subconsulta no puede tener una cláusula ORDER
BY
Subconsultas

 Ejemplo - Subconsulta de renglón único


­ Despliegue el nombre y puesto de todos los
empleados con el mismo departamento que Jones

SELECT last_name, job_id


FROM employee
WHERE department_id =
(SELECT department_id
FROM employee
WHERE UPPER(last_name) = ‘JONES’);
Subconsultas

 Ejemplo - Subconsulta multirenglon


­ Despliegue nombre y fecha de contratación de todos
cuyo salario sea mayor que el salario promedio, y que
trabaje en el departamento donde labore cualquier
empleado llamado Smith

SELECT last_name, hire_date


FROM employee
WHERE salary >
(SELECT AVG(salary)
FROM employee)
AND department_id IN
(SELECT department_id
FROM employee
WHERE last_name=‘SMITH’);
Ejercicios
1. Muestre los nombres de los empleados,
nombre y clave del departamento donde trabaja
cada empleado. La salida debe ser con los
siguientes encabezados:
Empleado Departamento Cod. del Depto
---------- ------------ --------------
2. Muestre el nombre y apellido de los empleados,
el nombre del departamento y el nombre del
estado al que pertenecen, muestre solo a los
empleados donde el nombre del estado inicie
con la letra N o C. La salida debe ser:
Empleado Departamento Estado
--------- ------------ --------
Ejercicios
1. Muestre los nombres de los estados existentes
y cuantos departamentos tiene cada estado
2. Muestre los nombres de los estados existentes
y cuantos empleados trabajan en ese estado.
Muestre sólo los estados que tengan mas de 5
empleados
3. Muestre la clave de los clientes y el importe
total de sus ordenes correspondientes
4. Muestre el apellido, puesto y sueldo de todos
los empleados que ganen menos del sueldo
promedio
Diagrama E-R de Usuario Curso

Job
Employe Department
e Job_Id
Employee_Id Department_Id Location
Location_Id

Products
Salary_Grade Product_Id

Salary_Id

Customers
Price
Customer_Id Items
Sales_Order Product_Id
Item_Id Start_Date
Order_Id
PL/SQL
Temas del Curso
• PL/SQL
• Bloque PL/SQL
• Conjunto de carateres de un bloque PL/SQL
• Conjunto de carateres relacionados
• Nomenclatura de variables
• Tipos de variables
• Variables escalares
• Variables compuestas
• Atributo %TYPE
• Atributo %ROWTYPE
• Componentes de PL/SQL
• SELECT en un bloque PL/SQL
• Insertando datos
Temas del Curso
• Actualizando datos
• Borrando datos
• Cursores
• Manejando excepciones
• Subprogramas
• Procedimientos
• Modos de parámetro
• Funciones
• Paquetes
• Triggers
PL/SQL

 Es un lenguaje procedural
 Es una extensión de SQL
­ Se pueden tener sentencias de consultas o DML
 Ventajas
­ Operadores aritméticos
­ Operadores relacionales
­ Declaración de variables
­ Manejo de errores
­ Portabilidad
Bloque PL/SQL

DECLARE (opcional)
declaración de variables;
declaración de cursores;
creación de tipos de dato;

BEGIN (obligatoria)
estructuras de control;
sentencias SQL;
asignación de valores;

EXCEPTION (opcional)
manejo de errores;

END; (obligatoria)
Conjunto de
caracteres de un Bloque PL/SQL

 Caracteres permitidos
­ Todas las letras mayúsculas y minúsculas
­ Los dígitos de 0-9
­ Los símbolos ( ) + - * / <> = ! ; : . ‘ @ % , ¨# $ ^ & _ | {}
?[]

 Operadores Aritméticos
+ Suma
* Multiplicación
** Exponenciación
- Sustracción
/ División
Conjunto de
caracteres de un Bloque PL/SQL

 Operadores Relaciónales
<> Distinto de

^= Distinto de

> Mayor que

!= Distinto de

< Menor que

= Igual
Conjunto de
caracteres relacionales

 Diversos símbolos
() Separador de lista

; Fin de orden

. Elemento separador

‘’ Encierra una cadena de caracteres

:= Asignación

|| Concatenación

-- Delimitador de comentario

/* */ Delimitadores de comentario
Nomenclatura de Variables
 Reglas para nombrar variables
­ Las variables deben comenzar por una letra A-Z
­ Pueden ir seguidas de una o mas letras, números del 0-
9 o de los caracteres especiales $,# o _
­ Las variables no deben ser mas largas de 30 caracteres
­ En los nombres de variables no se pueden incluir
espacios

 Ejemplos
23_letras
prueba_nombre
prueba-nombre
Prueba nombre
un_nombre_de_variable_demasiado_largo
muchos_$$$$$$
23
Nomenclatura de Variables
 No esta permitido utilizar palabras reservadas
como nombres de variable
 Algunas palabras reservadas son:
LOOP
CREATE
SELECT
INSERT
FOR
DECLARE
....
Tipos de Variables
 Variables PL/SQL:
­ Escalar
• No tienen componentes internos
• Mantienen un solo valor
­ Compuestas
• Tienen componentes internos
• Son reutilizables
• TABLE
• RECORD
­ Referencia
• Cursor
­ LOB (objetos grandes)
 Variables no declaradas dentro de PL/SQL.
Variables Escalares
 Tipos de Datos:
­ VARCHAR2(long)
­ NUMBER [(digitos,decimales)]
­ DATE
­ CHAR
­ LONG
­ LONG_ROW
­ BINARY_INTEGER
­ BOOLEAN
­ PLS_INTEGER
 Sintaxis:
nombre_variable [CONSTANT] tipo_dato [NOT NULL] [:=|
DEFAULT valor]

 Ejemplo:
vd_Fecha_Entrada DATE;
vn_Salario NUMBER(5,2) := 1500;
vc_Nombre VARCHAR2(15) DEFAULT ‘JONES’;
Variables Compuestas
 TABLE
­ Tipo de dato tabla PL/SQL, similar la tabla de Oracle
­ Crece dinámicamente
­ Consta de dos columnas, una para el índice y otra para
almacenar el valor
­ Sintaxis:
TYPE nombre_tipo IS TABLE OF tipo_dato [NOT NULL]
INDEX BY BINARY_INTEGER
­ Ejemplo
TYPE t_employee_salario IS TABLE OF NUMBER(5,2)
INDEX BY BINARY_INTEGER
index salario
vtn_salario T_EMPLOYE_SALARIO; 1 1500
... 2 2300
vtn_salario(1).salario := 1500; ... ...
vtn_salario(2).salario := 2300;
Variables Compuestas
 RECORD
­ Tipo de dato registro PL/SQL, similar a un registro de
una tabla Oracle
­ Debe contener mas de un componente (llamados
campos) de tipo de dato escalar, TABLE o RECORD
­ Sintaxis:
TYPE tipo_registro IS RECORD (campo1 tipo_dato [NOT
NULL {:= | DEFAULT exp}], campo2 ...)
­ Ejemplo:
TYPE reg_department IS RECORD (depto_id NUMBER(2),
name VARCHAR2(15), location_id NUMBER(3))

vreg_department REG_DEPARTMENT;
...
vreg_department.depto_id := 10;
vreg_department.name := ‘SISTEMAS’; 10 SISTEMAS 123
vreg_department.location_id := 123;
Atributo %TYPE
 %TYPE
­ Define a una variable con respecto a:
• El tipo de dato de otra variable previamente declarada
• Una columna de la base de datos
­ Se utiliza como posfijo

­ Sintaxis:
nombre_variable variable%TYPE;
nombre_variable tabla.columna%TYPE;
­ Ejemplo:
vc_nombre VARCHAR2(10);
vc_apellido vc_nombre%TYPE;
vn_sueldo employee.sueldo%TYPE;
Atributo %ROWTYPE
 %ROWTYPE
­ Define una variable con respecto a la definición de un
renglón de una tabla
­ Se utiliza como sufijo
­ Los campos del registro toman el nombre y tipo de dato
de las columnas de la tabla.
­ Sólo almacena un registro a la vez.

­ Sintaxis:
nombre_variable tabla%ROWTYPE;
­ Ejemplo:
vreg_location location%ROWTYPE;
...
vreg_location.location_id := 1;
vreg_location.regional_group := ‘SAN DIEGO’;
1 SAN DIEGO
Componentes de PL/SQL
 Estructuras de control
­ Tres tipos de estructuras lógicas IF
­ Tres tipos de estructuras de ciclo

 Estructura Lógica IF
IF THEN

IF var1 > 10 THEN


var2 := var2 + 20;
END IF;

IF var1 > 10 THEN


IF var2 > var1 THEN
var2 := var1 + 20;
END IF;
END IF;
Componentes de PL/SQL
IF THEN ELSE

IF var1 > 10 THEN


var2 := var1 + 20;
ELSE
var2 := var1 * var1;
END IF;

IF var1 > 10 THEN


var2 := var1 + 20;
ELSE
IF var2 BETWEEN 7 AND 8 THEN
var2 := var2 * var1;
ELSE
var2 := var1 * var1;
END IF;
END IF;
Componentes de PL/SQL
IF THEN ELSIF

IF var1 > 10 THEN


var2 := var1 + 20;
ELSIF var2 BETWEEN 7 AND 8 THEN
var2 := var2 * var1;
ELSE
var2 := var1 * var1;
END IF;
Componentes de PL/SQL
 Ciclo
LOOP-EXIT-END LOOP

cnt := 1;

LOOP
cnt:=cnt +1;
IF cnt > 100 THEN
EXIT;
END IF;
... -- Código
END LOOP;
Componentes de PL/SQL
LOOP-EXIT WHEN-END LOOP

cnt := 1;

LOOP

EXIT WHEN cnt > 100

... -- Código
cnt := cnt + 1;
END LOOP;
Componentes de PL/SQL
WHILE-LOOP-END LOOP

cnt := 1;

WHILE cnt <= 100 LOOP

... -- Código

cnt:=cnt +1;

END LOOP;
Componentes de PL/SQL
FOR-IN-[REVERSE]-LOOP-END LOOP

FOR cnt in 1.. 100 LOOP

... -- Código

END LOOP;
 Estructura NULL
IF cnt>100 THEN
NULL;
END IF;
Select en Bloque PL/SQL
 Cláusula INTO es requerida
 El query debe regresar uno y sólo un registro

DECLARE
v_deptno department.department_id%TYPE;
v_loc department.location_id%TYPE;
BEGIN
SELECT department_id, locaction_id
INTO v_deptno, v_lo
FROM department
WHERE name = ‘SALES’;
END;
Select en Bloque PL/SQL

 Ejemplo
SET SERVEROUTPUT ON

DECLARE
v_orderdate sales_order.order_date%TYPE;
v_shipdate sales_order.ship_date%TYPE;
BEGIN
SELECT order_date, ship_date
INTO v_orderdate, v_shipdate
FROM sales_order
WHERE order_id=516;
dbms_output.put_line(‘Order Date: ’|| v_orderdate);
dbms_output.put_line(‘Ship Date: ’|| v_shipdate);
END;
Insertando datos

 Ejemplo

DECLARE
v_empno employee.employee_id%TYPE;
BEGIN
SELECT s_emp_empno.NEXTVAL
INTO v_empno
FROM dual;
INSERT INTO employee(employee_id, last_name
,first_name, job_id
,department_id)
VALUES (v_empno, ‘HARDING’, ‘ROSS’, 667,10);
END;
Actualizando datos

 Ejemplo

DECLARE
v_sal_increase employee.salary%TYPE := 2000;
BEGIN
UPDATE employee
SET salary = salary +v_sal_increase
WHERE job_id = (SELECT job_id
FROM job
WHERE function = ‘ANALYST’);
END;
Borrando datos

 Ejemplo

DECLARE
v_deptno employee.department_id%TYPE := 10;

BEGIN
DELETE employee
WHERE department_id = v_deptno;
END;
Cursores

 Un cursor es un área de trabajo privada SQL


 Hay 2 tipos de cursores
­ Implícitos
­ Explícitos
 Oracle Server utiliza cursores implícitos para
analizar y ejecutar las sentencias SQL
 Los cursores explícitos los crea el programados
Atributos del Cursor SQL

 Los atributos del cursor SQL son (cursor


implícito):
SQL
Número de registros afectados la
%ROWCOUN sentencia SQL mas reciente
T
SQL Regresa TRUE si la sentencia SQL mas
reciente afecto a uno o más registros
%FOUND
SQL
Regresa TRUE si la sentencia SQL mas
%NOTFOUN reciente afecto a uno o más registros
D Siempre es FALSE porque PL/SQL cierra
SQL automáticamente el cursor SQL después
%ISOPEN de que fue ejecutado
Control de Transacciones

 En PL/SQL se inicia una transacción con el


primero comando DML ejecutado
 Se utilizan los comandos COMMIT y ROLLBACK
para terminar la transacción explícitamente.
 Ejemplo:
BEGIN
DELETE employee
WHERE job_id = 668;
dbms_output.put_line (sql%rowcount||’ registros
borrados’);
ROLLBACK;
END;
Cursores explícitos

 Nos permiten recuperar varios renglones de una


consulta
 Son creados por el programador
 Usualmente se controlan mediante un ciclo
 Procesan cada uno de los registros recuperados
por el query
Cursores Explícitos

no
E
M si
DECLARE OPEN FETCH CLOSE
PT
Y?

•Crear el •Subir los •Pasar el •Crear un •Liberar el


Área de registros al registro ciclo para espacio en
trabajo espacio en actual de saber si memoria
memoria memoria a hay más
variables registros
Declarando un Cursor

 Sintaxis
DECLARE
CURSOR nombre_cursor IS
setencia_select;
BEGIN
...
END;

­ No debemos utilizar la cláusula INTO dentro del SELECT


­ Se pueden usar todas las opciones de la sentencia
SELECT (ORDER BY, GROUP BY, funciones de grupo, etc)
Declarando un Cursor
 Ejemplos
DECLARE
CURSOR cur_employee IS
SELECT employee_id, first_name||’ ‘||last_name name
FROM employee;

CURSOR cur_department IS
SELECT *
FROM department
WHERE department_id = 10;
BEGIN
...
END;
Abriendo el cursor
 Sintaxis
DECLARE
...
BEGIN
OPEN nombre_cursor;
...
END;

­ Si la consulta no tiene datos, no se produce una


excepción

OPEN cur_employee;
OPEN cur_department;
Recuperando
datos del cursor

 Sintaxis
FETCH nombre_cursor INTO [variable1, variable2, …
| nombre_registro];

­ Regresa los valores del registro actual del cursor en las


variables de salida
­ Debemos incluir el mismo numero de columnas en el
FETCH que en el SELECT
­ Debe haber correspondencia entre la posición de las
columnas y los tipos de datos de las variables.
­ Probar si el cursor tiene renglones recuperados
Recuperando
datos del cursor

 Ejemplos
DECLARE
CURSOR cur_employee IS
SELECT employee_id, first_name||’ ‘||last_name name
FROM employee;
v_empno employee.employee_id%TYPE;
v_name VARCHAR2(50);
BEGIN
OPEN cur_employee;
LOOP
FETCH cur_employee INTO v_empno, v_name
EXIT WHEN cur_employee%NOTFOUND;
dbms_output.put_line(v_empno||’ ‘|| v_name);
END LOOP;
END;
Cerrando el cursor
 Sintaxis
CLOSE nombre_cursor;

DECLARE
...
BEGIN
OPEN cur_employee;
LOOP
FETCH cur_employee INTO v_empno, v_name
EXIT WHEN cur_employee%NOTFOUND;
dbms_output.put_line(v_empno||’ ‘|| v_name);
END LOOP;
CLOSE cur_employee;
END;
Atributos de
cursores explícitos
 %ISOPEN - Boolean
­ Evalúa TRUE si el cursor esta abierto

 %NOTFOUND - Boolean
­ Evalúa TRUE si el FETCH mas reciente no regresa un
renglón

 %FOUND - Boolean
­ Evalúa TRUE si el FETCH mas reciente regresa un
renglón

 %ROWCOUNT - Number
­ Regresa el numero de filas que se han regresado al
momento
Cursores y Registros
 Variables tipo registro que almacene todo el
registro del cursor
 Se puede utilizar el atributo %ROWTYPE
 Se puede crear un tipo de dato RECORD y
declara la variable con respecto al tipo de dato
 Ejemplo:
DECLARE
CURSOR cur_job IS
SELECT *
FROM job;
reg_job cur_job%ROWTYPE; JOB_ID
FUNCTIO
N
BEGIN
OPEN cur_job
FECTH cur_job INTO reg_job
...
Cursor FOR LOOP
 Sintaxis
FOR nombre_registro IN nombre_cursor LOOP
sentencias;
...
END LOOP;

­ Las tareas de OPEN, FETCH y CLOSE están implícitas


dentro del cursor
­ No se declaran variables de tipo registro, ya que se
declaran implícitamente
Cursor FOR Loops
 Ejemplo
DECLARE
CURSOR cur_employee IS
SELECT employee_id, salary
FROM employee;
BEGIN
FOR reg_employee IN cur_employee LOOP
-- open y fetch implícitos
IF reg_employee.employee_id =7839 THEN
...
END LOOP;
END;
Cursor FOR Loops
usando subqueries

 No se necesita declarar el cursor


 Ejemplo:
BEGIN
FOR reg_employee IN (SELECT last_name, job_id
FROM employee) LOOP
-- open y fetch implícitos
IF reg_employee.job_id =670 then
...
END LOOP;
END;
Manejando Excepciones

 Es un identificador del PL/SQL que se “levanta”


durante la ejecución de un bloque
 ¿Cómo se levanta?
­ Cuando ocurre un error Oracle
­ Cuando se levanta explícitamente
 ¿Cómo se maneja?
­ Se puede atrapar mediante el manejador de excepciones
­ Se puede propagar al ambiente que llamó al bloque
Tipos de Excepciones

 Predefinidas por Oracle


­ Errores frecuentes
­ Existe una constante para hacer referencia a ellas
 No predefinidas por Oracle
­ Errores no tan frecuentes
­ Se debe crear una variable o constante para asignarle el
número de excepción
 Definidas por el usuario
­ Se levantan explícitamente
Manejando Excepciones

 Sintaxis
EXCEPTION
WHEN excepción [OR excepción...] THEN
sentencias;
WHEN excepción [OR excepción ...] THEN
sentencias;
WHEN others THEN
sentencias;
END;

 La palabra EXCEPTION inicia el manejo de


excepciones
 Se procesa sólo una excepción por bloque
Excepciones Predefinidas

 Ejemplos:
­ NO_DATA_FOUND
­ TOO_MANY_ROWS
­ INVALID_CURSOR
­ ZERO_DIVIDE
­ DUP_VAL_ON_INDEX

EXCEPTION
WHEN no_data_found THEN
sentencias;
WHEN dup_val_on_index THEN
sentencias;
...
Excepciones
No-Predefinidas

 Ejemplo:
DECLARE
e_dep_con_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_dep_con_fk, -2292);
BEGIN
DELETE department
WHERE department_id = 10;
EXCEPTION
WHEN e_dep_con_fk THEN
dbms_output.put_line(‘El departamento tiene
empleados’);
END;
Excepciones Definidas
por el Usuario

 Ejemplo:
DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE department
SET name = ‘Information Technology’
WHERE department_id = 99;
IF sql%notfound THEN
RAISE e_invalid_department;
ELSE
commit;
END IF;
EXCEPTION
WHEN e_invalid_department THEN
dbms_output.put_line(‘El departamente no existe’);
END;
Propagando Excepciones

DECLARE
v_employee_id employee.employee_id%TYPE;
BEGIN
sentencias;
BEGIN
SELECT employee_id
INTO v_employee_id
FROM employee;
END;
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line(‘El query regresó mas de un
registro’);
END;
SubProgramas

 Es un bloque PL/SQL que se almacena en la base


de datos con un nombre
 Existen dos tipo
­ Procedimientos (PROCEDURE)
­ Funciones (FUNCTION)
 Se pueden agrupar paquetes (PACKAGES)
Procedimientos

 SubPrograma que realizan acciones


 Se almacena en la base de datos
 Sintaxis:
[CREATE] [OR REPLACE] PROCEDURE nombre_proc
[nombre_param [modo] tipo_dato
,nombre_param[modo] tipo_dato ...] {IS|AS}
declaración variables;
BEGIN
sentencias;
EXCEPTION
manejar excepciones;
END [nombre_proc];
Modos de Parámetros
IN OUT IN OUT
Modo default Se debe Se debe
Puede llegar
especificar
El valor se especificar
al
El valor lo regresa al subPrograma
recibe el ambiente con
Igualvalor
a una y
subPrograma Igual
que loa llamó
una
Igual a una dentro
variable
constante variable no cambiarlo
inicializada
dentro del inicializada dentro del
subPrograma dentro del subPrograma
Puede tener subPrograma
No puede No puede
de inicio un tener valor tener valir
valor default default default
Llamando
un Procedimiento

 Ejemplo:
CREATE OR REPLACE PROCEDURE elimina_employee
(p_employee_id IN employee.employee_id) IS
BEGIN
DELETE employee
WHERE employee_id = p_employee_id;
END;
 Llamando a un Procedimiento:
SQL*Plus
exec[ute] elimina_employee;
Bloque PL/SQL
BEGIN
elimina_employee;
END;
SubProgramas Anidados

CREATE OR REPLACE elimina_employee


(p_employee_id NUMBER) IS
PROCEDURE inserta_bitacora IS
BEGIN
INSERT INTO bitacora
VALUES (sysdate, p_employee_id, user);
END inserta_bitacora;
BEGIN
DELETE employee
WHERE employee_id = p_employee_id;
inserta_bitacora;
END;
Pase de Parámetros

 Existen dos formas de pasar parámetros a un


subPrograma
­ Notación posicional
­ Notación nominal
 Ejemplo:
CREATE OR REPLACE PROCEDURE inserta_dep
(p_id NUMBER, p_nombre VARCHAR2, p_location NUMBER)
...
END inserta_dep;

Notación posicional
SQL> execute inserta_dep(1, ‘SISTEMAS’, 124)
Notación nominal
SQL> execute inserta_dep(p_nombre =>’SISTEMAS’,
2 p_location => 123, p_id => 1)
Funciones

 Es un bloque PL/SQL que siempre regresa un


valor
 Es llamada como parte de una expresión
 Sintaxis:
[CREATE] [OR REPLACE] FUNCTION nombre_funcion
[nombre_param [modo] tipo_dato
,nombre_param[modo] tipo_dato ...] RETURN tipo_dato
{IS | AS}
declaración variables;
BEGIN
sentencias;
EXCEPTION
manejar excepciones;
END [nombre_func];
Creando una Función

CREATE OR REPLACE FUNCTION suelto_total


(p_employee_id employee.employee_id%TYPE)
RETURN NUMBER IS
v_salario employee.employee_id%TYPE;
BEGIN
SELECT salary + nvl(commission, 0)
INTO v_salario
FROM employee
WHERE employee_id = p_employee_id;
RETURN v_salario;
END sueldo_total;
Llamado una Función

 Se invoca como parte de una expresión


SQL> SELECT sueldo_total(employee_id)
2 FROM employee

 Se utiliza una variable para almacenar el valor


que regresa la función
SQL> variable sueldo NUMBER
SQL> execute sueldo := sueldo_total(7505)
SQL> print sueldo

DECLARE
v_sueldo NUMBER(10);
BEGIN
v_sueldo := sueldo_total(7505);
END;
Restricciones
de las Funciones

 Acepta sólo parámetros de modo IN


 Cuando se manada a llamar en una expresión no
puede contener sentencias DML
 Cuando son llamadas desde una expresión no
pueden contener comandos para finalizar
transacciones
Paquetes

 Agrupan lógicamente variables PL/SQL,


subprogramas y elementos
 Consta de dos partes
­ Especificación
­ Cuerpo
 No pueden ser llamados directamente
 No pueden tener parámetros, ni pueden ser
anidados
 Se cargan completamente en memoria
 Ocultan información
­ Componentes Públicos
­ Componentes Privados
 Encapsulan lógicamente estructuras de
programas relacionadas
Estructura de Paquete

var1 NUMBER(2); Variable Pública


Package
Specification Procedimiento
PROCEDURE A; Público

var2 VARCHAR2(30) Variable Privada

Procedimiento
Package PROCEDURE B; Privado
Body Procedimiento
PROCEDURE A Público
var3 Variable Local
…;
Sintaxis de Paquete

CREATE OR REPLACE PACKAGE nombre_paquete IS


declaración de variables;
declaración de unidades de programa;
END [nombre_paquete];

CREATE OR REPLACE PACKAGE BODY nombre_paquete IS


declaración variables;
creación de unidades de programa;
BEGIN
código una-sóla-vez
END [nombre paquete];
Ejemplo
CREATE OR REPLACE PACKAGE recursosh IS
PROCEDURE asigna_comision (p_clave NUMBER, p_com NUMBER);
FUNCTION obten_comision (p_clave NUMBER) RETURN NUMBER;
END recursosh;
CREATE OR REPLACE PACKAGE BODY recursosh IS
FUNCTION obten_puesto(p_clave NUMBER) RETURN VARCHAR2 IS
v_puesto Empleados.puesto%TYPE;
BEGIN
SELECT job_id
INTO v_puesto
FROM employee
WHERE employee_id = p_clave;
RETURN(v_puesto);
END;
FUNCTION obten_comision (p_clave Number) RETURN NUMBER IS
...
END;
END recursosh;
Llamando un
Procedimiento

 Dentro del mismo paquete:


procedimiento[(parametros, ...)]
 Desde SQL*Plus
SQL> execute paquete.procedimiento[(parametros, ...)]
 Desde un programa stand-alone u otro paquete
paquete. procedimiento[(parametros, ...)]
 En general, para acceder desde fuera del paquete
a algún componente del mismo, se debe utilizar
el nombre del paquete como prefijo.
 Ejemplo:
SQL> execute recursosh.asigna_comision(1, 30)
Sobrecarga en Paquetes

 Varios subprogramas pueden tener el mismo


nombre
 Los parámetros formales de los subprogramas
deben diferir en número, orden o familia de tipo
de dato
 Los subprogramas sobrecargados se pueden
colocar dentro de un paquete o como
subprogramas locales
 Ejemplo:

CREATE OR REPLACE PACKAGE sobre_carga IS


PROCEDURE inicia (fecha DATE , n INTEGER) ;
PROCEDURE inicia (numero NUMER, n INTEGER) ;
END;
Declaraciones
FORWARD

 Los identificadores deben ser declarados antes


de que se pueda hacer referencia a ellos
 Ejemplo:
FUNCTION calcula_prod(. . .) Return Number;
FUNCTION bono_anual(. . .) Return Number IS
v_prod Number;
BEGIN
v_prod := calcula_prod(. . .);
...
END;
FUNCTION calcula_prod(. . .) Return Number IS
BEGIN
...
END;
Paquetes

 Para recompilar por completo un paquete:


ALTER PACKAGE nom_paquete COMPILE PACKAGE;
 Para recompilar una parte específica del paquete:
ALTER PACKAGE nom_paquete COMPILE
SPECIFICATION;
ALTER PACKAGE nom_paquete COMPILE BODY;
 Para eliminar por completo un paquete:
DROP PACKAGE nom_paquete;
 Para eliminar sólo el cuerpo del paquete:
DROP PACKAGE nom_paquete BODY;
Triggers

 Es un bloque PL/SQL o un procedimiento PL/SQL


asociado a una tabla, vista, esquema o base de
datos
 Permiten establecer reglas de negocio sobre los
datos
 Atrapan eventos, independientemente de la
aplicación que provoque el evento
 Se pueden utilizar para establecer una auditoria
 Producir datos derivados
 Replicar tablas
Eventos de un Triggers
LOGON,
LOGOFF
Base de datos STARTUP
SHUTDOWN,
SERVERERROR
Tabla
INSERT,
UPDATE,
DELETE
Esquema
CREATE,
ALTER,
DROP
Componentes
de un Triggers
Tiempo: 1 Objeto: 3
BEFORE nombre de objeto
AFTER DATABASE
INSTEAD OF SCHEMA

Evento: 2 Tipo: 4
INSERT, DELETE, sentencia
UPDATE [OF columna], renglón
CREATE, ALTER,
Cuerpo: 5
LOGON, LOGOFF, . . .
Procedimiento
Almacenado de
Java o de PL/SQL
Tipo y Tiempo
de Triggers

 Trigger a nivel sentencia


­ El cuerpo del trigger se ejecuta una sola vez
 Trigger a nivel renglón
­ El cuerpo del trigger se ejecuta por cada renglón
afectado por el vento del trigger
­ Sólo aplica a eventos DML
­ Es definido por la cláusula FOR EACH ROW
 BEFORE: El trigger se dispara antes de que ocurra
el evento
 AFTER: El trigger se dispara después de que
ocurre el evento
 INSTEAD OF: El trigger se dispara en lugar de
ejecutar el evento DML para cada renglón
afectado (sólo para vistas)
Sintaxis Triggers

 Los eventos UPDATE pueden ser limitados a


columnas especificas
CREATE OR REPLACE TRIGGER nombre_trigger IS
tiempo evento1 [OR evento2 OR evento3 ...]
[OF columna1, columna2 ...]
ON nombre_objeto
[FOR EACH ROW [WHEN (condición)]]
BEGIN
código;
END;
Pseudocolumnas :OLD
y :NEW

 En el cuerpo del trigger se puede hacer referencia


a columnas en los renglones afectados:
­ :OLD para hacer referencia antes de la actualización
­ :NEW para valores después de una inserción o una
actualización
 Ejemplo:
CREATE OR REPLACE TRIGGER actualiza_saldos
AFTER UPDATE OF salary ON employee
FOR EACH ROW WHEN (new.sueldo > 2000)
BEGIN
INSERT INTO bitacora
VALUES (user, sysdate, ‘Se actualizó el sueldo del
empleado ‘||:old.clave||’ de ‘||:old.salary||’ a
‘||:new.salary);
END;
INSERTING, UPDATING y
DELETING

 Son funciones booleanas


 Se utilizan para determinar el tipo de evento que
dispara un trigger, cuando éste tiene
especificado más de un evento
Función Devuelve
INSERTING TRUE si el evento de disparo es INSERT;
FALSE en caso contrario
UPDATING TRUE si el evento de disparo es UPDATE;
FALSE en caso contrario
DELETING TRUE si el evento de disparo es DELETE;
FALSE en caso contrario
Manejo de Triggers
 Para habilitar o inhabilitar un trigger
individualmente:
ALTER TRIGGER nombre_trigger {DISABLE | ENABLE};
 Para habilitar o inhabilitar todos los triggers de
una tabla
ALTER TRIGGER nombre_tabla {DISABLE | ENABLE}
ALL TRIGGERS;
 Para renombrar un trigger
ALTER TRIGGER nombre_trigger RENAME TO nuevo_nom
 Para eliminar un trigger se utiliza:
DROP TRIGGER nombre_trigger;
Ejercicios
1.- Insertar en una tabla histórica lo cambios que se realicen en los salarios de los
empleados y sus comisiones.
Esto es que cada vez que se cambie el salario o la comisión de un empleado
inmediatamente después inserte un registro en la tabla histórica (Esta deberá ser creada
con anterioridad).
La tabla histórica se llamara sueldos_emp_'Usuario' y contendrá los siguientes
campos: Id_Empleado, Fecha_Cambio, Salario, Comisión y Total_Salario.

2.- Crear una vista con los siguientes datos:


Id_Empleado, Nombre, Apellido, Descripcion_del_Puesto, Salario+Comision,
descripcion_del_departamento y los nombres de los clientes que atienden.

3.- Elaborar una función que regrese como valor el id del empleado que tenga el salario
mas grande de un departamento dado.

4.- Elaborar un procedimiento que otorgue un aumento del 15% a todos los empleados que
tenga más de quince años de laborar en la empresa.

5.- Crear un trigger que nos mande un mensaje de cada vez que insertemos un nuevo
empleado(de la tabla emp). El mensaje dira: 'Bienvenido : ' || Nombre_del_Empleado.
1.- Crear un Paquete llamado pkg_libreria que contendrá las siguientes funciones, procedimientos y
tipos de datos.
* Una Función que regrese los días que han transcurrido desde una fecha dada hasta
la fecha de hoy.
* Una Función que regrese el la descripción de un error generado por Oracle, donde
nosotros le pasemos el numero de error que produjo Oracle.
* Un Procedimiento que dé de baja a un empleado dado. El procedimiento funcionará de
la siguiente manera:
- Si el empleado existe en la employee se eliminará y se ingresaran esos datos en una
tabla donde se guardaron todo los datos de los empleados eliminados (debe crearse esa tabla
previamente, se llamarará empleados_eliminados) y mandar el mensaje “El empleado
employee_id ha sido eliminado”
- Si el empleado no existe en la tabla de employee, se debe buscar ese empleado en la
tabla empleados_eliminados si existe mandar el mensaje “El empleado employee_id ya había
sido eliminado con anterioridad”
- Si el empleado no existe en la tabla employee y tampoco en la tabla
empleados_eliminados mandar el mensaje “El empleado employee_id no existe”.
* Declarar una variable del tipo numérica con longitud de 15.
* Declarar una variable del tipo carácter de longitud igual a 300.
1.- Elaborar un procedimiento y ponerle por nombre obtiene_ordenes, recibirá como parámetro la clave
del cliente, este procedimiento obtendrá Todos los pedidos realizados por el cliente, junto con los
artículos que componen estos pedidos. Debe mandar los siguientes mensajes en el mismo formato.
Utilice cursores:

El Cliente “Nombre del Cliente” ha realizado los siguientes pedidos:


Pedido: “Numero de Pedido”
Artículos: “Descripcion delArticulo” “Cantidad” “Costo_Total”
Pedido: “Numero de Pedido”
Artículo: “Descripcion delArticulo” “Cantidad” “Costo_Total”

Utilice las siguientes tablas: SALES_ORDER, PRODUCT Y ITEM.

También podría gustarte