Curso SQL Plsql

214
SQL*Plus y SQL*Plus y SQL SQL

description

excelente curso para aprender pl/sql

Transcript of Curso SQL Plsql

Page 1: Curso SQL Plsql

SQL*Plus y SQL*Plus y SQLSQL

Page 2: Curso SQL Plsql

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

Page 3: Curso SQL Plsql

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

Page 4: Curso SQL Plsql

Temas del CursoContinuació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

Page 5: Curso SQL Plsql

Temas del Curso

Continuación:...

• Comandos de SQL*Plus• Creación de un archivo de reporte• Consultas avanzadas• Subconsultas

Page 6: Curso SQL Plsql

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.

Page 7: Curso SQL Plsql

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.

Page 8: Curso SQL Plsql

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.

Page 9: Curso SQL Plsql

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.

Page 10: Curso SQL Plsql

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.

Page 11: Curso SQL Plsql

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.

Page 12: Curso SQL Plsql

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.

Page 13: Curso SQL Plsql

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

Page 14: Curso SQL Plsql

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.

Page 15: Curso SQL Plsql

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

Page 16: Curso SQL Plsql

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

Page 17: Curso SQL Plsql

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 especificoSQL> SELECT name

2 FROM department;

Page 18: Curso SQL Plsql

Seleccionando Columnas Despliegue el nombre y número de todos los

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

Page 19: Curso SQL Plsql

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;

Page 20: Curso SQL Plsql

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]

Page 21: Curso SQL Plsql

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

Page 22: Curso SQL Plsql

Seleccionando Renglones

= Igual a != <> Diferente de > Mayor que >= Mayor o igual a < Menor que<= Menor o igual queBETWEEN.. AND.. Entre dos valoresIN (lista) Igual a cualquier miembro de la listaIS NULL Es un valor nulo LIKE Busca un patrón de caracteres

Operadores de comparación:

Page 23: Curso SQL Plsql

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;

Page 24: Curso SQL Plsql

Seleccionando Renglones

El operador BETWEEN permite seleccionar renglones que contengan valores dentro de un rangoDespliegue 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‘);

Page 25: Curso SQL Plsql

Seleccionando Renglones El operador IN permite seleccionar valores que

coincidan con uno de los valores en la listaDespliegue 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);

Page 26: Curso SQL Plsql

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;

Page 27: Curso SQL Plsql

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ácterDespliegue 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_id2 ,hire_date3 FROM employee4 WHERE last_neme LIKE 'M%';

Page 28: Curso SQL Plsql

Seleccionando Renglones

Empleamos el operador NOT para negar condiciones con estos operadores:

NOT BETWEEN ... AND ..

NOT IN (lista)

IS NOT NULL

NOT LIKE

Page 29: Curso SQL Plsql

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

Page 30: Curso SQL Plsql

Seleccionando RenglonesDespliegue el nombre del empleado, puesto y salario paralos gerentes que ganen $1,500 o más , también incluya alos vendedores.

SQL> SELECT last_name, job_id, salary2 FROM employee3 WHERE salary >= 1500 4 AND job_id = 671 5 OR job_id =670;

Despliegue nombre del empleado, puesto y salario paralos gerentes y vendedores que ganen $1,500 o mas.

SQL> SELECT last_name, job_id, salary2 FROM employee3 WHERE salary >= 1500 4 AND (job_id = 671 OR job_id = 670)

Page 31: Curso SQL Plsql

Seleccionando Renglones

Sintaxis del SELECTSELECT ...

FROM ...

WHERE ...

ORDER BY ...

La cláusula ORDER BY puede ordenar: Ascendente

Descendente

Por múltiples columnas

Por la posición de columnas

Page 32: Curso SQL Plsql

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_id2 FROM employee

3 WHERE department_id = 104 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_id2 FROM employee3 WHERE department_id = 104 ORDER BY salary DESC;

Page 33: Curso SQL Plsql

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, salary2 FROM employee3 WHERE department_id = 304 ORDER BY job_id, salary DESC, last_name;

Page 34: Curso SQL Plsql

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;

Page 35: Curso SQL Plsql

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.

Page 36: Curso SQL Plsql

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

Visualizando el Diccionario de Datos

Page 37: Curso SQL Plsql

Nomenclatura para laCreació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

Page 38: Curso SQL Plsql

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)

Nomenclatura para laCreación de Tablas y Vistas

Page 39: Curso SQL Plsql

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.

Page 40: Curso SQL Plsql

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.

Page 41: Curso SQL Plsql

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.

Page 42: Curso SQL Plsql

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

Page 43: Curso SQL Plsql

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

Page 44: Curso SQL Plsql

Creación de Tablas

SintaxisCREATE 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

Page 45: Curso SQL Plsql

Creación de TablasCREATE TABLE empleados

(No_Empleado NUMBER(4)CONSTRAINT pk_emp PRIMARY KEY,

Nombre VARCHAR2(10)CONSTRAINT nn_nombre NOT NULLCONSTRAINT 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 NULLCONSTRAINT fk_No_dept REFERENCES

dept(deptno));

Page 46: Curso SQL Plsql

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.

SintaxisCREATE TABLE tabla AS sentencia select;

EjemploCREATE TABLE hdatesAS SELECT employee_id, last_name, hire_date FROM employee WHERE department_id = 10;

Page 47: Curso SQL Plsql

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 ADDALTER TABLE tabla

ADD ({columna1 tipo_de_dato [DEFAULT expr] [constraint_de_columna]}

[ , {columna1 tipo_de_dato [DEFAULT expr]] [constraint_de_columna]}]...);

Page 48: Curso SQL Plsql

Modificación de Tablas

EjemploAñada una tabla a la tabla HDATES para almacenar el número de gerente

ALTER TABLE hdates

ADD (manager NUMBER(4));

Sintaxis MODIFYALTER TABLE tabla

MODIFY ({columna1 tipo_de_dato [DEFAULT expr] [constraint_de_columna]}

[ , {columna1 tipo_de_dato [DEFAULT expr]] [constraint_de_columna]}]...);

Page 49: Curso SQL Plsql

Modificación de tablas Ejemplo

Modifique la tabla hdates para que almacene 18 caracteres en el nombre

ALTER TABLE hdatesMODIFY (last_name CHAR(18));

Sintaxis-Borrar (DROP) un constraintALTER TABLE tablaDROP { PRIMARY KEY | UNIQUE (columna [, columna]...]| CONSTRAINT constraint}[CASCADE ];

Page 50: Curso SQL Plsql

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

Page 51: Curso SQL Plsql

Modificación de Tablas

Modificación de Tablas Para remover una columna de una tabla use la

sentencia: DROP COLUMN

Sintaxis:

ALTER TABLE nombre_tablaDROP COLUMN nombre_columna

Ejemplo:

ALTER TABLE hdatesDROP COLUMN manager;

Page 52: Curso SQL Plsql

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

Page 53: Curso SQL Plsql

Creación de Vistas

La creación de vistas es semejante a la creación de tablas empleando la cláusula AS SELECT

SintaxisCREATE VIEW [ OR REPLACE ] vista [(alias, [alias] ...)]AS sentencia_select;

EjemploCree una vista que contenga el número, nombre y puesto para todos los empleados en el departamento 10

CREATE VIEW empvu10AS SELECT employee_id, last_name, job_idFROM employeeWHERE department_id=10;

Page 54: Curso SQL Plsql

Creación de vistas

Sintaxis , borrar una vistaDROP VIEW vista;

Ejemplo Elimine la vista empvu10

DROP VIEW empvu10;

Page 55: Curso SQL Plsql

Vista con alias para columnas

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

Page 56: Curso SQL Plsql

Vista con alias para columnas

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

Page 57: Curso SQL Plsql

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.

SintaxisCREATE VIEW vista [ (alias, [alias]...) ]

AS sentencia

WITH CHECK OPTION [CONSTRAINT constraint]];

Page 58: Curso SQL Plsql

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

Creación de vistas con WITH CHECK OPTION

Page 59: Curso SQL Plsql

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

Page 60: Curso SQL Plsql

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.

Page 61: Curso SQL Plsql

Otorgar privilegios a tablas y vistas

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

Page 62: Curso SQL Plsql

Otorgar privilegios a tablas y vistas

Ejemplo:Otorgue privilegio de SELECT a curso1 para la tabla

department

GRANT SELECT ON department TO curso1;

Page 63: Curso SQL Plsql

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;

Page 64: Curso SQL Plsql

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

Page 65: Curso SQL Plsql

Creación de Sinónimos

Sintaxis - Sinónimo público o privadoCREATE [PUBLIC] SYNONYM sinónimo FOR tabla;

EjemploCree el sinónimo DATES para la tabla HDATES de Ward

CREATE SYNONYM dates FOR hdates;

Page 66: Curso SQL Plsql

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;

Page 67: Curso SQL Plsql

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

Page 68: Curso SQL Plsql

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

Page 69: Curso SQL Plsql

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

tablaemployee

CREATE INDEX i_emp_ename ON employee(employee_id);

Page 70: Curso SQL Plsql

Creación de índices

Índice usadoSQL>SELECT *

2 FROM employee

3 WHERE last_name = ‘SMITH’;

Índice no usadoSQL> SELECT *

2 FROM employee;

Page 71: Curso SQL Plsql

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;

Page 72: Curso SQL Plsql

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

Page 73: Curso SQL Plsql

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

Page 74: Curso SQL Plsql

Creación de Indices

Un máximo de 16 columnas pueden ser incluidas en un solo índice

EjemploCree un índice para las columnas employee_id y

last_name

CREATE INDEX i_emp_id_last_name

ON employee (employee_id, last_name);

Page 75: Curso SQL Plsql

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

Page 76: Curso SQL Plsql

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;

Page 77: Curso SQL Plsql

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;

Page 78: Curso SQL Plsql

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

Page 79: Curso SQL Plsql

Insertando Renglones

Con la sentencia INSERT se inserta un renglón a una tabla

Sintaxis :INSERT INTO tabla [ (columna1, columna2 ...)]

VALUES (valor1, valor2 ...);

EjemploDespliegue la estructura de la tabla DEPT

DESC[RIBE] department;

Page 80: Curso SQL Plsql

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

Page 81: Curso SQL Plsql

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

Page 82: Curso SQL Plsql

Insertando Renglones

Ejemplos:Inserte valores a columnas usando parámetros

INSERT INTO department

VALUES (&deptno, ‘&dname’, &loc);

Page 83: Curso SQL Plsql

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

Page 84: Curso SQL Plsql

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

Page 85: Curso SQL Plsql

Actualizando Renglones

Ejemplo - Actualice múltiples columnasCambie al empleado numero 7566 al puesto de ventas del departamento 30

SQL> UPDATE employee2 SET job_id = 670, department_id=303 WHERE employee_id = 7566;

Transferir al empleado 7788 a ventas y darle un aumento salarial del 5%

SQL> UPDATE employee1 SET job_id=670, salary = salary*1.05 2 , department_id =30 3 WHERE employee_id = 7788;

Page 86: Curso SQL Plsql

Actualizando Renglones

Ejemplo - Actualice múltiples renglonesA todos los empleados que tienen el job Sales Person

cambiarles la comisión

UPDATE employeeSET commission = 500WHERE job = 670;

Page 87: Curso SQL Plsql

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 employeeWHERE employee_id = 1234;

Page 88: Curso SQL Plsql

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

Page 89: Curso SQL Plsql

Proceso de Transacciones

COMMIT explícitoBorre el usuario LERNER y explícitamente de COMMIT a la transacción de la base de datos

SQL> DELETE employee2 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, EXITGRANT, REVOKE y RENAME

Page 90: Curso SQL Plsql

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

Page 91: Curso SQL Plsql

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

Page 92: Curso SQL Plsql

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 employeeSET job_id = 670, department_id =30WHERE employee_id = 7566;

Page 93: Curso SQL Plsql

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 departmentVALUES (70, ‘PERSONAL’, 124);

SAVEPOINT A;

Page 94: Curso SQL Plsql

Proceso de Transacciones

Use la sentencia ROLLBACK TO para hacer una anulación parcial de la transacción

EjemploInserte un nuevo departamento a la tabla deparment

INSERT INTO departmentVALUES (80, ‘EDUCATION’, 124);

Anule todas las transacciones hasta el SAVEPOINT A;

ROLLBACK TO A;

Page 95: Curso SQL Plsql

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

Page 96: Curso SQL Plsql

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

Page 97: Curso SQL Plsql

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

Page 98: Curso SQL Plsql

Referencia a valores y funciones numéricas

EjemploDespliegue 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 + commissionFROM employeeWHERE job_id = 670AND commissiom > 0.25 * salaryORDER BY 4;

Page 99: Curso SQL Plsql

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

EjemploDespliegue 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 + commissionFROM employeeWHERE department_id = 30;

Page 100: Curso SQL Plsql

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 employeeWHERE department_id = 30;

Page 101: Curso SQL Plsql

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

Page 102: Curso SQL Plsql

Valores y funciones numéricas

Ejemplo -Función ROUNDLista 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 employeeWHERE 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 employeeWHERE first_name IN (‘ALLEN’, ‘JONES’);

Page 103: Curso SQL Plsql

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 fechaFecha - Numero Resta un número de días a la fecha, regresando una fechaFecha - Fecha Resta una fecha de otra, regresando un número de días

EjemploSELECT last_name, hire_date, hire_date + 90

“REVIEW”, SYSDATE-hire_date dias_transcurridosFROM employeeWHERE department_id = 10;

Page 104: Curso SQL Plsql

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

Page 105: Curso SQL Plsql

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 employeeWHERE department_id= 20;

Page 106: Curso SQL Plsql

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;

Page 107: Curso SQL Plsql

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

Page 108: Curso SQL Plsql

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;

Page 109: Curso SQL Plsql

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

Page 110: Curso SQL Plsql

Otras Funciones

GREATEST(val1,val2) Regresa el valor mayor entre val1 y val2

LEAST (val1,val2) Regresa el valor menor entre val1 y val2

Page 111: Curso SQL Plsql

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

Page 112: Curso SQL Plsql

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

Page 113: Curso SQL Plsql

Funciones de grupo

Ejemplo Despliegue el promedio , el mas alto, y la suma de

los salarios para todos los vendedoresSELECT AVG(sal), MAX(sal), SUM(sal)FROM employeeWHERE 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;

Page 114: Curso SQL Plsql

Funciones de grupo

Ejemplo - GROUP BY Despliegue cada departamento y su numero de

personal agrupado por departamentoSELECT department_id, COUNT(*)FROM employeeGROUP BY department_id;

Si se seleccionan al mismo tiempo una funcion de grupo y una columna normal se producira un mensaje de errorSELECT department_id, COUNT(*)FROM employee;

Page 115: Curso SQL Plsql

Funciones de Grupo

Ejemplo Despliegue el numero de empleados para cada

puesto dentro de cada departamento

SELECT department_id, job_id, COUNT(*)FROM employeeGROUP BY department_id, job_id;

Page 116: Curso SQL Plsql

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 employeeGROUP BY job_idHAVING count(*)>2

Page 117: Curso SQL Plsql

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

Page 118: Curso SQL Plsql

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

Page 119: Curso SQL Plsql

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.

Comandos de SQL*Plus

Page 120: Curso SQL Plsql

Creación de un archivo de reporte

El comando SPOOL crea un archivo de impresión de el reporte

EjemploSPOOL salreportSELECT department_id, INITCAP(last_name),

salary, commission, NVL(salary,0) + NVL(commission, 0) TotFROM employeeORDER BY department_id, last_name;SPOOL OFF

Page 121: Curso SQL Plsql

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

SintaxisSELECT [tabla.]columna, [tabla.]columna ...FROM tabla1, tabla2WHERE [tabla1.columna]=[tabla2.columna];

Page 122: Curso SQL Plsql

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, departmentWHERE

employee.department_id=department.department_id

Page 123: Curso SQL Plsql

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.locFROM employee, departmentWHERE employee.department_id=

department.department_idAND employee.last_name ='WARD'

Page 124: Curso SQL Plsql

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

SintaxisSELECT tabla.columna, tabla.columna...FROM tabla1, tabla2WHERE tabla1.columna=tabla2.columna(+); òSELECT tabla.columna, tabla.columna...FROM tabla1, tabla2WHERE tabla1.columna(+)=tabla2.columna;

Page 125: Curso SQL Plsql

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_idFROM employee, departmentWHERE employee.department_id(+) = department.deparment_id

Page 126: Curso SQL Plsql

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_nameFROM employee worker, employee managerWHERE worker.manager_id = manager.employee_id

Page 127: Curso SQL Plsql

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.salaryFROM employee emp , salary_grade salWHERE sal.grade_id = 3AND emp.sal BETWEEN sal.lower_bound AND sal.upper_bound

Page 128: Curso SQL Plsql

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

Page 129: Curso SQL Plsql

Subconsultas

Sintaxis del selectSELECT ...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

Page 130: Curso SQL Plsql

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_idFROM employeeWHERE department_id =

(SELECT department_id FROM employee

WHERE UPPER(last_name) = ‘JONES’);

Page 131: Curso SQL Plsql

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 employeeWHERE salary >

(SELECT AVG(salary)FROM employee)

AND department_id IN (SELECT department_idFROM employeeWHERE last_name=‘SMITH’);

Page 132: Curso SQL Plsql

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

Page 133: Curso SQL Plsql

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

Page 134: Curso SQL Plsql

Diagrama E-R de Usuario Curso

EmployeeEmployee_Id

Department

Department_Id

Salary_Grade

Salary_Id

Products

Product_Id

Location

Location_Id

Items

Item_Id

Job

Job_Id

Customers

Customer_IdSales_Order

Order_Id

Price

Product_IdStart_Date

Page 135: Curso SQL Plsql

PL/SQLPL/SQL

Page 136: Curso SQL Plsql

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

Page 137: Curso SQL Plsql

Temas del Curso

• Actualizando datos• Borrando datos• Cursores• Manejando excepciones• Subprogramas• Procedimientos• Modos de parámetro• Funciones• Paquetes• Triggers

Page 138: Curso SQL Plsql

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

Page 139: Curso SQL Plsql

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)

Page 140: Curso SQL Plsql

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

Page 141: Curso SQL Plsql

Conjunto de caracteres de un Bloque PL/SQL

Operadores Relaciónales<> Distinto de

^= Distinto de

> Mayor que

!= Distinto de

< Menor que

= Igual

Page 142: Curso SQL Plsql

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

Page 143: Curso SQL Plsql

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

Ejemplos23_letrasprueba_nombreprueba-nombrePrueba nombreun_nombre_de_variable_demasiado_largomuchos_$$$$$$23

Page 144: Curso SQL Plsql

No esta permitido utilizar palabras reservadas como nombres de variable

Algunas palabras reservadas son:LOOPCREATESELECTINSERTFORDECLARE....

Nomenclatura de Variables

Page 145: Curso SQL Plsql

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.

Tipos de Variables

Page 146: Curso SQL Plsql

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

Page 147: Curso SQL Plsql

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

EjemploTYPE t_employee_salario IS TABLE OF NUMBER(5,2)INDEX BY BINARY_INTEGER

vtn_salario T_EMPLOYE_SALARIO;...vtn_salario(1).salario := 1500;vtn_salario(2).salario := 2300;

......

23002

15001

salario

index

Page 148: Curso SQL Plsql

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’;vreg_department.location_id := 123;

Variables Compuestas

123SISTEMAS10

Page 149: Curso SQL Plsql

%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 %TYPE

Page 150: Curso SQL Plsql

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

Atributo %ROWTYPE

SAN DIEGO1

Page 151: Curso SQL Plsql

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 THENvar2 := var2 + 20;

END IF;

IF var1 > 10 THENIF var2 > var1 THEN

var2 := var1 + 20;END IF;

END IF;

Page 152: Curso SQL Plsql

Componentes de PL/SQL

IF THEN ELSE

IF var1 > 10 THENvar2 := var1 + 20;

ELSE var2 := var1 * var1;

END IF;

IF var1 > 10 THENvar2 := var1 + 20;

ELSE IF var2 BETWEEN 7 AND 8 THEN

var2 := var2 * var1;ELSE

var2 := var1 * var1;END IF;

END IF;

Page 153: Curso SQL Plsql

Componentes de PL/SQL

IF THEN ELSIF

IF var1 > 10 THENvar2 := var1 + 20;

ELSIF var2 BETWEEN 7 AND 8 THENvar2 := var2 * var1;

ELSEvar2 := var1 * var1;

END IF;

Page 154: Curso SQL Plsql

Componentes de PL/SQL

Ciclo LOOP-EXIT-END LOOP

cnt := 1;

LOOPcnt:=cnt +1;IF cnt > 100 THEN

EXIT;END IF;... -- Código

END LOOP;

Page 155: Curso SQL Plsql

Componentes de PL/SQL

LOOP-EXIT WHEN-END LOOP

cnt := 1;

LOOP

EXIT WHEN cnt > 100

... -- Código cnt := cnt + 1;END LOOP;

Page 156: Curso SQL Plsql

Componentes de PL/SQL

WHILE-LOOP-END LOOP

cnt := 1;

WHILE cnt <= 100 LOOP

... -- Código

cnt:=cnt +1;

END LOOP;

Page 157: Curso SQL Plsql

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

END IF;

Page 158: Curso SQL Plsql

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;

BEGINSELECT department_id, locaction_idINTO v_deptno, v_loFROM departmentWHERE name = ‘SALES’;

END;

Page 159: Curso SQL Plsql

Select en Bloque PL/SQL

EjemploSET SERVEROUTPUT ON

DECLARE v_orderdate sales_order.order_date%TYPE;v_shipdate sales_order.ship_date%TYPE;

BEGINSELECT order_date, ship_dateINTO v_orderdate, v_shipdateFROM sales_orderWHERE order_id=516;dbms_output.put_line(‘Order Date: ’|| v_orderdate);dbms_output.put_line(‘Ship Date: ’|| v_shipdate);

END;

Page 160: Curso SQL Plsql

Insertando datos

Ejemplo

DECLARE v_empno employee.employee_id%TYPE;

BEGINSELECT s_emp_empno.NEXTVALINTO v_empnoFROM dual;INSERT INTO employee(employee_id, last_name

,first_name, job_id ,department_id)VALUES (v_empno, ‘HARDING’, ‘ROSS’, 667,10);

END;

Page 161: Curso SQL Plsql

Actualizando datos

Ejemplo

DECLARE v_sal_increase employee.salary%TYPE := 2000;

BEGINUPDATE employeeSET salary = salary +v_sal_increaseWHERE job_id = (SELECT job_id

FROM job WHERE function = ‘ANALYST’);

END;

Page 162: Curso SQL Plsql

Borrando datos

Ejemplo

DECLARE v_deptno employee.department_id%TYPE := 10;

BEGINDELETE employeeWHERE department_id = v_deptno;

END;

Page 163: Curso SQL Plsql

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

Page 164: Curso SQL Plsql

Atributos del Cursor SQL

Los atributos del cursor SQL son (cursor implícito):

Siempre es FALSE porque PL/SQL cierra automáticamente el cursor SQL después de que fue ejecutado

SQL%ISOPEN

Regresa TRUE si la sentencia SQL mas reciente afecto a uno o más registros

SQL%NOTFOUND

Regresa TRUE si la sentencia SQL mas reciente afecto a uno o más registros

SQL%FOUND

Número de registros afectados la sentencia SQL mas reciente

SQL%ROWCOUNT

Page 165: Curso SQL Plsql

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:BEGINDELETE employeeWHERE job_id = 668;dbms_output.put_line (sql%rowcount||’ registros borrados’);ROLLBACK;

END;

Page 166: Curso SQL Plsql

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

Page 167: Curso SQL Plsql

Cursores Explícitos

DECLARE

OPEN FETCH CLOSE

EMPTY?

•Crear el Área de trabajo

•Subir los registros al espacio en memoria

•Pasar el registro actual de memoria a variables

•Crear un ciclo para saber si hay más registros

•Liberar el espacio en memoria

no

si

Page 168: Curso SQL Plsql

Declarando un Cursor

SintaxisDECLARECURSOR nombre_cursor ISsetencia_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)

Page 169: Curso SQL Plsql

Declarando un Cursor

EjemplosDECLARE

CURSOR cur_employee ISSELECT employee_id, first_name||’ ‘||last_name

nameFROM employee;

CURSOR cur_department IS SELECT * FROM department WHERE department_id = 10;

BEGIN...END;

Page 170: Curso SQL Plsql

Abriendo el cursor

SintaxisDECLARE

...BEGINOPEN nombre_cursor;...

END;

Si la consulta no tiene datos, no se produce una excepción

OPEN cur_employee;OPEN cur_department;

Page 171: Curso SQL Plsql

Recuperando datos del cursor

SintaxisFETCH 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

Page 172: Curso SQL Plsql

Recuperando datos del cursor

EjemplosDECLARE

CURSOR cur_employee ISSELECT employee_id, first_name||’ ‘||last_name

nameFROM employee;v_empno employee.employee_id%TYPE;v_nameVARCHAR2(50);

BEGINOPEN cur_employee;LOOP

FETCH cur_employee INTO v_empno, v_nameEXIT WHEN cur_employee%NOTFOUND;dbms_output.put_line(v_empno||’ ‘|| v_name);

END LOOP;END;

Page 173: Curso SQL Plsql

Cerrando el cursor

SintaxisCLOSE nombre_cursor;

DECLARE...

BEGINOPEN cur_employee;LOOP

FETCH cur_employee INTO v_empno, v_nameEXIT WHEN cur_employee%NOTFOUND;dbms_output.put_line(v_empno||’ ‘|| v_name);

END LOOP;CLOSE cur_employee;

END;

Page 174: Curso SQL Plsql

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

Page 175: Curso SQL Plsql

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:

DECLARECURSOR cur_job IS

SELECT *FROM job;

reg_job cur_job%ROWTYPE;BEGINOPEN cur_jobFECTH cur_job INTO reg_job...

FUNCTIONJOB_ID

Page 176: Curso SQL Plsql

Cursor FOR LOOP

SintaxisFOR 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

Page 177: Curso SQL Plsql

Cursor FOR Loops

EjemploDECLARE CURSOR cur_employee IS

SELECT employee_id, salaryFROM employee;

BEGINFOR reg_employee IN cur_employee LOOP

-- open y fetch implícitosIF reg_employee.employee_id =7839 THEN...

END LOOP;END;

Page 178: Curso SQL Plsql

Cursor FOR Loops usando subqueries

No se necesita declarar el cursor Ejemplo:

BEGINFOR reg_employee IN (SELECT last_name, job_id

FROM employee) LOOP-- open y fetch implícitosIF reg_employee.job_id =670 then...

END LOOP;END;

Page 179: Curso SQL Plsql

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

Page 180: Curso SQL Plsql

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

Page 181: Curso SQL Plsql

Manejando Excepciones

SintaxisEXCEPTIONWHEN 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

Page 182: Curso SQL Plsql

Excepciones Predefinidas

Ejemplos: NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX

EXCEPTIONWHEN no_data_found THEN

sentencias;WHEN dup_val_on_index THEN

sentencias;...

Page 183: Curso SQL Plsql

Excepciones No-Predefinidas

Ejemplo:DECLARE

e_dep_con_fk EXCEPTION;PRAGMA EXCEPTION_INIT(e_dep_con_fk, -2292);

BEGINDELETE departmentWHERE department_id = 10;

EXCEPTIONWHEN e_dep_con_fk THEN

dbms_output.put_line(‘El departamento tiene empleados’);

END;

Page 184: Curso SQL Plsql

Excepciones Definidas por el Usuario

Ejemplo:DECLARE

e_invalid_department EXCEPTION;BEGINUPDATE departmentSET name = ‘Information Technology’WHERE department_id = 99;IF sql%notfound THEN

RAISE e_invalid_department;ELSE

commit;END IF;

EXCEPTIONWHEN e_invalid_department THEN

dbms_output.put_line(‘El departamente no existe’);END;

Page 185: Curso SQL Plsql

Propagando Excepciones

DECLAREv_employee_id employee.employee_id%TYPE;

BEGINsentencias;BEGIN

SELECT employee_idINTO v_employee_idFROM employee;

END;EXCEPTIONWHEN too_many_rows THEN

dbms_output.put_line(‘El query regresó mas de un registro’);

END;

Page 186: Curso SQL Plsql

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)

Page 187: Curso SQL Plsql

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;

BEGINsentencias;

EXCEPTIONmanejar excepciones;

END [nombre_proc];

Page 188: Curso SQL Plsql

Modos de Parámetros

No puede tener valir default

No puede tener valor default

Puede tener de inicio un valor default

Igual a una variable inicializada dentro del subPrograma

Igual a una variable no inicializada dentro del subPrograma

Igual a una constante dentro del subPrograma

Puede llegar al subPrograma con valor y dentro cambiarlo

El valor se regresa al ambiente que lo llamó

El valor lo recibe el subPrograma

Se debe especificar

Se debe especificar

Modo default

IN OUTOUTIN

Page 189: Curso SQL Plsql

Llamando un Procedimiento

Ejemplo:CREATE OR REPLACE PROCEDURE elimina_employee

(p_employee_id IN employee.employee_id) ISBEGINDELETE employeeWHERE employee_id = p_employee_id;

END; Llamando a un Procedimiento:

SQL*Plusexec[ute] elimina_employee;

Bloque PL/SQLBEGIN

elimina_employee;END;

Page 190: Curso SQL Plsql

SubProgramas Anidados

CREATE OR REPLACE elimina_employee (p_employee_id NUMBER) IS

PROCEDURE inserta_bitacora ISBEGIN

INSERT INTO bitacoraVALUES (sysdate, p_employee_id, user);

END inserta_bitacora;BEGIN

DELETE employeeWHERE employee_id = p_employee_id;inserta_bitacora;

END;

Page 191: Curso SQL Plsql

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 nominalSQL> execute inserta_dep(p_nombre =>’SISTEMAS’,2 p_location => 123, p_id => 1)

Page 192: Curso SQL Plsql

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

Page 193: Curso SQL Plsql

Creando una Función

CREATE OR REPLACE FUNCTION suelto_total (p_employee_id employee.employee_id%TYPE) RETURN NUMBER ISv_salario employee.employee_id%TYPE;

BEGINSELECT salary + nvl(commission, 0)INTO v_salarioFROM employeeWHERE employee_id = p_employee_id;RETURN v_salario;

END sueldo_total;

Page 194: Curso SQL Plsql

Llamado una Función

Se invoca como parte de una expresiónSQL> SELECT sueldo_total(employee_id)2 FROM employee

Se utiliza una variable para almacenar el valor que regresa la funciónSQL> variable sueldo NUMBERSQL> execute sueldo := sueldo_total(7505)SQL> print sueldo

DECLAREv_sueldo NUMBER(10);

BEGINv_sueldo := sueldo_total(7505);

END;

Page 195: Curso SQL Plsql

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

Page 196: Curso SQL Plsql

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

Page 197: Curso SQL Plsql

Estructura de Paquete

PackageSpecification

PackageBody

var1 NUMBER(2);

PROCEDURE A;

var2 VARCHAR2(30)

PROCEDURE B;

PROCEDURE A var3 …;

Variable Pública

Procedimiento Público

Variable Privada

Procedimiento Privado

Procedimiento Público

Variable Local

Page 198: Curso SQL Plsql

Sintaxis de Paquete

CREATE OR REPLACE PACKAGE nombre_paquete ISdeclaración de variables;

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

CREATE OR REPLACE PACKAGE BODY nombre_paquete ISdeclaración variables;

creación de unidades de programa;BEGIN código una-sóla-vezEND [nombre paquete];

Page 199: Curso SQL Plsql

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 ISv_puesto Empleados.puesto%TYPE;

BEGINSELECT job_idINTO v_puestoFROM employeeWHERE employee_id = p_clave;RETURN(v_puesto);

END;FUNCTION obten_comision (p_clave Number) RETURN NUMBER IS ... END;

END recursosh;

Page 200: Curso SQL Plsql

Llamando un Procedimiento

Dentro del mismo paquete:procedimiento[(parametros, ...)]

Desde SQL*PlusSQL> execute paquete.procedimiento[(parametros, ...)]

Desde un programa stand-alone u otro paquetepaquete. 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)

Page 201: Curso SQL Plsql

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 ISPROCEDURE inicia (fecha DATE , n INTEGER) ;

PROCEDURE inicia (numero NUMER, n INTEGER) ;END;

Page 202: Curso SQL Plsql

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;

Page 203: Curso SQL Plsql

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;

Page 204: Curso SQL Plsql

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

Page 205: Curso SQL Plsql

Eventos de un Triggers

Base de datos

Tabla

Esquema

LOGON,LOGOFFSTARTUPSHUTDOWN,SERVERERROR

INSERT,UPDATE,DELETE

CREATE,ALTER,DROP

Page 206: Curso SQL Plsql

Componentes de un Triggers

Objeto:nombre de objetoDATABASESCHEMA

Tipo:sentenciarenglón

Evento:INSERT, DELETE,UPDATE [OF columna],CREATE, ALTER, LOGON, LOGOFF, . . .

Tiempo:BEFOREAFTERINSTEAD OF

Cuerpo: Procedimiento Almacenado deJava o de PL/SQL

1

2

3

4

5

Page 207: Curso SQL Plsql

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)

Page 208: Curso SQL Plsql

Sintaxis Triggers

Los eventos UPDATE pueden ser limitados a columnas especificas

CREATE OR REPLACE TRIGGER nombre_trigger IStiempo evento1 [OR evento2 OR evento3 ...] [OF columna1, columna2 ...] ON nombre_objeto[FOR EACH ROW [WHEN (condición)]]BEGIN

código;END;

Page 209: Curso SQL Plsql

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_saldosAFTER UPDATE OF salary ON employeeFOR EACH ROW WHEN (new.sueldo > 2000)BEGININSERT INTO bitacora VALUES (user, sysdate, ‘Se actualizó el sueldo del empleado ‘||:old.clave||’ de ‘||:old.salary||’ a ‘||:new.salary);

END;

Page 210: Curso SQL Plsql

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

TRUE si el evento de disparo es DELETE; FALSE en caso contrario

DELETING

TRUE si el evento de disparo es UPDATE; FALSE en caso contrario

UPDATING

TRUE si el evento de disparo es INSERT; FALSE en caso contrario

INSERTING

DevuelveFunción

Page 211: Curso SQL Plsql

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

Page 212: Curso SQL Plsql

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.

Page 213: Curso SQL Plsql

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.

Page 214: Curso SQL Plsql

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.