curso sql plsql
DESCRIPTION
excelente curso para aprender pl/sqlTRANSCRIPT
SQL*Plus y SQL*Plus y SQLSQL
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
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
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
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 especificoSQL> SELECT name
2 FROM department;
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;
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
= 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:
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 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‘);
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);
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á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%';
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 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)
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
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;
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;
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.
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
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
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
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
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
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));
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;
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]}]...);
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]}]...);
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 ];
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_tablaDROP COLUMN nombre_columna
Ejemplo:
ALTER TABLE hdatesDROP 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
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;
Creación de vistas
Sintaxis , borrar una vistaDROP VIEW vista;
Ejemplo Elimine la vista empvu10
DROP VIEW empvu10;
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;
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;
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]];
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
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
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;
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 privadoCREATE [PUBLIC] SYNONYM sinónimo FOR tabla;
EjemploCree 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
tablaemployee
CREATE INDEX i_emp_ename ON employee(employee_id);
Creación de índices
Índice usadoSQL>SELECT *
2 FROM employee
3 WHERE last_name = ‘SMITH’;
Índice no usadoSQL> 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
EjemploCree 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 ...);
EjemploDespliegue 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 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;
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;
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;
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í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
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 employeeSET job_id = 670, department_id =30WHERE 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 departmentVALUES (70, ‘PERSONAL’, 124);
SAVEPOINT A;
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;
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
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;
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;
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;
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 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’);
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;
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 employeeWHERE 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 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;
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;
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;
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
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
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.
Comandos de SQL*Plus
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
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];
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
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'
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;
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
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
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
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 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
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’);
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’);
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
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
PL/SQLPL/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
Ejemplos23_letrasprueba_nombreprueba-nombrePrueba nombreun_nombre_de_variable_demasiado_largomuchos_$$$$$$23
No esta permitido utilizar palabras reservadas como nombres de variable
Algunas palabras reservadas son:LOOPCREATESELECTINSERTFORDECLARE....
Nomenclatura 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.
Tipos de Variables
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
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
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
%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
%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
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;
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;
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;
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;
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 THENNULL;
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;
BEGINSELECT department_id, locaction_idINTO v_deptno, v_loFROM departmentWHERE name = ‘SALES’;
END;
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;
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;
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;
Borrando datos
Ejemplo
DECLARE v_deptno employee.department_id%TYPE := 10;
BEGINDELETE employeeWHERE 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):
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
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;
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
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
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)
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;
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;
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
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;
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;
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:
DECLARECURSOR cur_job IS
SELECT *FROM job;
reg_job cur_job%ROWTYPE;BEGINOPEN cur_jobFECTH cur_job INTO reg_job...
FUNCTIONJOB_ID
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
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;
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;
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
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
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;...
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;
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;
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;
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;
BEGINsentencias;
EXCEPTIONmanejar excepciones;
END [nombre_proc];
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
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;
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;
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)
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 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;
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;
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
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
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];
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;
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)
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;
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
Base de datos
Tabla
Esquema
LOGON,LOGOFFSTARTUPSHUTDOWN,SERVERERROR
INSERT,UPDATE,DELETE
CREATE,ALTER,DROP
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
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 IStiempo 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_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;
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
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;
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.