Introduccin a Oracle
- VIEW: Permite ver una seleccin personalizada de una o ms tablas, utilizando una consulta SQL que se almacena en la base de datos.
- INDEX: Permite el acceso rpido a los datos en las tablas.
Terminologa
DDL (Data Definition Languaje) . Sentencias SQL que se usan para la creacin de objetos en la base de datos y para la administracin de estos (CREATE, ALTER, GRANT) DML (Data Manipulation Languaje). Sentencias SQL usadas para la manipulacin de datos (INSERT, UPDATE, DELETE).
COMMIT: Guarda los registros en la base de datos. ROLLBACK: Accin que realiza Oracle cuando se realizan modificaciones a la base de datos y luego se decide no guardar esta accin en la base de datos.
Terminologa
Las dos principales categoras de ordenes son: el DDL (Data Definition Languaje) y el DML (Data Manipulation Languaje)
DDL
-
** ESTRUCTURAS**
La creacin de un objeto de base de datos La eliminacin de un objeto de base de datos La modificacin de un objeto de la base de datos La concesin de privilegios sobre un objeto de la base de datos - La revocacin de privilegios sobre un objeto de la base de datos.
ALTER TABLE
- Aade una columna, modifica una columna.
CREATE TABLE
-
CREATE INDEX
-
DROP TABLE
-
DROP INDEX
Elimina un ndice.
GRANT
Otorga privilegios o roles a un usuario o a otro rol. Borra todas los registros de una tabla datos y libera espacio. Elimina los privilegios de un usuario o de un rol.
TRUNCATE
-
REVOKE
-
DML
- Permite insertar, actualizar, borrar y seleccionar datos de la base de datos
INSERT
Inserta registros a una tabla Borra registros de una tabla
DELETE
-
UPDATE
- Modifica registros de una tabla
SELECT
Recupera registros de una tabla o vista
COMMIT
Guarda los datos en la base de datos.
ROLLBACK
- Finaliza la transaccin sin guardar los datos en la base de datos.
SQL*Plus Introduccin
Seleccionando Columnas
Seleccionando Columnas
Seleccionando Columnas
Seleccionando Columnas
o para un encabezado con espacios en el nombre: SQL> SELECT DISTINCT job_id Id de Empleo 2 FROM employee;
Selecionando Renglones
La clusula WHERE permite especificar una condicin y seleccionar renglones especficos en un tabla SINTAXIS
SQL> SELECT columna [, columna ,columna ...] 2 3 4 FROM WHERE tabla condicin
[{AND|OR} condicin]
Seleccionando Renglones
Componentes de la condicin
- Nombre de la columna, expresin o constante - Operador de comparacin - Nombre de columna, expresin o constante
Las constantes tipo caracter y fecha se deben encerrar entre comillas simples. Las constantes tipo caracter son sensibles a maysculas y minsculas, y los datos tipo fecha deben estar en el formato DD-MON-YY (si est en ingls la instalacin).
Seleccionando Renglones
Operadores de comparacin:
= != <> > >= < <= BETWEEN.. AND.. IN (lista) IS NULL LIKE Igual a Diferente de Mayor que Mayor o igual a Menor que Menor o igual que Entre dos valores Igual a cualquier miembro de la lista Es un valor nulo Busca un patrn de caracteres
Seleccionando Renglones
Ejemplos:
Seleccione el nmero de empleado, apellido y salario para todos los empleados de el departamento 30 SQL> SELECT employee_id, last_name, salary 2 3 FROM employee WHERE department_id = 30;
Despliegue el nombre del empleado, puesto y salario para todos los empleados excepto los gerentes SQL> SELECT 2 3 FROM WHERE employee_id, job_i, salary employee job_id <> 671;
Seleccionando Renglones
El operador BETWEEN permite seleccionar renglones que contengan valores dentro de un rango
Despliegue el nombre del empleado, puesto, y nmero 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 3 4 FROM employee WHERE hire_date BETWEEN to_date('01-JAN-82) AND to_date('01-JAN-83);
Seleccionando Renglones
El operador IN permite seleccionar valores que coincidan con uno de los valores en la lista
Despliegue el nombre del empleado, puesto y nmero de departamento para todos los empleados que estn en el puesto de CLERK y ANALYST. SQL> SELECT last_name, job_id, department_id 2 3 FROM employee 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 comisin (el valor de la columna comisin es NULO) SQL> SELECT last_name, job_id 2 3 FROM WHERE employee commission IS NULL;
Seleccionando Renglones
Para buscar una cadena de caracteres se utiliza el operador LIKE con algunos caracteres comodn:
% Igual a cualquier nmero de caracteres _ Igual a un solo carcter Despliegue el nombre del empleado, puesto, nmero de departamento y fecha de contrato para todos aquellos empleados cuyo apellido empiece M mayscula. SQL> SELECT last_name, job_id, department_id 2 ,hire_date 3 FROM employee 4 WHERE last_neme LIKE 'M%';
Seleccionando Renglones
Seleccionando Renglones
La clusula WHERE puede calificar y seleccionar renglones especificando mas de una condicin de bsqueda, estas condiciones se pueden unir por medio de expresiones lgicas: Expresiones lgicas
- AND - OR
Precedencia
- =,!=, >,>=,<,<=, IN, LIKE, IS NULL, BETWEEN. AND . - NOT, AND , OR - Para anular las reglas de precedencia coloque parntesis
Seleccionando Renglones
Despliegue el nombre del empleado, puesto y salario para los gerentes que ganen $1,500 o ms , tambin incluya a los vendedores. SQL> SELECT last_name, job_id, salary 2 FROM employee 3 WHERE salary >= 1500 4 AND job_id = 671 5 OR job_id =670; Despliegue nombre del empleado, puesto y salario para los gerentes y vendedores que ganen $1,500 o mas. SQL> SELECT last_name, job_id, salary 2 FROM employee 3 WHERE salary >= 1500 4 AND (job_id = 671 OR job_id = 670)
Seleccionando Renglones
WHERE
...
ORDER BY ...
Seleccionando Renglones
Despliegue el salario, puesto y nombre del empleado, para el departamento 10 en orden ascendente de salario. SQL> SELECT salary, last_name, job_id 2 FROM employee 3 WHERE department_id = 10 4 ORDER BY salary; Despliegue el salario, puesto y nombre del empleado, para el departamento 10 en orden descendente de salario. SQL> SELECT salary, last_name, job_id 2 FROM employee 3 WHERE department_id = 10 4 ORDER BY salary DESC;
Seleccionando Renglones
Despliegue el nombre del empleado, puesto y salario , para aquellos empleados en el departamento 30. Ordene los resultados por puesto. Si hay mas de un empleado con el mismo puesto, ordnelos por salario en orden descendente y finalmente por su apellido. SQL> SELECT first_name, job_id, salary 2 FROM employee 3 WHERE department_id = 30 4 ORDER BY job_id, salary DESC, last_name;
Seleccionando Renglones
Despliegue el nombre del empleado, salario y puesto , para el departamento 10 en orden ascendente de salario SQL> SELECT first_name, salary, job_id 2 3 4 FROM employee WHERE department_id = 10 ORDER BY 2;
El diccionario de datos es un grupo de tablas y vistas que contiene informacin sobre las tablas, privilegios de acceso a usuarios y caractersticas de la base de datos Tablas del diccionario de datos mas frecuentemente usadas:
- USER_CATALOG: Tablas, vistas, sinnimos y secuencias pertenecientes al usuario
Creacin de tablas
El nombre de una tabla debe seguir las reglas estndar 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 carcter alfabeto
- Solamente debe contener los caracteres A-Z, a-z, 0-9, _ (subrayado) - No debe ser una palabra reservada de Oracle
Nota:
- Los nombres de tablas son lo mismo ya sea en maysculas o minsculas ( por ejem: EMP = eMP)
Tipos de Datos
CHAR(n)
- Especifica una cadena de caracteres de longitud fija, el tamao mximo 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 tamao de longitud mxima en bytes. El tamao mximo es de 2000.
NUMBER(n,d)
- Valores numricos consistentes de los dgitos 0-9, con signo (+,-), opcional y un punto decimal.
Tipo de datos
La precisin 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 mximo de dgitos y d es el numero mximo 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 tamao es en bytes. El tamao mximo es de 255 bytes y este debe ser especificado para la columna de tipo RAW.
LONG RAW
- Datos en binario de longitud variable de tamao hasta de 2 gigabytes.
Constraints
PRIMARY KEY
- Identifica de forma nica a cada rengln de la tabla
CHECK
- Especifica una condicin que cada rengln en la tabla puede satisfacer
FOREING KEY
- Designa una columna o combinacin de columnas como la llave fornea
REFERENCES
- Establece y obliga una relacin 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 travs de todos los renglones. Oracle crea un ndice nico para asegurar este constraint
ON DELETE CASCADE
- Especifica que Oracle mantendr la integridad automticamente removiendo los valores de la llave fornea dependiente si se remueven los valores de la llave primaria o nica
Creacin de Tablas
Sintaxis
CREATE TABLE [ usuario].tabla ({columna1 tipo_de_dato [DEFAULT expr] [constraint_de_columna]}
Ejemplo
- Cree la tabla de empleados
Creacin de Tablas
CREATE TABLE empleados (No_Empleado NUMBER(4) CONSTRAINT pk_emp PRIMARY KEY, Nombre VARCHAR2(10) CONSTRAINT nn_nombre NOT NULL CONSTRAINT upper_nombre CHECK (nombre=UPPER(nombre) ), Trabajo VARCHAR2(9), Gerente NUMBER(4) CONSTRAINT fk_gerente REFERENCES Empleados(No_Empleado), Fecha_Contratacion DATE DEFAULT SYSDATE, Salario NUMBER(10,2) CONSTRAINT dc-salario CHECK (salario>500), Comision NUMBER(9,2) DEFAULT 0, No_Departamento NUMBER(2) CONSTRAINT nn_No_dept NOT NULL CONSTRAINT fk_No_dept REFERENCES dept(deptno));
Creacin de Tablas
La clusula AS en el estatuto CREATE TABLE, permite crear una nueva tabla, usando los atributos de columna y datos dentro de una tabla existente. Sintaxis
CREATE TABLE tabla AS sentencia select;
Ejemplo
CREATE TABLE hdates AS SELECT employee_id, last_name, hire_date FROM employee WHERE department_id = 10;
Modificacin de Tablas
Sintaxis ADD
ALTER TABLE tabla ADD ({columna1 tipo_de_dato [DEFAULT expr] [constraint_de_columna]} [ , {columna1 tipo_de_dato [DEFAULT expr]] [constraint_de_columna]}]...);
Modificacin de Tablas
Ejemplo
Aada una tabla a la tabla HDATES para almacenar el nmero de gerente
Sintaxis MODIFY
ALTER TABLE tabla MODIFY ({columna1 tipo_de_dato [DEFAULT expr] [constraint_de_columna]} [ , {columna1 tipo_de_dato [DEFAULT expr]] [constraint_de_columna]}]...);
Modificacin de tablas
Ejemplo
- Modifique la tabla hdates para que almacene 18 caracteres en el nombre
Modificacin de Tablas
Ejemplo:
Elimine la clave primaria de la tabla dept ALTER TABLE department DROP PRIMARY KEY CASCADE; La opcin CASCADE borra las llaves forneas que hagan referencia a la llave primaria
Modificacin de Tablas
Modificacin de Tablas
- Para remover una columna de una tabla use la sentencia: DROP COLUMN
Sintaxis:
ALTER TABLE nombre_tabla DROP COLUMN nombre_columna Ejemplo: ALTER TABLE hdates DROP COLUMN manager;
Definicin de vistas
Una vista es una representacin lgica 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
Creacin de Vistas
Ejemplo
Cree una vista que contenga el nmero, nombre y puesto para todos los empleados en el departamento 10 CREATE VIEW empvu10 AS SELECT employee_id, last_name, job_id FROM employee WHERE department_id=10;
Creacin de vistas
Ejemplo
- Elimine la vista empvu10 DROP VIEW empvu10;
Ejemplo
Cree una vista que contenga el nmero 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;
Ejemplo
Cree una vista que contenga el numero de empleado, nombre y el clculo 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;
La opcin WITH CHECK OPTION asegura que los INSERTs y UPDATE`s ejecutados a travs de las vistas no afecten a los datos a los que la vista no ha permitido seleccionar.
Sintaxis
CREATE VIEW vista [ (alias, [alias]...) ] AS sentencia WITH CHECK OPTION [CONSTRAINT constraint]];
Ejemplo
Cree una vista que contenga todas las columnas de la tabla employee para el departamento 20 con WITH CHECK OPTION CREATE VIEW empvu20 AS SELECT * FROM employee
WHERE department_id=20
WITH CHECK OPTION;
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
Los dueos 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 dueo de la tabla
Como el DBA o dueo de tabla, el comando GRANT y sus opciones se utilizan para proporcionar diversos niveles de acceso a los objetos de la base de datos.
Sintaxis
GRANT privilegio, privilegio ... [o ALL] ON tabla/vista TO usuario1, usuario2... [o PUBLIC] [WITH GRANT OPTION];
Ejemplo:
Conceder todos los privilegios a todos los usuarios sobre la tabla emp
GRANT ALL ON employee TO PUBLIC;
Ejemplo:
Otorgue privilegio de SELECT a curso1 para la tabla department
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;
Sinnimos
Creacin de Sinnimos
Ejemplo
Cree el sinnimo DATES para la tabla HDATES de Ward CREATE SYNONYM dates FOR hdates;
ndices
Los ndices son estructuras opcionales asociadas a tablas empleadas para agilizar la ejecucin de consultas o garantizar la existencia nica de un rengln especfico El servidor Oracle acceda datos en dos formas mutuamente exclusivas
- FULL TABLESCAN (secuencial) - INDEX (selectiva)
La regla general para indexar es: crear un ndice si se anticipa que habr recuperacin frecuente de menos del 10 - 15% de los renglones en una tabla grande y adems las columnas son frecuentemente referenciadas por una clusula WHERE Caractersticas de las columnas para indexacin:
- La columna es usada frecuentemente en clusulas WHERE - Cada valor es nico
- Amplio rango de valores - Muchos nulos/relativamente pocos valores
Creacin de ndices
Ejemplo:
Cree un ndice sobre la columna employee_id de la tabla employee CREATE INDEX i_emp_ename ON employee(employee_id);
Creacin de ndices
ndice usado
SQL>SELECT * 2 3 FROM employee WHERE last_name = SMITH;
ndice no usado
SQL> SELECT *
2 FROM employee;
Eliminando ndices
Ejemplo :
Borre el ndice i_emp_ename; DROP INDEX i_emp_ename;
Ejemplo:
Despliegue los ndices existentes sobre la tabla employee SQL> SELECT index_name 2 3 FROM user_indexes WHERE table_name = EMPLOYEE;
Creacin de Indices
Los ndices nicos sirven para asegurar que no existan dos renglones con valores idnticos 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 nmeros de empleados CREATE UNIQUE INDEX i_emp_emp_id
ON employee(employee_id);
Creacin de Indices
Creacin de Secuencias
Se crean secuencias para generar nmeros enteros nicos para mltiples usuarios. Los nmeros de secuencia pueden ser usados para generar llaves primarias automticamente Sintaxis abreviada :
CREATE SEQUENCE secuencia
[INCREMEMENT BY (1|n) ]
[START WITH n] [ (MAXVALUE n | NOMAXVALUE) ] [ (MINVALUE n | NOMINVALUE )] ...;
Creacin de Secuencias
Ejemplos :
Cree una secuencia para employee_id empezando con el numero 8000
Creacin 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;
Ejercicios
1. Crear un ndice llamado I_EMP_EMPNO sobre la tabla employee que no permita nmeros duplicados de empleado
Insertando Renglones
Sintaxis :
INSERT INTO tabla [ (columna1, columna2 ...)] VALUES (valor1, valor2 ...);
Ejemplo
Despliegue la estructura de la tabla DEPT DESC[RIBE] department;
Insertando Renglones
Inserte el departamento de Finanzas, departamento 50 en Los Angeles , a la tabla department; SQL> INSERT INTO dept
Ejemplo :
Inserte valores a todas las columnas de la tabla employee para un nuevo empleado
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,
Insertando Renglones
Ejemplos:
Inserte valores a columnas usando parmetros INSERT INTO department VALUES (&deptno, &dname, &loc);
Se puede utilizar el comando INSERT con un query para seleccionar renglones de una tabla e insertarlos en otra
Actualizando Renglones
Se pueden cambiar los datos en una tabla especfica 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
SQL> UPDATE employee 2 SET job_id = 670, department_id=30 3 WHERE employee_id = 7566;
Transferir al empleado 7788 a ventas y darle un aumento salarial del 5% SQL> UPDATE employee 1 SET job_id=670, salary = salary*1.05 2 , department_id =30 3 WHERE employee_id = 7788;
Actualizando Renglones
A todos los empleados que tienen el job Sales Person cambiarles la comisin UPDATE employee SET commission = 500 WHERE job = 670;
Borrado de Renglones
Ejemplo :
Proceso de Transacciones
Una transaccin 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 transaccin se guarda en la base de datos, el nico que puede ver los cambios es el usuario que los hizo Un COMMIT puede ser explcito o implcito
Proceso de Transacciones
COMMIT explcito
COMMIT implcito
- Los siguientes comandos de SQL causan un commit implcito: ALTER, COMMENT, CONNECT, CREATE, DISCONNECT, DROP, EXIT GRANT, REVOKE y RENAME
Proceso de Transacciones
COMMIT automtico
- Los cambios tienen efecto inmediatamente despus de un INSERT, UPDATE o DELETE si la opcin AUTOCOMMIT se encuentra habilitado (slo 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 informacin antes del ltimo COMMIT Ejemplo :
Transferir a Jones al grupo de ventas
UPDATE employee SET job_id =670, department_id=30 WHERE first_name = JONES;
Proceso de Transacciones
Todos los empleados con el nombre JONES son transferidos al grupo de ventas. Haga rollback a la transaccion y repita la transaccion especificando el numero de empleado de Jones ROLLBACK; UPDATE employee SET job_id = 670, department_id =30 WHERE employee_id = 7566;
Proceso de Transacciones
SAVEPOINT marca un punto dentro de una transaccin particular en el cual se desea hacer un ROLLBACK parcial de la transaccin Ejemplo :
Proceso de Transacciones
Ejemplo
Inserte un nuevo departamento a la tabla deparment INSERT INTO department VALUES (80, EDUCATION, 124); Anule todas las transacciones hasta el SAVEPOINT A; ROLLBACK TO A;
Ejercicios
1. 2. 3.
4. 5.
Inserte sus datos como un nuevo empleado en la tabla employee; De COMMIT al INSERT; Inserte otro rengln de la tabla employee, solicitando el nmero de empleado, el nmero de departamento, fecha de contratacin y nombre del empleado Cree un savepoint llamado SP1 Aada un nuevo departamento a la tabla department, nmero 99, ubicacin en Maui y nombre Education
Ejercicios
1. 2. 3. 4. 5. 6.
Haga rollback a savepoint SP1 Escriba una consulta para desplegar todos los datos de la tabla department De commit a los cambios Actualice sus datos de empleado, dndose un aumento mensual de $1000 Dse de baja de la tabla employee Confirme los cambios
Los operadores aritmticos pueden ser usados en la mayora de las sentencias SQL El resultado de los clculos se puede desplegar como si fuesen columnas con expresiones aritmticas en estatutos SELECT
Ejemplo
Despliegue el salario, comisin y compensacin total para todos los vendedores cuya comisin sea mayor al 25% de su salario
SELECT last_name, salary, commission , salary + commission FROM employee WHERE job_id = 670 AND commissiom > 0.25 * salary ORDER BY 4;
Una columna de un rengln sin valor contiene un valor nulo (NULL) Cuando una funcin o expresin individual se refiere a una columna que contiene un valor nulo, el resultado es un nulo Ejemplo
Despliegue el nombre del empleado puesto, salario, comisin y compensacin total para los empleados del departamento 30
SELECT last_name, job_id, salary , commission, salary + commission FROM employee WHERE department_id = 30;
Con la funcin de valor nulo NVL, se convierte un valor nulo a uno no-nulo con el propsito de evaluar una expresin Cuando NVL evala la primer expresin, si es NOT NULL, regresa expr1, de otra forma regresa expr2 Sintaxis :
NVL(expr1, expr2) SELECT last_name, job_id, salary, commission , NVL(salary, 0) + NVL(commission,0) FROM employee WHERE department_id = 30;
SQRT(n)
-
ROUND(n,d)
TRUNC(n,d)
POWER(a,n)
Lista el nombre, salario mensual, salario diario (basado en 22 das de trabajo al mes) y salario diario redondeado al entero mas prximo para Allen y Jones
SELECT last_name, salary, salary/22, ROUND(salary/22,0) FROM employee WHERE first_name IN (ALLEN, JONES);
Repita la consulta pero con el salario diario truncado al entero mas prximo para Allen y Jones.
SELECT last_name, salary, salary/22, TRUNC(salary/22,0) FROM employee WHERE first_name IN (ALLEN, JONES);
Use las operaciones aritmticas bsicas en las sentencias SQL para ejecutar clculos sobre valores de fechas en la base de datos
Ejemplo
Fecha + Numero Aade un nmero de das a la fecha , regresando una fecha Fecha - Numero Resta un nmero de das a la fecha, regresando una fecha Fecha - Fecha Resta una fecha de otra, regresando un nmero de das
SELECT last_name, hire_date, hire_date + 90 REVIEW, SYSDATE-hire_date dias_transcurridos FROM employee WHERE department_id = 10;
NEXT_DAY(date, day)
- Despliegue las columnas de contratacin para todos los empleados en el departamento 20 con formato DD of Month YYYY. SELECT TO_CHAR(hire_date,fmDD de Month YYYY) Date of Hire FROM employee WHERE department_id= 20;
Combine columnas y constantes de caracteres en un formato que sea mas significativo en su lectura Ejemplo - Concatenacin
- Despliegue los nombres de los departamentos combinados con sus ubicaciones bajo el encabezado Departamentos. SELECT description || - ||location_id DEPARTAMENTOS FROM department;
INITCAP(cadena)
UPPER(cadena)
LOWER(cadena)
- Regresa la primer letra de cadena en mayscula y el resto en minsculas - Regresa todos los caracteres de cadena en maysculas - Regresa todos los caracteres de cadena en minsculas - Regresa el numero de caracteres de cadena
LENGTH(cadena)
- 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
Ejercicios
1. 2.
3.
4.
Despliegue el nombre de los empleados utilizando la letra inicial mayscula Calcule el nmero de meses entre la fecha de contratacin y la de hoy Ordene el resultado anterior por el numero de meses de empleo. Redondee el numero de meses al numero entero mayor mas prximo Despliegue el nombre del empleado, compensacin total y fecha de contratacin para todos los empleados cuyo salario sea mayor a 2 veces su comisin, de formato a la fecha de contratacin 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 rengln AVG(sal)
COUNT(*) MAX(sal) MIN(sal)
- Valor promedio de salario
- Numero de renglones no nulos en un grupo
SUM(comm)
Funciones de grupo
Ejemplo
- Despliegue el promedio , el mas alto, y la suma de los salarios para todos los vendedores SELECT AVG(sal), MAX(sal), SUM(sal) FROM employee WHERE job_id = 670; - Despliegue el numero de renglones en la tabla EMP, y el numero de empleados con comisin no nula SELECT COUNT(*) EMPLOYEES , COUNT (commission) COMMISION FROM employee;
Funciones de grupo
Ejemplo - GROUP BY
Si se seleccionan al mismo tiempo una funcion de grupo y una columna normal se producira un mensaje de error
SELECT department_id, COUNT(*) FROM employee;
- Despliegue cada departamento y su numero de personal agrupado por departamento SELECT department_id, COUNT(*) FROM employee GROUP BY department_id;
Funciones de Grupo
Ejemplo
- Despliegue el numero de empleados para cada puesto dentro de cada departamento SELECT department_id, job_id, COUNT(*) FROM employee GROUP BY department_id, job_id;
Funciones de Grupo
Para poner una condicin usando una funcin de grupo se utiliza la clusula HAVING Ejemplo
- Despliegue el salario anual promedio para todos los puestos con mas de 2 empleados
SELECT job_id, AVG(salary * 12) FROM employee GROUP BY job_id HAVING count(*)>2
Comandos de SQL*Plus
ECHO {ON|OFF}
- ON Los comandos ejecutados desde una archivo seran desplegados en terminal - OFF Suprime el desplegado de los comandos Despliega el numero de registros recuperados en una consulta, ON u OFF hacen que se despliegue o no el resultado
FEED[BACK]
Comandos de SQL*Plus
SPACE {1|n}
-
PAGESIZE {14|n}
Comandos de SQL*Plus
SAVE nomre_archivo{.sql}
-
START nomre_archivo{.sql}
@ nomre_archivo{.sql}
- Ejecuta un archivo script.
Crea una archivo script para despus ejecutarse. Por default guarda lo que este en el buffer.
EDIT nomre_archivo.sql
- Ejecuta un archivo script, igual que START - Ejecuta un archivo, si no se le pasa nombre de archivo edita el archivo buffer.
Consultas avanzadas
Un JOIN es la forma del comando SELECT que combina informacin de 2 o mas tablas
- Un JOIN simple o equijoin recupera renglones de 2 o mas tablas unidas en base a una condicin de igualdad en la clusula WHERE
Sintaxis
Consultas avanzadas
Ejemplo
Consultas avanzadas
Las condiciones de JOIN se especifican junto con las condiciones del WHERE Ejemplo
SELECT employee.ename, department_id.loc FROM employee, department WHERE employee.department_id= department.department_id AND employee.last_name ='WARD'
Consultas avanzadas
Un OUTER JOIN combina dos o ms tablas para recuperar informacin que no tienen relacin directa con la otra tabla Sintaxis
SELECT FROM WHERE - SELECT FROM WHERE
tabla.columna, tabla.columna... tabla1, tabla2 tabla1.columna=tabla2.columna(+); tabla.columna, tabla.columna... tabla1, tabla2 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 nmeros de departamentos y ubicaciones de oficina que actualmente no tienen empleados SELECT employee.last_name ,department.department_id ,department.location_id FROM employee, department WHERE employee.department_id(+) = department.deparment_id
Consultas Avanzadas
Un SELF JOIN hace un join a una tabla con ella misma, como si se tratara de dos tablas separadas, usada en relaciones recursivas. Ejemplo
- Despliegue la asociacin del nombre del empleado y gerente como <nombre_empleado> trabaja para <nombre_gerente> SELECT worker.last_name || ' trabaja para || manager.last_name FROM employee worker, employee manager WHERE worker.manager_id = manager.employee_id
Consultas Avanzadas
Un non-equijoin recupera renglones de de 2 o mas tablas basndose en una relacin diferente a la condicin de igualdad en la clusula WHERE Ejemplo
- Despliegue el nombre del empleado y salario para aquellos en el grado nivel 3 - * SELECT emp.last_name , emp.salary FROM employee emp , salary_grade sal WHERE sal.grade_id = 3 AND emp.sal BETWEEN sal.lower_bound AND sal.upper_bound
Subconsultas
Las subconsultas seleccionan renglones de otra tabla con una condicin que depende de valores de otra consulta Las subconsultas suelen aparecer en la clusula WHERE de los siguientes estatutos
SELECT INSERT UPDATE DELETE
Subconsultas
SELECT ... FROM ... WHERE ...( SELECT ... FROM ... WHERE ...); - Las subconsultas pueden tener varios niveles - La subconsulta puede acceder tablas que no son utilizadas por la consulta principal - Una subconsulta no puede tener una clusula ORDER BY
Subconsultas
- Despliegue el nombre y puesto de todos los empleados con el mismo departamento que Jones SELECT last_name, job_id FROM employee WHERE department_id = (SELECT department_id FROM employee WHERE UPPER(last_name) = JONES);
Subconsultas
- Despliegue nombre y fecha de contratacin de todos cuyo salario sea mayor que el salario promedio, y que trabaje en el departamento donde labore cualquier empleado llamado Smith SELECT last_name, hire_date FROM employee WHERE salary > (SELECT AVG(salary) FROM employee) AND department_id IN (SELECT department_id FROM employee WHERE last_name=SMITH);
Ejercicios
1.
Muestre los nombres de los empleados, nombre y clave del departamento donde trabaja cada empleado. La salida debe ser con los siguientes encabezados:
Empleado ----------
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. 2.
3. 4.
Muestre los nombres de los estados existentes y cuantos departamentos tiene cada estado Muestre los nombres de los estados existentes y cuantos empleados trabajan en ese estado. Muestre slo los estados que tengan mas de 5 empleados Muestre la clave de los clientes y el importe total de sus ordenes correspondientes Muestre el apellido, puesto y sueldo de todos los empleados que ganen menos del sueldo promedio
Department
Department_Id
Job
Job_Id
Location
Location_Id
Products Salary_Grade
Salary_Id Product_Id
Customers
Customer_Id
Price Sales_Order
Order_Id
Items
Item_Id
Product_Id Start_Date
PL/SQL
PL/SQL
Ventajas
-
- Se pueden tener sentencias de consultas o DML Operadores aritmticos Operadores relacionales Declaracin de variables Manejo de errores Portabilidad
Bloque PL/SQL
DECLARE (opcional) declaracin de variables; declaracin de cursores; creacin de tipos de dato; BEGIN (obligatoria) sentencias SQL; asignacin de valores; EXCEPTION (opcional) manejo de errores; END; (obligatoria)
estructuras de control;
Caracteres permitidos
- Todas las letras maysculas y minsculas - Los dgitos de 0-9 - Los smbolos ( ) + - * / <> = ! ; : . @ % , # $ ^ & _ | {} ?[]
Operadores Aritmticos
+ * ** / Suma Multiplicacin Exponenciacin Sustraccin Divisin
Operadores Relacinales
<> ^= > != < = Distinto de Distinto de Mayor que Distinto de Menor que Igual
Diversos smbolos
() ; . := || -Fin de orden
Separador de lista
Elemento separador Encierra una cadena de caracteres Asignacin Concatenacin Delimitador de comentario
/* */ Delimitadores de comentario
Nomenclatura de Variables
- Las variables deben comenzar por una letra A-Z - Pueden ir seguidas de una o mas letras, nmeros del 09 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 23_letras prueba_nombre prueba-nombre Prueba nombre un_nombre_de_variable_demasiado_largo muchos_$$$$$$ 23
Ejemplos
Nomenclatura de Variables
No esta permitido utilizar palabras reservadas como nombres de variable Algunas palabras reservadas son:
LOOP CREATE SELECT INSERT FOR DECLARE ....
Tipos de Variables
Variables PL/SQL:
- Escalar
No tienen componentes internos Mantienen un solo valor Tienen componentes internos Son reutilizables TABLE RECORD
- Compuestas
- Referencia
Cursor
Variables Escalares
Tipos de Datos:
-
Sintaxis:
VARCHAR2(long) NUMBER [(digitos,decimales)] DATE CHAR LONG LONG_ROW BINARY_INTEGER BOOLEAN PLS_INTEGER
nombre_variable [CONSTANT] tipo_dato [NOT NULL] [:=|DEFAULT valor] vd_Fecha_Entrada DATE; vn_Salario NUMBER(5,2) := 1500; vc_Nombre VARCHAR2(15) DEFAULT JONES;
Ejemplo:
Variables Compuestas
TABLE
- Tipo de dato tabla PL/SQL, similar la tabla de Oracle - Crece dinmicamente - Consta de dos columnas, una para el ndice y otra para almacenar el valor - Sintaxis: TYPE nombre_tipo IS TABLE OF tipo_dato [NOT NULL] INDEX BY BINARY_INTEGER - Ejemplo
TYPE t_employee_salario IS TABLE OF NUMBER(5,2) INDEX BY BINARY_INTEGER vtn_salario T_EMPLOYE_SALARIO; ... vtn_salario(1).salario := 1500; vtn_salario(2).salario := 2300;
index 1 2 ... salario 1500 2300 ...
Variables Compuestas
RECORD
- Tipo de dato registro PL/SQL, similar a un registro de una tabla Oracle - Debe contener mas de un componente (llamados campos) de tipo de dato escalar, TABLE o RECORD - Sintaxis: TYPE tipo_registro IS RECORD (campo1 tipo_dato [NOT NULL {:= | DEFAULT exp}], campo2 ...) - Ejemplo:
TYPE reg_department IS RECORD (depto_id NUMBER(2), name VARCHAR2(15), location_id NUMBER(3)) vreg_department REG_DEPARTMENT; ... vreg_department.depto_id := 10; vreg_department.name := SISTEMAS; vreg_department.location_id := 123;
10
SISTEMAS
123
Atributo %TYPE
%TYPE
El tipo de dato de otra variable previamente declarada Una columna de la base de datos
- Sintaxis: nombre_variable variable%TYPE; nombre_variable tabla.columna%TYPE; - Ejemplo: vc_nombre VARCHAR2(10); vc_apellido vc_nombre%TYPE; vn_sueldo employee.sueldo%TYPE;
Atributo %ROWTYPE
%ROWTYPE
- Define una variable con respecto a la definicin de un rengln de una tabla - Se utiliza como sufijo - Los campos del registro toman el nombre y tipo de dato de las columnas de la tabla. - Slo almacena un registro a la vez. - Sintaxis: nombre_variable tabla%ROWTYPE; - Ejemplo: vreg_location location%ROWTYPE; ... vreg_location.location_id := 1; vreg_location.regional_group := SAN DIEGO;
1 SAN DIEGO
Componentes de PL/SQL
Estructuras de control
Estructura Lgica IF
IF THEN IF var1 > 10 THEN var2 := var2 + 20; END IF; IF var1 > 10 THEN IF var2 > var1 THEN var2 := var1 + 20; END IF; END IF;
Componentes de PL/SQL
IF THEN ELSE IF var1 > 10 THEN var2 := var1 + 20; ELSE var2 := var1 * var1; END IF; IF var1 > 10 THEN var2 := var1 + 20; ELSE IF var2 BETWEEN 7 AND 8 THEN var2 := var2 * var1; ELSE var2 := var1 * var1; END IF; END IF;
Componentes de PL/SQL
IF THEN ELSIF IF var1 > 10 THEN var2 := var1 + 20; ELSIF var2 BETWEEN 7 AND 8 THEN var2 := var2 * var1; ELSE var2 := var1 * var1; END IF;
Componentes de PL/SQL
Ciclo
LOOP-EXIT-END LOOP
cnt := 1; LOOP cnt:=cnt +1; IF cnt > 100 THEN EXIT; END IF; ... -- Cdigo END LOOP;
Componentes de PL/SQL
LOOP-EXIT WHEN-END LOOP cnt := 1; LOOP EXIT WHEN cnt > 100 ... -- Cdigo cnt := cnt + 1; END LOOP;
Componentes de PL/SQL
WHILE-LOOP-END LOOP cnt := 1; WHILE cnt <= 100 LOOP ... -- Cdigo cnt:=cnt +1; END LOOP;
Componentes de PL/SQL
FOR-IN-[REVERSE]-LOOP-END LOOP FOR cnt in 1.. 100 LOOP ... -- Cdigo END LOOP;
Estructura NULL
IF cnt>100 THEN NULL; END IF;
Ejemplo
SET SERVEROUTPUT ON
DECLARE v_orderdate sales_order.order_date%TYPE; v_shipdate sales_order.ship_date%TYPE; BEGIN SELECT order_date, ship_date INTO v_orderdate, v_shipdate FROM sales_order WHERE order_id=516; dbms_output.put_line(Order Date: || v_orderdate); dbms_output.put_line(Ship Date: || v_shipdate); END;
Insertando datos
Ejemplo
DECLARE v_empno employee.employee_id%TYPE; BEGIN SELECT s_emp_empno.NEXTVAL INTO v_empno FROM dual; INSERT INTO employee(employee_id, last_name ,first_name, job_id ,department_id) VALUES (v_empno, HARDING, ROSS, 667,10); END;
Actualizando datos
Ejemplo
DECLARE v_sal_increase employee.salary%TYPE := 2000; BEGIN UPDATE employee SET salary = salary +v_sal_increase WHERE job_id = (SELECT job_id FROM job WHERE function = ANALYST); END;
Borrando datos
Ejemplo
DECLARE v_deptno employee.department_id%TYPE := 10; BEGIN DELETE employee WHERE department_id = v_deptno; END;
Cursores
Un cursor es un rea de trabajo privada SQL Hay 2 tipos de cursores Oracle Server utiliza cursores implcitos para analizar y ejecutar las sentencias SQL Los cursores explcitos los crea el programados
- Implcitos - Explcitos
Nmero de registros afectados la sentencia SQL mas reciente Regresa TRUE si la sentencia SQL mas reciente afecto a uno o ms registros Regresa TRUE si la sentencia SQL mas reciente afecto a uno o ms registros Siempre es FALSE porque PL/SQL cierra automticamente el cursor SQL despus de que fue ejecutado
Control de Transacciones
En PL/SQL se inicia una transaccin con el primero comando DML ejecutado Se utilizan los comandos COMMIT y ROLLBACK para terminar la transaccin explcitamente. Ejemplo:
BEGIN DELETE employee WHERE job_id = 668; dbms_output.put_line (sql%rowcount|| registros borrados); ROLLBACK; END;
Cursores explcitos
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 Explcitos
no E M si PT Y? Crear un ciclo para saber si hay ms registros
DECLARE
OPEN
FETCH
CLOSE
Declarando un Cursor
Sintaxis
DECLARE CURSOR nombre_cursor IS setencia_select; BEGIN ... END;
- No debemos utilizar la clusula INTO dentro del SELECT - Se pueden usar todas las opciones de la sentencia SELECT (ORDER BY, GROUP BY, funciones de grupo, etc)
Declarando un Cursor
Ejemplos
DECLARE CURSOR cur_employee IS SELECT employee_id, first_name|| ||last_name name FROM employee; CURSOR cur_department IS SELECT * FROM department WHERE department_id = 10; BEGIN ... END;
Abriendo el cursor
Sintaxis
DECLARE ... BEGIN OPEN nombre_cursor; ... END;
Sintaxis
FETCH nombre_cursor INTO [variable1, variable2, | nombre_registro]; - Regresa los valores del registro actual del cursor en las variables de salida - Debemos incluir el mismo numero de columnas en el FETCH que en el SELECT - Debe haber correspondencia entre la posicin de las columnas y los tipos de datos de las variables. - Probar si el cursor tiene renglones recuperados
Ejemplos
DECLARE CURSOR cur_employee IS SELECT employee_id, first_name|| ||last_name name FROM employee; v_empno employee.employee_id%TYPE; v_name VARCHAR2(50); BEGIN OPEN cur_employee; LOOP FETCH cur_employee INTO v_empno, v_name EXIT WHEN cur_employee%NOTFOUND; dbms_output.put_line(v_empno|| || v_name); END LOOP; END;
Cerrando el cursor
Sintaxis
CLOSE nombre_cursor;
DECLARE ... BEGIN OPEN cur_employee; LOOP FETCH cur_employee INTO v_empno, v_name EXIT WHEN cur_employee%NOTFOUND; dbms_output.put_line(v_empno|| || v_name); END LOOP; CLOSE cur_employee; END;
%ISOPEN - Boolean
%NOTFOUND - Boolean
%FOUND - Boolean
%ROWCOUNT - Number
Cursores y Registros
Variables tipo registro que almacene todo el registro del cursor Se puede utilizar el atributo %ROWTYPE Se puede crear un tipo de dato RECORD y declara la variable con respecto al tipo de dato Ejemplo:
DECLARE CURSOR cur_job IS SELECT * FROM job; reg_job cur_job%ROWTYPE; BEGIN OPEN cur_job FECTH cur_job INTO reg_job ...
JOB_ID
FUNCTIO N
Sintaxis
FOR nombre_registro IN nombre_cursor LOOP sentencias; ... END LOOP; - Las tareas de OPEN, FETCH y CLOSE estn implcitas dentro del cursor - No se declaran variables de tipo registro, ya que se declaran implcitamente
Ejemplo
DECLARE CURSOR cur_employee IS SELECT employee_id, salary FROM employee; BEGIN FOR reg_employee IN cur_employee LOOP -- open y fetch implcitos IF reg_employee.employee_id =7839 THEN ... END LOOP; END;
Manejando Excepciones
Es un identificador del PL/SQL que se levanta durante la ejecucin de un bloque Cmo se levanta? Cmo se maneja?
- Cuando ocurre un error Oracle - Cuando se levanta explcitamente
- Se puede atrapar mediante el manejador de excepciones - Se puede propagar al ambiente que llam al bloque
Tipos de Excepciones
- Errores frecuentes - Existe una constante para hacer referencia a ellas - Errores no tan frecuentes - Se debe crear una variable o constante para asignarle el nmero de excepcin - Se levantan explcitamente
Manejando Excepciones
Sintaxis
EXCEPTION WHEN excepcin [OR excepcin...] THEN sentencias; WHEN excepcin [OR excepcin ...] THEN sentencias; WHEN others THEN sentencias; END;
La palabra EXCEPTION inicia el manejo de excepciones Se procesa slo una excepcin por bloque
Excepciones Predefinidas
Ejemplos:
NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX
EXCEPTION WHEN no_data_found THEN sentencias; WHEN dup_val_on_index THEN sentencias; ...
Excepciones No-Predefinidas
Ejemplo:
DECLARE e_dep_con_fk EXCEPTION; PRAGMA EXCEPTION_INIT(e_dep_con_fk, -2292); BEGIN DELETE department WHERE department_id = 10; EXCEPTION WHEN e_dep_con_fk THEN dbms_output.put_line(El departamento tiene empleados); END;
Ejemplo:
DECLARE e_invalid_department EXCEPTION; BEGIN UPDATE department SET name = Information Technology WHERE department_id = 99; IF sql%notfound THEN RAISE e_invalid_department; ELSE commit; END IF; EXCEPTION WHEN e_invalid_department THEN dbms_output.put_line(El departamente no existe); END;
Propagando Excepciones
DECLARE v_employee_id employee.employee_id%TYPE; BEGIN sentencias; BEGIN SELECT employee_id INTO v_employee_id FROM employee; END; EXCEPTION WHEN too_many_rows THEN dbms_output.put_line(El query regres mas de un registro); END;
SubProgramas
Es un bloque PL/SQL que se almacena en la base de datos con un nombre Existen dos tipo Se pueden agrupar paquetes (PACKAGES)
- Procedimientos (PROCEDURE) - Funciones (FUNCTION)
Procedimientos
Modos de Parmetros
IN
Modo default El valor lo recibe el subPrograma Igual a una constante dentro del subPrograma Puede tener de inicio un valor default
Se debe especificar El valor se regresa al ambiente Igual a llam una que lo variable no inicializada dentro del subPrograma No puede tener valor default
OUT
Se debe Puede llegar especificar al subPrograma con valor y Igual a una dentro variable cambiarlo inicializada dentro del subPrograma No puede tener valir default
IN OUT
Llamando un Procedimiento
Ejemplo:
Llamando a un Procedimiento:
SQL*Plus exec[ute] elimina_employee; Bloque PL/SQL BEGIN elimina_employee; END;
CREATE OR REPLACE PROCEDURE elimina_employee (p_employee_id IN employee.employee_id) IS BEGIN DELETE employee WHERE employee_id = p_employee_id; END;
SubProgramas Anidados
CREATE OR REPLACE elimina_employee (p_employee_id NUMBER) IS PROCEDURE inserta_bitacora IS BEGIN INSERT INTO bitacora VALUES (sysdate, p_employee_id, user); END inserta_bitacora; BEGIN DELETE employee WHERE employee_id = p_employee_id; inserta_bitacora; END;
Pase de Parmetros
CREATE OR REPLACE PROCEDURE inserta_dep (p_id NUMBER, p_nombre VARCHAR2, p_location NUMBER) ... END inserta_dep; Notacin posicional SQL> execute inserta_dep(1, SISTEMAS, 124) Notacin nominal SQL> execute inserta_dep(p_nombre =>SISTEMAS, 2 p_location => 123, p_id => 1)
Funciones
Es un bloque PL/SQL que siempre regresa un valor Es llamada como parte de una expresin Sintaxis:
[CREATE] [OR REPLACE] FUNCTION nombre_funcion [nombre_param [modo] tipo_dato ,nombre_param[modo] tipo_dato ...] RETURN tipo_dato {IS | AS} declaracin variables; BEGIN sentencias; EXCEPTION manejar excepciones; END [nombre_func];
Acepta slo parmetros de modo IN Cuando se manada a llamar en una expresin no puede contener sentencias DML Cuando son llamadas desde una expresin no pueden contener comandos para finalizar transacciones
Paquetes
Agrupan lgicamente variables PL/SQL, subprogramas y elementos Consta de dos partes No pueden ser llamados directamente No pueden tener parmetros, ni pueden ser anidados Se cargan completamente en memoria Ocultan informacin
- Especificacin - Cuerpo
Estructura de Paquete
Package Specification
Variable Privada
Procedimiento Privado
Package Body
Sintaxis de Paquete
CREATE OR REPLACE PACKAGE nombre_paquete IS declaracin de variables; declaracin de unidades de programa; END [nombre_paquete]; CREATE OR REPLACE PACKAGE BODY nombre_paquete IS declaracin variables; creacin de unidades de programa; BEGIN cdigo una-sla-vez END [nombre paquete];
Ejemplo
CREATE OR REPLACE PACKAGE recursosh IS PROCEDURE asigna_comision (p_clave NUMBER, p_com NUMBER); FUNCTION obten_comision (p_clave NUMBER) RETURN NUMBER; END recursosh; CREATE OR REPLACE PACKAGE BODY recursosh IS FUNCTION obten_puesto(p_clave NUMBER) RETURN VARCHAR2 IS v_puesto Empleados.puesto%TYPE; BEGIN SELECT job_id INTO v_puesto FROM employee WHERE employee_id = p_clave; RETURN(v_puesto); END; FUNCTION obten_comision (p_clave Number) RETURN NUMBER IS ... END; END recursosh;
Llamando un Procedimiento
Desde SQL*Plus
SQL> execute paquete.procedimiento[(parametros, ...)]
En general, para acceder desde fuera del paquete a algn 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 parmetros formales de los subprogramas deben diferir en nmero, orden o familia de tipo de dato Los subprogramas sobrecargados se pueden colocar dentro de un paquete o como subprogramas locales Ejemplo:
CREATE OR REPLACE PACKAGE sobre_carga IS PROCEDURE inicia (fecha DATE , n INTEGER) ; PROCEDURE inicia (numero NUMER, n INTEGER) ; END;
Declaraciones FORWARD
Los identificadores deben ser declarados antes de que se pueda hacer referencia a ellos Ejemplo:
FUNCTION calcula_prod(. . .) Return Number; FUNCTION bono_anual(. . .) Return Number IS v_prod Number; BEGIN v_prod := calcula_prod(. . .); ... END; FUNCTION calcula_prod(. . .) Return Number IS BEGIN ... END;
Paquetes
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 aplicacin que provoque el evento Se pueden utilizar para establecer una auditoria Producir datos derivados Replicar tablas
Eventos de un Triggers
Base de datos Tabla
LOGON, LOGOFF STARTUP SHUTDOWN, SERVERERROR INSERT, UPDATE, DELETE
Esquema
Componentes de un Triggers
1 Tiempo: BEFORE AFTER INSTEAD OF 3 Objeto: nombre de objeto DATABASE SCHEMA
Evento: 2 INSERT, DELETE, UPDATE [OF columna], CREATE, ALTER, LOGON, LOGOFF, . . .
- El cuerpo del trigger se ejecuta una sola vez - El cuerpo del trigger se ejecuta por cada rengln afectado por el vento del trigger - Slo aplica a eventos DML - Es definido por la clusula FOR EACH ROW
BEFORE: El trigger se dispara antes de que ocurra el evento AFTER: El trigger se dispara despus de que ocurre el evento INSTEAD OF: El trigger se dispara en lugar de ejecutar el evento DML para cada rengln afectado (slo para vistas)
Sintaxis Triggers
En el cuerpo del trigger se puede hacer referencia a columnas en los renglones afectados:
- :OLD para hacer referencia antes de la actualizacin - :NEW para valores despus de una insercin o una actualizacin CREATE OR REPLACE TRIGGER actualiza_saldos AFTER UPDATE OF salary ON employee FOR EACH ROW WHEN (new.sueldo > 2000) BEGIN INSERT INTO bitacora VALUES (user, sysdate, Se actualiz el sueldo del empleado ||:old.clave|| de ||:old.salary|| a ||:new.salary); END;
Ejemplo:
Son funciones booleanas Se utilizan para determinar el tipo de evento que dispara un trigger, cuando ste tiene especificado ms de un evento
Funcin Devuelve
FALSE en caso contrario TRUE si el evento de disparo es UPDATE; FALSE en caso contrario TRUE si el evento de disparo es DELETE; FALSE en caso contrario
Manejo de Triggers
Ejercicios
1.- Insertar en una tabla histrica 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 comisin de un empleado inmediatamente despus inserte un registro en la tabla histrica (Esta deber ser creada con anterioridad). La tabla histrica se llamara sueldos_emp_'Usuario' y contendr los siguientes campos: Id_Empleado, Fecha_Cambio, Salario, Comisin 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 funcin 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 ms de quince aos 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 Funcin que regrese los das que han transcurrido desde una fecha dada hasta la fecha de hoy. * Una Funcin que regrese el la descripcin 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 haba 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 numrica con longitud de 15. * Declarar una variable del tipo carcter de longitud igual a 300.
1.- Elaborar un procedimiento y ponerle por nombre obtiene_ordenes, recibir como parmetro la clave del cliente, este procedimiento obtendr Todos los pedidos realizados por el cliente, junto con los artculos 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 Artculos: Descripcion delArticulo Cantidad Costo_Total Pedido: Numero de Pedido Artculo: Descripcion delArticulo Cantidad Costo_Total