SlideShare una empresa de Scribd logo
1 de 167
1-1-11 Copyright © ADA, 2005. Todos los derechos reservados.
Sesión 1Sesión 1
SQL y PL/SQLSQL y PL/SQL
1-1-22 Copyright © ADA, 2005. Todos los derechos reservados.
Introducción a SQLIntroducción a SQL
1-1-33 Copyright © ADA, 2005. Todos los derechos reservados.
ObjetivosObjetivos
• Recuperar datos de fila y de columna de las tablas con
la sentencia SELECT.
• Conocer y ejecutar sentencias DML para actualización
de datos.
• Utilizar funciones SQL para generar y recuperar datos
personalizados. Buscar datos mediante subconsultas
avanzadas.
1-1-44 Copyright © ADA, 2005. Todos los derechos reservados.
Proceso de una Consulta
Proceso
de
Usuario
Proceso
de
servidor
Select * from emp
order by name;
Select * from emp
order by name;
Parse ------------- Execute -------------------- Fetch
Ok
Resultados
Sentencia
Manejo
1-1-55 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones SQL en Oracle
DML
Lenguaje de manipulación de datos, permite recuperar y
actualizar datos. Los comandos SQL utilizados son: INSERT,
UPDATE, DELETE y SELECT.
DDL
Lenguaje de definición de datos, es utilizado para modificar la
estructura de los objetos que soportan los datos. Los comandos
SQL utilizados son: CREATE, DROP, ALTER, etc.
DCL
Lenguaje de control de datos, es utilizada para controlar el
acceso a los datos. Los comandos SQL son: GRANT y REVOKE.
Tipos de comandos SQL:
1-1-66 Copyright © ADA, 2005. Todos los derechos reservados.
Tabla de Sentencias DML
DELETE
INSERT
SELECT
UPDATE
MERGE
TRUNCATE
Table Data Manipulation Language Statements
1-1-77 Copyright © ADA, 2005. Todos los derechos reservados.
Tabla de Sentencias DDL
Table Data Definition Language Statements
ALTER CLUSTER
ALTER DATABASE
ALTER DIMENSION
ALTER FUNCTION
ALTER INDEX
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE TYPE
CREATE USER
DROP OPERATOR
DROP PACKAGE
DROP PROCEDURE
DROP PROFILE
DROP ROLE
DROP SEQUENCE
DROP SYNONYM
DROP TABLE
DROP TABLESPACE
DROP TRIGGER
1-1-88 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones SQL en Oracle
Control de Transacciones
COMMIT
ROLLBACK
SAVEPOINT
SET TRANSACTION
Table Transaction Control Statements
Control de Sesión
ALTER SESSION
SET ROLE
Table Session Control Statements
1-1-99 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones SQL en Oracle
Control de Sistema
Table System Control Statement
ALTER SYSTEM
1-1-1010 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Sentencia SELECT
La sentencia SELECT …. FROM se utiliza para consultar los
datos de las filas de una tabla de datos, siendo una tabla
estrictamente una matriz de filas y columnas.
SQL> SELECT empno, ename, sal, job FROM emp;
SQL> DESCRIBE emp;
SQL> DESC emp;
Para visualizar la estructura de una objeto se utiliza la sentencia
DESCRIBE de SQL*PLUS.
1-1-1111 Copyright © ADA, 2005. Todos los derechos reservados.
Operadores de Comparación
SQL> Select ename, sal FROM emp
WHERE sal BETWEEN 1000 AND 1500;
BETWEEN…AND
SQL> Select ename, sal, comm FROM emp
WHERE sal <= comm ;
Instrucciones DML - Sentencia SELECT
=, >, <=, <,<= , <>
1-1-1212 Copyright © ADA, 2005. Todos los derechos reservados.
Operadores de Comparación
IN (...lista...)
SQL> Select ename FROM emp
WHERE ename LIKE ‘_A%’;
LIKE
SQL> Select ename, sal, mgr FROM emp WHERE
mgr
IN (7902,7566,7788);
Instrucciones DML - Sentencia SELECT
1-1-1313 Copyright © ADA, 2005. Todos los derechos reservados.
Operadores de Comparación
IS NULL
/* Mostrar los empleados que no ganan comisión */
SQL> Select ename, job, comm FROM emp
WHERE comm IS NULL;
Instrucciones DML - Sentencia SELECT
1-1-1414 Copyright © ADA, 2005. Todos los derechos reservados.
Operadores Lógicos
AND
OR
SQL> Select ename, job, sal FROM emp
WHERE sal >=1100 AND job=‘CLERK’;
SQL> Select ename, job, sal FROM emp
WHERE sal >=1100 OR job=‘CLERK’;
Instrucciones DML - Sentencia SELECT
1-1-1515 Copyright © ADA, 2005. Todos los derechos reservados.
Operadores Lógicos
NOT
SQL> Select ename, job FROM emp
WHERE job NOT IN ( ‘CLERK’, ’MANAGER’,
’ANALYST’ );
También se puede combinar:
NOT BETWEEN - NOT NULL - NOT LIKE
Instrucciones DML - Sentencia SELECT
1-1-1616 Copyright © ADA, 2005. Todos los derechos reservados.
Cláusula ORDER BY……DESC [ASC]
SQL> Select empno, ename, sal *12 as salario
FROM emp ORDER BY salario DESC;
Instrucciones DML - Sentencia SELECT
1-1-1717 Copyright © ADA, 2005. Todos los derechos reservados.
Uso de ALIAS
SQL> Select A.empno, A.ename FROM emp A
ORDER BY A.ename DESC;
SQL> Select a.empno as codigo, a.ename as nombre
FROM emp A ORDER BY a.sal DESC;
SQL> Select a.empno codigo, a.ename nombre
FROM emp A ORDER BY sal DESC;
Instrucciones DML - Sentencia SELECT
1-1-1818 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de Conversión :
LOWER (‘CURSO SQL’)
Funciones de Carácter :
Instrucciones DML - Funciones de una Fila
UPPER (‘sql course’)
INITCAP (‘sql course’)
Función
1-1-1919 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de manipulación de caracteres :
CONCAT (‘Hola’,’como estas ’)
Instrucciones DML - Funciones de una Fila
SUBSTR (‘Profesor’,1,3)
LENGTH (‘Hola’)
Función
INSTR (‘Amigos’,’g’)
LPAD (salario,10,’*’)
TRIM (‘ Hola a todos ‘)
1-1-2020 Copyright © ADA, 2005. Todos los derechos reservados.
ROUND
Funciones numéricas :
Instrucciones DML - Funciones de una Fila
TRUNC
MOD
Función
ROUND(45.926)
TRUNC(45.926)
MOD (1600,300)
Ejemplo
45.93
45.92
100
Resultado
1-1-2121 Copyright © ADA, 2005. Todos los derechos reservados.
MONTHS_BETWEEN(‘01-ENE-05’,’01-MAR-05’)
Funciones de Fecha :
Instrucciones DML - Funciones de una Fila
ADD_MONTHS(sysdate,6)
NEXT_DAY(sysdate,1)
Función
3
11-ENE-06
Resultado
18-JUL-05
LAST_DAY(sysdate) 31-JUL-05
ROUND(sysdate,’MM’) 01-JUL-05
ROUND(sysdate,’YYYY’) 01-ENE-06
TRUNC(sysdate,’MM’) 01-JUL-05
TRUNC(sysdate,’YYYY’) 01-ENE-05
1-1-2222 Copyright © ADA, 2005. Todos los derechos reservados.
Ejemplo:
SQL> SELECT SYSDATE,ADD_MONTHS(SYSDATE,4)
AGREGAR_MES , NEXT_DAY(SYSDATE,1)
AGREGAR_SEMANA, LAST_DAY(sysdate) ULTIMO
FROM DUAL;
Instrucciones DML - Funciones de una Fila
1-1-2323 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de conversión :
Instrucciones DML - Funciones de una Fila
VARCHAR2 o CHAR
VARCHAR2 o CHAR
NUMBER
De
NUMBER
DATE
VARCHAR2
A
Conversión de tipos de datos implícitos
DATE VARCHAR2
1-1-2424 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de conversión :
Instrucciones DML - Funciones de una Fila
YYYY
YEAR
MM
Formato
Año completo
Año en texto
Número de Mes
Descripción
Conversión de tipos de datos explícitos: TO_CHAR
MONTH Mes en texto
DY Día abreviado
DAY Día en texto
1-1-2525 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de conversión :
Instrucciones DML - Funciones de una Fila
9
0
$
Formato
Representa un número
Fuerza que cero se muestre
Coloca un signo dólar
Descripción
Conversión de tipos de datos explícitos: TO_NUMBER
. Imprime un punto decimal
, Imprime un indicador de miles
1-1-2626 Copyright © ADA, 2005. Todos los derechos reservados.
Funciones de conversión :
Instrucciones DML - Funciones de una Fila
YYYY
YEAR
MM
Formato
Año completo
Año en texto
Número de Mes
Descripción
Conversión de tipos de datos explícitos: TO_DATE
MONTH Mes en texto
DY Día abreviado
DAY Día en texto
1-1-2727 Copyright © ADA, 2005. Todos los derechos reservados.
Función NVL :
Instrucciones DML - Funciones de una Fila
SQL> Select NVL(comm,0) FROM emp;
Convierte un nulo a un valor que puede ser un número,
un carácter o una fecha.
SQL> Select NVL(hiredate,sysdate) FROM emp;
SQL> Select NVL(job,’no job’) FROM emp;
1-1-2828 Copyright © ADA, 2005. Todos los derechos reservados.
EMP
Instrucciones DML - Funciones de múltiples Filas
EMPNO ENAME DEPTNO
----- ----------- ------------
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30
7566 JONES 20
7654 MARTIN 30
7698 BLAKE 30
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7844 TURNER 30
7876 ADAMS 20
7900 JAMES 30
7902 FORD 50
7934 MILLER 10
DEPTNO DNAME LOC
------ -------------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
60 PRUEBA PRUEBA
DEPT
1-1-2929 Copyright © ADA, 2005. Todos los derechos reservados.
Tipos de Join:
Instrucciones DML - Funciones de múltiples Filas
Equijoin
SQL> SELECT a.ename, a.job, a.sal, b.dname
FROM emp a, dept b WHERE a.deptno = b.deptno ;
ENAME JOB SAL DNAME
-------------------- --------------- --------- --------------
SMITH CLERK 800.00 RESEARCH
ALLEN SALESMAN 1600.00 SALES
WARD SALESMAN 1250.00 SALES
……...
JAMES CLERK 950.00 SALES
FORD ANALYST 3000.00 RESEARCH
MILLER CLERK 1300.00 ACCOUNTING
14 rows selected
1-1-3030 Copyright © ADA, 2005. Todos los derechos reservados.
Tipos de Join:
Instrucciones DML - Funciones de múltiples Filas
Non- equijoin
SQL> SELECT a.* FROM emp a, salgrade b WHERE
a.sal BETWEEN b.losal and b.hisal;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
ENAME JOB SAL GRADE
--------------- --------------- --------- ----------
SMITH CLERK 800.00 1
ADAMS CLERK 1100.00 1
JAMES CLERK 950.00 1
..…..
SCOTT ANALYST 3000.00 4
FORD ANALYST 3000.00 4
KING PRESIDENT 5000.00 5
14 rows selected
1-1-3131 Copyright © ADA, 2005. Todos los derechos reservados.
Tipos de Join:
Instrucciones DML - Funciones de múltiples Filas
Outer-Join
SQL> SELECT nvl(a.ename,'<VACIO>') ename,
NVL(a.sal,0.00) SAL, A.DEPTNO, NVL(b.dname,'NULL')
FROM emp a, dept b WHERE
a.deptno = b.deptno (+);
1-1-3232 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Funciones de múltiples Filas
EMPNO ENAME DEPTNO
----- ----------- ------------
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30
7566 JONES 20
7654 MARTIN 30
7698 BLAKE 30
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7844 TURNER 30
7876 ADAMS 20
7900 JAMES 30
7902 FORD 50
7934 MILLER 10
DEPTNO DNAME LOC
------ -------------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
60 PRUEBA PRUEBA
EMP DEPT
1-1-3333 Copyright © ADA, 2005. Todos los derechos reservados.
Resultado:
Instrucciones DML - Funciones de múltiples Filas
ENAME SAL DEPTNO DNAME
-------------------- ---------- ------------- --------------
SMITH 800 20 RESEARCH
ALLEN 1600 30 SALES
WARD 1250 30 SALES
JONES 2975 20 RESEARCH
MARTIN 1250 30 SALES
BLAKE 2850 30 SALES
CLARK 2450 10 ACCOUNTING
SCOTT 3000 20 RESEARCH
KING 5000 10 ACCOUNTING
TURNER 1500 30 SALES
ADAMS 1100 20 RESEARCH
JAMES 950 30 SALES
FORD 3000 50 NULL
MILLER 1300 10 ACCOUNTING
14 rows selected
1-1-3434 Copyright © ADA, 2005. Todos los derechos reservados.
Tipos de Join:
Instrucciones DML - Funciones de múltiples Filas
Outer-Join
SQL> SELECT nvl(a.ename,'<VACIO>') ename,
NVL(a.sal,0.00) SAL, NVL(A.DEPTNO,0) DEPTNO ,
NVL(b.dname,'NULL') FROM emp a, dept b
WHERE a.deptno (+) = b.deptno;
1-1-3535 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Funciones de múltiples Filas
EMPNO ENAME DEPTNO
----- ----------- ------------
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30
7566 JONES 20
7654 MARTIN 30
7698 BLAKE 30
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7844 TURNER 30
7876 ADAMS 20
7900 JAMES 30
7902 FORD 50
7934 MILLER 10
DEPTNO DNAME LOC
------ -------------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
60 PRUEBA PRUEBA
EMP DEPT
1-1-3636 Copyright © ADA, 2005. Todos los derechos reservados.
Resultado:
Instrucciones DML - Funciones de múltiples Filas
ENAME SAL DEPTNO DNAME
-------------------- ---------- ------------- --------------
CLARK 2450 10 ACCOUNTING
KING 5000 10 ACCOUNTING
MILLER 1300 10 ACCOUNTING
SMITH 800 20 RESEARCH
ADAMS 1100 20 RESEARCH
SCOTT 3000 20 RESEARCH
JONES 2975 20 RESEARCH
ALLEN 1600 30 SALES
BLAKE 2850 30 SALES
MARTIN 1250 30 SALES
JAMES 950 30 SALES
TURNER 1500 30 SALES
WARD 1250 30 SALES
<VACIO> 0 0 OPERATIONS
<VACIO> 0 0 PRUEBA
15 rows selected
1-1-3737 Copyright © ADA, 2005. Todos los derechos reservados.
Tipos de Join:
Instrucciones DML - Funciones de múltiples Filas
Self Join
SQL> SELECT a.ename EMPLEADO,a.sal SALARIO,
a.job OCUPACION, m.ename MANAGER
FROM emp a, emp m WHERE
a.mgr = m.empno and a.empno=7369;
EMPLEADO SALARIO OCUPACION MANAGER
-------------------- -------------- --------------- --------------------
SMITH 800.00 CLERK FORD
1-1-3838 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Funciones de múltiples Filas
EMPNO ENAME JOB MGR
------- -------------------- --------------- -------
7369 SMITH CLERK 7902
7499 ALLEN SALESMAN 7698
7521 WARD SALESMAN 7698
7566 JONES MANAGER 7839
7654 MARTIN SALESMAN 7698
7698 BLAKE MANAGER 7839
7782 CLARK MANAGER 7839
7788 SCOTT ANALYST 7566
7839 KING PRESIDENT
7844 TURNER SALESMAN 7698
7876 ADAMS CLERK 7788
7900 JAMES CLERK 7698
7902 FORD ANALYST 7566
7934 MILLER CLERK 7782
EMP
1-1-3939 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Funciones de Grupo
AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANCE
Ejemplo:
SQL> SELECT deptno, AVG(sal) FROM emp
GROUP BY deptno;
Estas funciones operan en grupos de registros para
entregar un resultado por grupos.
Estas funciones son:
DEPTNO AVG(SAL)
------ ----------
10 2916.66666666667
20 2175
30 1566.66666666667
1-1-4040 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Funciones de Grupo
Ejemplo:
SQL> SELECT deptno, job, sum(sal) FROM emp
GROUP BY deptno, job ;
DEPTNO JOB SUM(SAL)
----------- --------------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
1-1-4141 Copyright © ADA, 2005. Todos los derechos reservados.
HAVING
Instrucciones DML - Funciones de Grupo
Este comando permite filtrar los registros
agrupados.
Ejemplo:
SQL> SELECT deptno, job, sum(sal) FROM emp GROUP BY deptno, job
HAVING sum(sal)>2500;
DEPTNO JOB SUM(SAL)
----------- --------------- ----------
10 PRESIDENT 5000
20 ANALYST 6000
20 MANAGER 2975
30 MANAGER 2850
30 SALESMAN 5600
1-1-4242 Copyright © ADA, 2005. Todos los derechos reservados.
ROLLUP, CUBE
Instrucciones DML - Funciones de Grupo
Estos comandos se utilizan
para totalizar los grupos de
datos.
Ejemplo:
SQL> SELECT deptno, job,
sum(sal) FROM emp
GROUP BY
ROLLUP(deptno,job) ;
DEPTNO JOB SUM(SAL)
------ --------------- -------------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30 9400
2902529025
1-1-4343 Copyright © ADA, 2005. Todos los derechos reservados.
ROLLUP, CUBE
Instrucciones DML - Funciones de Grupo
Ejemplo:
SQL> SELECT deptno, job,
sum(sal) FROM emp
GROUP BY
CUBE (deptno, job) ;
DEPTNO JOB SAL
------ --------------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 ANALYST 6000
20 CLERK 1900
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600
30 9400
ANALYST 6000
CLERK 4150
MANAGER 8275
PRESIDENT 5000
SALESMAN 5600
2902529025
1-1-4444 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Subconsultas
Se puede manejar dentro de la cláusula de una
sentencia SELECT otra sentencia SELECT. La
cláusula puede ser :
WHERE, HAVING o FROM
Sintaxis:
SELECT select_list FROM table
WHERE expresión operador (SELECT select_list
FROM table) ;
Donde operador puede ser :
>, =, >=,<,<>, >= ó IN, ANY, ALL
1-1-4545 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Subconsultas
a. Subconsultas de una fila
SQL> SELECT ename, sal FROM emp
WHERE sal > (SELECT sal FROM emp WHERE
empno=7566) ;
ENAME SAL
-------------------- -----------
SCOTT 3000.00
KING 5000.00
FORD 3000.00
Tipos de Subconsultas :
SAL
---------
2975.00
1-1-4646 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Subconsultas
b. Subconsultas de múltiples filas
SQL> SELECT ename, sal, deptno FROM emp
WHERE sal IN (SELECT min(sal) FROM emp
group by deptno) ;
ENAME SAL DEPTNO
-------------------- --------- ------
SMITH 800.00 20
JAMES 950.00 30
MILLER 1300.00 10
Tipos de Subconsultas :
MIN(SAL)
----------
1300
800
950
1-1-4747 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML - Subconsultas
b. Subconsultas de múltiples columnas
SQL> SELECT ename, sal, deptno FROM emp
WHERE (deptno,sal) IN (SELECT
deptno,min(sal) FROM emp
group by deptno);
Tipos de Subconsultas :
1-1-4848 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia INSERT
Forma Convencional
SQL> INSERT INTO emp
VALUES (2296, ’AROMANO’, ’SALESMAN’, 7782 ,
to_date( ‘03/02/1997 ’, ’dd/mm/yyyy’ ), 1300 ,
NULL, 10) ;
Con variables de sustitución
SQL> INSERT INTO dept (deptno, dname, loc)
VALUES ( &departamento, ’&Nombre’,
’&Localizacion’ ) ;
1-1-4949 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia INSERT
Con prompts personalizados
SQL> ACCEPT depto_id prompt ‘Ingrese número dpto: ‘;
SQL> ACCEPT name_id prompt ‘Ingrese nombre dpto: ‘;
SQL> INSERT INTO dept (deptno, dname)
VALUES (&depto_id, ‘&name_id’ );
1-1-5050 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia INSERT
Copiando filas de otra tabla
SQL> INSERT INTO managers (id, name, salary,
hiredate) SELECT empno, ename, sal, hiredate
FROM emp WHERE job = ‘MANAGER’ ;
3 rows inserted
1-1-5151 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia UPDATE
Forma convencional
SQL> UPDATE emp SET deptno = 20
WHERE empno=7782;
Con una subconsulta de múltiples columnas
SQL> UPDATE emp SET ( job , deptno) = ( Select job,
deptno FROM emp WHERE empno = 7788 )
WHERE empno = 7698 ;
JOB DEPTNO
-------------- -----------
ANALYST 20
1-1-5252 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia UPDATE
Basándose en otras tablas
SQL> UPDATE emp
SET deptno = ( Select deptno FROM emp WHERE
empno = 7788 )
WHERE job = (Select job FROM emp WHERE
empno = 7788 ) ;
DEPTNO
------
20
JOB
---------------
CLERK
1-1-5353 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia DELETE
Forma convencional
SQL> DELETE FROM dept
WHERE dname = ‘RESEARCH’ ;
Basándose en otra Tabla
SQL> DELETE FROM emp
WHERE deptno = (SELECT deptno FROM dept
WHERE dname = ‘SALES’ ) ;
1-1-5454 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia MERGE
Forma convencional
SQL> MERGE INTO bonus D
USING (SELECT ename,job,sal,comm FROM emp
WHERE deptno = 30) S
ON (D.ename = S.ename)
WHEN MATCHED THEN
UPDATE SET D.comm = S.sal*1.25
WHEN NOT MATCHED THEN
INSERT (D.ename,D.job,D.sal,D.comm)
VALUES (S.ename,S.job,S.sal,S.sal*1.25);
1-1-5555 Copyright © ADA, 2005. Todos los derechos reservados.
Instrucciones DML – Sentencia TRUNCATE
Forma convencional
SQL> TRUNCATE TABLE bonus;
1-1-5656 Copyright © ADA, 2005. Todos los derechos reservados.
Introducción a PL/SQLIntroducción a PL/SQL
1-1-5757 Copyright © ADA, 2005. Todos los derechos reservados.
ObjetivosObjetivos
• Explicar como la arquitectura de PL/SQL mejora el
funcionamiento de una aplicación.
• Identificar las importantes extensiones que PL/SQL
proporciona a SQL.
• Escribir y ejecutar bloques de PL/SQL.
1-1-5858 Copyright © ADA, 2005. Todos los derechos reservados.
Estructura de un bloque PL/SQL
BLOQUE PL/SQL
DECLARE
.......
........
BEGIN
.....
.....
....
EXCEPTION
.....
......
END ;
Se declaran Variables, Exceptions
y Cursores.
Se manipulan las variables y cursores ya
definidos. Aquí se dan las instrucciones
procedimentales y de SQL. Es la única
sección obligatoria.
Para manejar errores que puedan existir
en el bloque anterior. Es decir, aquí se
introducen las rutinas de manejo de
Errores.
1-1-5959 Copyright © ADA, 2005. Todos los derechos reservados.
NOTA
- Solo se requiere que aparezca la sección ejecutable.
- Solo se permiten las siguientes instrucciones SQL en
un bloque PL/SQL:
- Las instrucciones terminan con un ; ( Punto y coma)
- Se permite el uso de comentarios, usando para ello:
Estructura de un bloque PL/SQL
INSERT UPDATE DELETE SELECT
- - comentario
/ * comentario * /
1-1-6060 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
....
BEGIN
.......
BEGIN
....
END;
EXCEPTION
WHEN OTHERS THEN
BEGIN
....
END;
END ;
Cualquier bloque puede
contener sub - bloques. Un
sub-bloque se puede colocar
en las sección ejecutable y
de manejo de errores de un
bloque.
Estructura de un bloque PL/SQL
1-1-6161 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
BEGIN
.......
.......
La sección DECLARE forma parte
del bloque PL/SQL, y en ella se
declaran variables, cursores y
excepciones.
Palabras reservadas
Las palabras reservadas son los
nombres que utiliza Oracle para la
ejecución de sus procesos.
Sección de Declarativa
1-1-6262 Copyright © ADA, 2005. Todos los derechos reservados.
Sección Declarativa : Variables Tipo Escalar
NUMBER
BYNARY_INTEGER
CHAR
VARCHAR2
DATE
BOOLEAN
Tipos de datos Escalar Descripción
Enteros con o sin decimales
Únicamente enteros
Caracteres de longitud fija
Caracteres de longitud variable.
Valores de fecha
TRUE, FALSE, NULL
1-1-6363 Copyright © ADA, 2005. Todos los derechos reservados.
Nombre_variable [CONSTANT] tipo_de_dato
[NOT NULL] [ : = expresion_sql ] ;
REGLAS
- Comienzan con una letra
- Luego de la letra pueden colocarse números, letras y/o
caracteres especiales.
- Los nombres de las variables no son mas de 30 caracteres,
y no pueden incluirse espacios.
SINTAXIS
Sección Declarativa : Variables Tipo Escalar
1-1-6464 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_fecha DATE;
v_apellido VARCHAR2(20);
......
......
Ejemplo:
Sección Declarativa : Variables Tipo Escalar
1-1-6565 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_estado_civil CHAR ;
v_direccion VARCHAR2 (20);
v_nombre VARCHAR2 (10) := ‘Juan’ ;
v_apellido VARCHAR2 (10) NOT NULL := ‘Perez’;
CHAR / VARCHAR2
Sección Declarativa : Variables Tipo Escalar
1-1-6666 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_On_Off BOOLEAN NOT NULL := FALSE;
v_Tipo_pago BOOLEAN;
BOOLEAN
Sección de Declarativa : Variables Tipo Escalar
1-1-6767 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_contador NUMBER ;
v_salario NUMBER (6,2) ;
v_minutos_diarios NUMBER := 24 * 60 ;
v_total_ingresos BINARY_INTEGER (10) := 0 ;
NUMBER / BINARY_INTEGER
Sección de Declarativa : Variables Tipo Escalar
1-1-6868 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_fecha_pago DATE := ‘31-JUN-02’ ;
v_fecha_bodas DATE ;
v_fecha_inicio DATE NOT NULL := ‘01-JAN-90’ ;
DATE
Sección Declarativa : Variables Tipo Escalar
1-1-6969 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_nombre CONSTANT VARCHAR2 (10) := ‘Iris’;
v_minutos_diarios CONSTANT NUMBER := 24 * 60 ;
CONSTANTES
Sección Declarativa : Variables Tipo Escalar
1-1-7070 Copyright © ADA, 2005. Todos los derechos reservados.
TYPE nombre_tipo IS TABLE OF tipo_dato [ NOT NULL]
INDEX BY BYNARY_INTEGER ;
TABLE
Sección Declarativa : Variables Tipo Compuesto
Es un tipo de variable definido por el usuario, que permite
personalizar la estructura de los datos que manipula un programa.
Las filas de estos no son almacenadas en orden particular, pero su
índice o número identificador permite locarlizarla y ordenarlas al
momento que se realice un recuperación de estos, igual que un
arreglo (array).
Sintaxis :
1-1-7171 Copyright © ADA, 2005. Todos los derechos reservados.
TYPE munitabla_tipo IS TABLE OF varchar2 (10);
TYPE sal IS TABLE OF number;
TYPE fec_nac IS TABLE OF date;
TYPE periodo_tipo IS TABLE OF char(5);
Sección Declarativa : Variables Tipo Compuesto
Ejemplo:
1-1-7272 Copyright © ADA, 2005. Todos los derechos reservados.
RECORD
Sección Declarativa : Variables Tipo Compuesto
Son datos relacionados almacenados en campos, c/u
de ellos tiene su propio nombre y tipo de dato.
TYPE nombre_tipo IS RECORD
(campo1 tipo_dato [ NOT NULL] ,
campo2 tipo_dato [ NOT NULL] ,
....) ;
nombre_record NOMBRE_TIPO;
Sintaxis :
1-1-7373 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
TYPE datamuni_tipo IS RECORD
(municipalidad NUMBER(4),
nombre_muni VARCHAR2(50),
total_personas NUMBER(3));
data_muni DATAMUNI_TIPO;
RECORD
Sección Declarativa : Variables Tipo Compuesto
Ejemplo :
1-1-7474 Copyright © ADA, 2005. Todos los derechos reservados.
TYPE nombre_tipo IS VARRAY(tamaño_maximo)
OF tipo_elemento [NOT NULL];
VARRAY
Sección Declarativa : Variables Tipo Compuesto
Permiten asociar a un simple identificador toda una
colección o grupo de datos.
SINTAXIS
Donde, tipo_elemento, es cualquier tipo de datos de PL/SQL a excepción
de:
Binary_integer, Boolean, Long, Long raw, Nchar, Nvarchar2, Nclob, Table,
Ref cursor, Positive, Natural, NaturalN, String, Pls_integer, Signtype,
PositiveN
1-1-7575 Copyright © ADA, 2005. Todos los derechos reservados.
Conversión de Datos
PL/SQL soporta una conversión explícita y una implícita
(la cual es automática)
Conversión EXPLICITA
Date
Number
Char
Char
Char
Char
Date
Number
De Función
TO_DATE
TO_NUMBER
TO_CHAR
TO_CHAR
A
PL/SQL no puede convertir un varchar2 que contiene
valores caracteres alfabéticos a un tipo NUMERICO.
1-1-7676 Copyright © ADA, 2005. Todos los derechos reservados.
Conversión de Datos
Conversión IMPLICITA
PL/SQL convierte automáticamente un tipo de dato de
una columna fuente al tipo de dato de la variable.
Si PL /SQL no pudiera realizar la conversión
automáticamente, se generará un error de compilación
y deberá usarse una función .
1-1-7777 Copyright © ADA, 2005. Todos los derechos reservados.
Conversión de Datos
DECLARE
v_fecha_nac CHAR(5) := &que_año_naciste;
v_fecha_actual CHAR(5) ;
v_edad_hoy NUMBER(5) ;
BEGIN
SELECT TO_CHAR(SYSDATE,’YYYY’) INTO v_fecha_actual
FROM DUAL;
v_edad_hoy := v_fecha_actual - v_fecha_nac ;
END ;
Ejemplo :
1-1-7878 Copyright © ADA, 2005. Todos los derechos reservados.
SQL en Bloques PL/SQL
DECLARE
v_cod_cargo NUMBER(4) := 10;
v_nombre_cargo VARCHAR2 (25) := ‘OBRERO’;
BEGIN
INSERT INTO cargos VALUES (v_cod_cargo,
v_nombre_cargo);
END;
Ejemplo con INSERT:
1-1-7979 Copyright © ADA, 2005. Todos los derechos reservados.
SQL en Bloques PL/SQL
DECLARE
v_prueba CHAR(1) := ‘X’;
BEGIN
UPDATE cargos SET nomb_cargo = ( v_prueba || ‘ ‘ ||
nomb_cargo ) WHERE cargoid<3;
END;
Ejemplo con UPDATE:
1-1-8080 Copyright © ADA, 2005. Todos los derechos reservados.
SQL en Bloques PL/SQL
DECLARE
v_cod_cargo NUMBER(4) := 10;
v_nombre_cargo VARCHAR2 (25) := ‘OBRERO’;
BEGIN
DELETE FROM cargos WHERE cargoid = cod_cargo;
END;
Ejemplo con DELETE:
1-1-8181 Copyright © ADA, 2005. Todos los derechos reservados.
SQL en Bloques PL/SQL
DECLARE
------
BEGIN
-----
SELECT col1 [ ,col2,col3,....] INTO var1 [ , var2, var3, ...........]
FROM nombre_tabla
WHERE condicion1 [ AND / OR condicion2.....] ;
END;
SELECT:
La instrucción SELECT debe regresar exactamente un registro, si
regresa 0 ó mas de 1 registro, ocurrirá un error.
Sintaxis:
1-1-8282 Copyright © ADA, 2005. Todos los derechos reservados.
IF < expresión> THEN
<secuencia de sentencias>
[ ELSIF <expresión booleana > THEN
<secuencia de sentencias> ]
[ ELSIF <expresión booleana > THEN
<secuencia de sentencias> ]
[ ELSE <expresión booleana >
<secuencia de sentencias> ]
END IF;
IF
Control Condicional e Interactivo
Sintaxis:
1-1-8383 Copyright © ADA, 2005. Todos los derechos reservados.
IF v_ingresos >= 20000 THEN
v_impuestos := 18 ;
ELSIF (v_ingresos > = 15 and v_ingresos < 20000 ) THEN
v_impuestos : = 15 ;
ELSE
v_impuestos := 10 ;
END IF ;
IF
Control Condicional e Interactivo
Ejemplo:
1-1-8484 Copyright © ADA, 2005. Todos los derechos reservados.
LOOP
Control Condicional e Interactivo
La sentencia LOOP se utiliza para ejecutar múltiples
veces una secuencia de instrucciones. PL/SQL provee
diferentes tipos de LOOPS:
- Basic LOOP
- WHILE loop
- FOR loop
- Cursor FOR loop
1-1-8585 Copyright © ADA, 2005. Todos los derechos reservados.
LOOP
< secuencia de sentencias >
END LOOP;
Basic LOOP
Control Condicional e Interactivo
Sintaxis :
Donde:
Secuencia de sentencias es un grupo de sentencias
que se repetirá una o varias veces hasta que se
ejecute un EXIT que estará dentro del grupo de
sentencias.
1-1-8686 Copyright © ADA, 2005. Todos los derechos reservados.
a := 0;
LOOP
a := a+1 ;
IF a = 10 THEN
EXIT ;
END IF ;
END LOOP;
Basic LOOP
Control Condicional e Interactivo
Ejemplo:
1-1-8787 Copyright © ADA, 2005. Todos los derechos reservados.
Basic LOOP
Control Condicional e Interactivo
También se puede terminar el bucle con la sentencia EXIT
WHEN,
EXIT WHEN <condición> ;
Ejemplo:
a := 0;
LOOP
a := a+1 ;
EXIT WHEN a := 10 ;
END LOOP;
1-1-8888 Copyright © ADA, 2005. Todos los derechos reservados.
FOR LOOP
Control Condicional e Interactivo
Repiten una secuencia de instrucciones una
determinada cantidad de veces:
Sintaxis:
FOR <índice> IN [ REVERSE ] <entero>..<entero> LOOP
< secuencia de sentencias >
END LOOP;
1-1-8989 Copyright © ADA, 2005. Todos los derechos reservados.
FOR LOOP
Control Condicional e Interactivo
Donde:
• Índice, es un índice numérico que identifica a la variable
que será aumentada o disminuida, esta no necesita ser
declarada en la sección DECLARE.
• REVERSE, nos indica que la secuencia del índice ira
disminuyendo.
• Entero, es el rango de números de la secuencia que
índice deberá recorrer.
1-1-9090 Copyright © ADA, 2005. Todos los derechos reservados.
FOR a IN 1..10 LOOP
b := a+1 ;
END LOOP;
FOR a IN REVERSE 1..10 LOOP
b := a+10 ;
END LOOP;
FOR LOOP
Control Condicional e Interactivo
Ejemplo:
1-1-9191 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_a NUMBER(3) := 0 ;
v_b NUMBER(3) := 0 ;
BEGIN
FOR v_a IN 1..50 LOOP
INSERT INTO temp (a, g) VALUES ( v_a+v_b, ‘DEFECTO’) ;
END LOOP;
FOR v_b IN REVERSE 1..50 LOOP
INSERT INTO temp (a, g) VALUES ( v_a+v_b, ‘REVERSA’) ;
END LOOP;
END ;
Control Condicional e Interactivo
1-1-9292 Copyright © ADA, 2005. Todos los derechos reservados.
WHILE LOOP
Control Condicional e Interactivo
Repiten una secuencia de instrucciones siempre y
cuando la condición expresada inicialmente se cumpla.
SIntaxis:
WHILE <condición> LOOP
< secuencia de sentencias >
END LOOP;
1-1-9393 Copyright © ADA, 2005. Todos los derechos reservados.
WHILE LOOP
Control Condicional e Interactivo
Donde:
Condición, es la condición que deberá cumplirse antes
de que se pueda ejecutar la secuencia de instrucciones
o sentencias que siguen a continuación.
NOTA:
La diferencia con el LOOP SIMPLE es que se ejecuta
aunque sea una vez, mientras que WHILE LOOP
puede que no se ejecute ni una vez ya que la condición
inicial así lo puede determinar.
1-1-9494 Copyright © ADA, 2005. Todos los derechos reservados.
WHILE v_declarada < 10 LOOP
v_declarada := v_declarada +1 ;
END LOOP;
WHILE LOOP
Control Condicional e Interactivo
Ejemplo:
1-1-9595 Copyright © ADA, 2005. Todos los derechos reservados.
DECLARE
v_a NUMBER (3) : = 10 ;
v_b temp.a%TYPE : = 1 ;
BEGIN
WHILE v_a > 1 LOOP
INSERT INTO temp (a,g,h) VALUES (v_a,’ while’, ‘a’) ;
v_a : = v_a - 1 ;
END LOOP;
WHILE v_b < 10 LOOP
INSERT INTO temp (a,g,h) VALUES (v_b,’ while’, ‘b’) ;
v_b : = v_b + 1 ;
END LOOP;
END ;
Control Condicional e Interactivo
1-1-9696 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores
Oracle permite abrir y nombrar un area de trabajo que
guardará la información procesada.
Sintaxis:
CURSOR <nombre_cursor>
IS < Instrucción select >
1-1-9797 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores
Ejemplos:
CURSOR c1 IS
SELECT empno, ename, job, sal
FROM emp WHERE sal > 2000;
CURSOR c2 IS
SELECT * FROM dept WHERE deptno = 10;
1-1-9898 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores
Ejemplo:
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_datos IS SELECT deptno,dname FROM DEPT;
vDEPTNO NUMBER(2);
vDNAME VARCHAR2(14);
BEGIN
OPEN c_datos;
LOOP
FETCH c_datos INTO vDEPTNO,vDNAME;
EXIT WHEN c_datos%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ...
nombre: '||vDNAME) ;
END LOOP;
CLOSE c_datos;
END;
1-1-9999 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Son aquellos que se forman con una sentencia SELECT que
recupera múltiples renglones.
El siguiente ejemplo es un CURSOR EXPLICITO.
DECLARE
CURSOR c_1 IS SELECT ename FROM emp;
v_name varchar2(10);
BEGIN
OPEN c_1 ;
FETCH c_1 INTO v_name;
CLOSE c_1 ;
END ;
1-1-100100 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Permite recuperar los registros del cursor, uno por uno.
Sintaxis:
FECTH nombre_cursor
INTO nombre_variable1[,nombre_variable2,…];
FECTH … INTO
1-1-101101 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Este atributo es verdadero si el FETCH no regresa ninguna
fila. Sintaxis:
nombre_cursor%NOTFOUND;
ATRIBUTO: %NOTFOUND
LOOP
FETCH c_1 INTO c_periodo;
EXIT WHEN c_1%NOTFOUND;
END LOOP ;
Ejemplo:
1-1-102102 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Este atributo es verdadero si el FETCH regresa una fila,
inicialmente es NULL, y si no regresa ninguna fila es
FALSE.
Sintaxis:
nombre_cursor%FOUND ;
ATRIBUTO: %FOUND
1-1-103103 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Ejemplo:
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_datos IS SELECT deptno,dname FROM DEPT;
vDEPTNO NUMBER(2);
vDNAME VARCHAR2(14);
BEGIN
OPEN c_datos;
FETCH c_datos INTO vDEPTNO,vDNAME;
WHILE c_datos%FOUND LOOP
DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre:
'||vDNAME) ;
FETCH c_datos INTO vDEPTNO,vDNAME;
END LOOP;
CLOSE c_datos;
END;
1-1-104104 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Este atributo cuenta el número de registros que se han
obtenido con el FETCH. Cuando el cursor es abierto
tiene el valor de 0 (cero).
Sintaxis:
nombre_cursor%ROWCOUNT;
ATRIBUTO: %ROWCOUNT
1-1-105105 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Ejemplo:
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_datos IS SELECT deptno,dname FROM DEPT;
vDEPTNO NUMBER(2);
vDNAME VARCHAR2(14);
BEGIN
OPEN c_datos;
DBMS_OUTPUT.PUT_LINE( c_datos%rowcount );
FETCH c_datos INTO vDEPTNO,vDNAME;
DBMS_OUTPUT.PUT_LINE( c_datos%rowcount );
WHILE c_datos%FOUND LOOP
DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre: '||vDNAME);
FETCH c_datos INTO vDEPTNO,vDNAME;
END LOOP;
DBMS_OUTPUT.PUT_LINE( c_datos%rowcount );
CLOSE c_datos;
END;
1-1-106106 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
El atributo te permite saber si el cursor esta abierto, en
cuyo caso retorna el valor de TRUE, caso contrario retorna
FALSE.
Sintaxis:
nombre_cursor%ISOPEN;
ATRIBUTO: %ISOPEN
1-1-107107 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_datos IS SELECT deptno,dname FROM DEPT;
vDEPTNO NUMBER(2);
vDNAME VARCHAR2(14);
BEGIN
IF c_datos%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE( 'cursor abierto' );
ELSE
DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' );
END IF;
OPEN c_datos;
IF c_datos%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE( 'cursor abierto' );
ELSE
DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' );
END IF;
1-1-108108 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
FETCH c_datos INTO vDEPTNO,vDNAME;
WHILE c_datos%FOUND LOOP
DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ...
nombre: '||vDNAME) ;
FETCH c_datos INTO vDEPTNO,vDNAME;
END LOOP;
CLOSE c_datos;
IF c_datos%ISOPEN THEN
DBMS_OUTPUT.PUT_LINE( 'cursor abierto' );
ELSE
DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' );
END IF;
END;
1-1-109109 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Esta forma especial de FOR especifica que se ejecutará una
secuencia de instrucciones cada vez que el cursor regrese un
renglón.
Sintaxis:
FOR < nombre_registro > IN < nombre_cursor > LOOP
< secuencia de instrucciones >
END LOOP ;
Sentencia FOR para Cursores
1-1-110110 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
Cuando un ciclo del cursor FOR se inicia, se ejecuta un
OPEN implícito al cursor.
Para cada registro que satisface la consulta asociada con el
cursor, se ejecuta un FETCH implícito sobre las variables
de <nombre_registro>.
Cuando ya no hay más registros que extraer se ejecuta un
CLOSE implícito sobre el cursor, y así termina el ciclo.
Sentencia FOR para Cursores
1-1-111111 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: EXPLICITOS
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_datos IS SELECT deptno,dname FROM DEPT;
BEGIN
FOR v_datos IN c_datos LOOP
DBMS_OUTPUT.PUT_LINE( 'codigo: ' || v_datos.deptno || ' ...
nombre: '||v_datos.dname) ;
END LOOP;
END;
Ejemplo:
1-1-112112 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: IMPLICITOS
SQL%NOTFOUND
Solo funciona con instrucciones SQL DML. Un cursor
implícito es llamado también CURSOR SQL.
Atributos de Cursores Implícitos
SQL%FOUND
SQL%ROWCOUNT
1-1-113113 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: IMPLICITOS
Es verdadero si la ultima instrucción SQL ejecutada no
implicó ningún registro.
Ejemplo :
ATRIBUTO: %NOTFOUND
SET SERVEROUTPUT ON;
BEGIN
DELETE FROM emp WHERE empno=9999;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE( 'No existe empleado' ) ;
END IF;
END;
1-1-114114 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: IMPLICITOS
Es verdadero si la última instrucción SQL ejecutada
implicó algún registro.
Ejemplo :
ATRIBUTO: %FOUND
SET SERVEROUTPUT ON;
DECLARE
v_ename varchar2(14);
BEGIN
select ename into v_ename from emp where empno=7902;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE( 'Si existe empleado' ) ;
END IF;
END;
1-1-115115 Copyright © ADA, 2005. Todos los derechos reservados.
Cursores: IMPLICITOS
Cuenta el total de renglones afectados por la última
instrucción SQL ejecutada.
Ejemplo :
ATRIBUTO: %ROWCOUNT
SET SERVEROUTPUT ON;
BEGIN
UPDATE emp SET hiredate=sysdate WHERE deptno='30';
DBMS_OUTPUT.PUT_LINE( 'Lineas afectadas : ' || SQL
%ROWCOUNT ) ;
COMMIT;
END;
1-1-116116 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
Los errores de PL/SQL son llamados excepciones, que
puede estar predefinida o puede ser definida por el usuario.
Existe una diferencia entre ambos tipos de excepciones, las
primeras se disparan sin necesidad de ser invocadas, las
segundas tienen que ser invocadas, para ello se utiliza la
sentencia RAISE.
1-1-117117 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
Sintaxis :
DECLARE
exception_usuario EXCEPTION ;
BEGIN
.........
.........
EXCEPTION
WHEN exception_oracle/exception_usuario/OTHERS THEN
< secuencia de sentencias >;
END ;
1-1-118118 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
Se dispara cuando un select retorna mas de 1 línea o registro.
TOO_MANY_ROWS
Se dispara cuando un select no retorna ninguna línea o
registro.
NO_DATA_FOUND
Se dispara cuando se ha especificado o hecho referencia a un
cursor inválido.
INVALID_CURSOR
1-1-119119 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
Se dispara cuando ha ocurrido un error de conversión o
validación (aritmética, numérica, cadena de caracteres).
VALUE_ERROR
Se dispara cuando se ha intentado realizar un división por 0.
ZERO_DIVIDE
Se dispara cuando se ha intentado insertar un valor
duplicado en una columna con índice único.
DUP_VAL_ON_INDEX
1-1-120120 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
Otras excepciones :
INVALID_NUMBER
VALUE_ERROR
LOGIN_DENIED
PROGRAM_ERROR
CURSOR_ALREADY_OPEN
TIME_OUT_RESOURCE
STORAGE_ERROR
NOT_LOGGED_ON
1-1-121121 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
SET SERVEROUTPUT ON;
DECLARE
v_dname varchar2(14);
BEGIN
select dname into v_dname from dept where deptno between 10 and 30;
--select dname into v_dname from dept where deptno between 80 and 90;
DBMS_OUTPUT.PUT_LINE( 'Lineas afectadas : ' || SQL
%ROWCOUNT ) ;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Hay mas de un registro!!!!!');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay datos!!!!');
END;
Ejemplo 1:
1-1-122122 Copyright © ADA, 2005. Todos los derechos reservados.
Sección EXCEPTION
SET SERVEROUTPUT ON;
DECLARE
v_cnt varchar2(14);
mierror EXCEPTION;
BEGIN
select count(*) into v_cnt from dept;
if v_cnt>1 then
RAISE mierror;
else
DBMS_OUTPUT.PUT_LINE( '1 Departamento' );
end if;
EXCEPTION
WHEN mierror THEN
DBMS_OUTPUT.PUT_LINE('Error de usuario!!!!!');
END;
Ejemplo 2:
1-1-123123 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
ANONIMOS
Existen dos tipos principales de bloques PL/SQL:
ANONIMOS y NOMINADOS
Los bloques anónimos se compilan cada vez que se
ejecutan, no se almacenan en la base de datos y no pueden
llamarse directamente desde otros bloques PL/SQL.
DECLARE
...
BEGIN
.........
END ;
1-1-124124 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
NOMINADOS
Se pueden almacenar en la base de datos y ejecutarse
cuando sea conveniente.
De manera similar a otros objetos, un subprograma se crea
mediante la instrucción CREATE.
Las siguientes son estructuras nominadas :
PROCEDIMIENTOS FUNCIONES
PAQUETESDISPARADORES
1-1-125125 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
PROCEDIMIENTO
La estructura de un procedimiento tiene, por tanto, la
siguiente sintaxis:
CREATE [ OR REPLACE ] PROCEDURE
nombre_procedimiento
AS
/* esta es la sección declarativa */
BEGIN
/* esta es la sección ejecutable */
EXCEPTION
/* esta es la sección de tratamiento de errores */
END;
1-1-126126 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
PROCEDIMIENTO
La sintaxis básica de la instrucción CREATE [OR
REPLACE ] PROCEDURE es :
CREATE [ OR REPLACE ] PROCEDURE
nombre_procedimiento
[ ( argumento [ IN | OUT | IN OUT ] tipo,
.....
argumento [ IN | OUT | IN OUT ] tipo ) ] IS | AS
cuerpo_procedimiento
1-1-127127 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
PROCEDIMIENTO
Ejemplo :
CREATE OR REPLACE PROCEDURE proc_ejemplo1
AS
CURSOR V_CURSOR IS SELECT * FROM MUNICIPIOS;
BEGIN
FOR v_datos IN v_cursor LOOP
DBMS_OUTPUT.PUT_LINE('Municipalidad:’ || v_datos.nombre );
END LOOP;
END;
1-1-128128 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
PROCEDIMIENTO
Un procedimiento se puede ejecutar de varias formas :
1. Utilizando el comando EXECUTE
EXECUTE Proc_ejemplo1;
BEGIN
Proc_ejemplo1;
END ;
2. Llamándolo desde un bloque de programa o
subprograma
1-1-129129 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
FUNCION
La sintaxis de creación de una función es muy parecida a la
de los procedimientos:
CREATE [ OR REPLACE ] FUNCTION nombre_función
[ ( argumento [ IN | OUT | IN OUT ] tipo,
.....
argumento [ IN | OUT | IN OUT ] tipo ) ] IS | AS
RETURN tipo_retorno IS | AS
cuerpo_función
1-1-130130 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Consideraciones:
1. La lista de argumentos es opcional. Si no hay
parámetros, los paréntesis no aparecerían ni en la
declaración de la función ni en la llamada a la misma.
2. El tipo de valor que devuelve la función en necesario, y
es parte de la sintaxis de la declaración.
FUNCION
1-1-131131 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
La instrucción RETURN se utiliza para devolver el
control, junto con un valor, al entorno que realizó la
llamada.
RETURN expresión;
- Puede haber más de una instrucción RETURN en una
función.
- La finalización de una función sin que se ejecute una
instrucción RETURN es un error.
FUNCION: Instrucción RETURN
1-1-132132 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Ejemplo 1 :
CREATE OR REPLACE FUNCTION func_ejemplo1
RETURN empleados.nombre%TYPE AS
v_dato empleados.nombre%TYPE ;
v_codigo empleados.empleadoid%TYPE := 0 ;
BEGIN
SELECT nombre INTO v_dato FROM EMPLEADOS WHERE
empleadoid=v_codigo;
RETURN v_dato;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN ’ Codigo de empleado no existe!!! ’ ;
END;
FUNCION
1-1-133133 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Una función se puede ejecutar de varias formas :
1. En una sentencia SELECT
SELECT func_ejemplo1 FROM DUAL;
BEGIN
v_dato = func_ejemplo2 (5001);
END;
2. Llamándolo desde un bloque de programa o
subprograma
FUNCION
1-1-134134 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Ejemplo 2 :
CREATE OR REPLACE FUNCTION func_ejemplo2 ( p_codigo in
empleados.empleadoid%TYPE)
RETURN empleados.nombre%TYPE
AS
v_dato empleados.nombre%TYPE;
BEGIN
SELECT nombre INTO v_dato FROM EMPLEADOS WHERE
empleadoid=p_codigo;
RETURN v_dato;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'Codigo de empleado no existe!!!';
END ;
FUNCION
1-1-135135 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Eliminación de Procedimientos y Funciones
La sintaxis para eliminar un procedimiento es:
DROP PROCEDURE nombre_procedimiento
La sintaxis para eliminar una función es:
DROP FUNCTION nombre_función
1-1-136136 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Parámetros de los subprogramas
Los parámetros tiene distintos modos :
- Dentro del procedimiento, el parámetro formal se
comporta como una constante
- Se considera de sólo lectura y no se puede cambiar.
- Cuando el procedimiento finaliza y se devuelve el
control al entorno que lo llamo, el parámetro real no se
modifica.
IN
1-1-137137 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
- Se ignora cualquier valor que el parámetro real pueda
tener cuando se produce la llamada.
- Se puede escribir en ella.
- Cuando el procedimiento finaliza y se devuelve el
control al entorno que lo llamo, se asigna el valor del
parámetro formal al parámetro real.
Parámetros de los subprogramas
OUT
1-1-138138 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
- Este modo es la combinación de los modos IN y OUT.
- El valor del parámetro real se pasa al procedimiento
- Se puede leer y escribirse en ella.
- Cuando el procedimiento finaliza y se devuelve el
control al entorno que lo llamo, se asigna el valor del
parámetro formal al parámetro real.
Parámetros de los subprogramas
IN OUT
1-1-139139 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Ejemplo :
CREATE OR REPLACE PROCEDURE proc_ejemplo2
( p_codigo IN number )
AS
v_nombre VARCHAR2(50) := ’ v_nombre = <VACIO>
’ ;
BEGIN
dbms_output.put_line(v_nombre) ;
proc_busca_empleado(p_codigo,v_nombre) ;
dbms_output.put_line('v_nombre = '||v_nombre) ;
END;
Parámetros de los subprogramas
1-1-140140 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
CREATE OR REPLACE PROCEDURE
proc_busca_empleado ( p_codigo in char,
p_nombre in out varchar2) AS
BEGIN
SELECT nombre INTO p_nombre FROM EMPLEADOS
WHERE empleadoid=p_codigo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line (’ codigo de empleado no existe!!! ') ;
END;
Parámetros de los subprogramas
1-1-141141 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
PL/SQL permite agrupar toda la programación
relacionada en un objeto de base de datos,
llamado paquete.
Un paquete es una estructura de PL/SQL que
permite almacenar juntos varios objetos
relacionados.
Package
1-1-142142 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Cabecera
Incluye información acerca del contenido del
paquete.
Cuerpo
Es un objeto independiente de la cabecera.
El cuerpo no puede compilarse hasta que la
cabecera tenga estado válido.
Package : Componentes
1-1-143143 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
CREATE PACKAGE mipack AS
PROCEDURE miproc ( v_dato1,v_dato2 ) ;
FUNCTION mifunc ( v_dato1) RETURN number;
END ;
CREATE PACKAGE BODY mipack AS
PROCEDURE miproc ( v_dato1,v_dato2 ) as
begin
--
end;
FUNCTION mifunc (v_dato1) RETURN number
begin
--
end;
END;
1-1-144144 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Sintaxis :
Package
CREATE [ OR REPLACE ] PACKAGE
nombre_paquete IS | AS
especificación_procedimientos |
especificación_funciones |
declaración_variables |
declaración_excepciones |
declaración_cursores |
END nombre_paquete;
1-1-145145 Copyright © ADA, 2005. Todos los derechos reservados.
Sub-Programas
Ejemplo :
Package
CREATE OR REPLACE PACKAGE
PACK_EJEMPLO1
AS
PROCEDURE proc_municipios;
END;
/* Cabecera */
1-1-146146 Copyright © ADA, 2005. Todos los derechos reservados.
Paquetes
Package
CREATE OR REPLACE PACKAGE BODY PACK_EJEMPLO1
AS
PROCEDURE proc_municipios
AS
CURSOR V_CURSOR IS SELECT * FROM MUNICIPIOS;
BEGIN
FOR V_DATOS IN V_CURSOR LOOP
DBMS_OUTPUT.PUT_LINE('MUNICIPALIDAD : ’ ||
V_DATOS.NOMBRE);
END LOOP;
END;
END ;
/* Cuerpo */
1-1-147147 Copyright © ADA, 2005. Todos los derechos reservados.
Paquetes
Un paquete se puede ejecutar de la siguiente manera :
BEGIN
PACK_EJEMPLO1.proc_municipios;
END;
Llamándolo desde un bloque de programa o subprograma
Package
SELECT PACK_EJEMPLO1.func_numero(10)
FROM DUAL;
Utilizando una sentencia SELECT
1-1-148148 Copyright © ADA, 2005. Todos los derechos reservados.
Paquetes
Cualquier objeto que se declara en la cabecera del paquete
se encuentra dentro del ámbito y es visible fuera paquete.
Package : Ámbito
Ejemplo :
CREATE OR REPLACE PACKAGE PACK_EJEMPLO1
AS
CURSOR v_cursor IS SELECT * FROM MUNICIPIOS;
PROCEDURE proc_municipios;
END;
1-1-149149 Copyright © ADA, 2005. Todos los derechos reservados.
Paquetes
Package : Ambito
CREATE OR REPLACE PACKAGE BODY
PACK_EJEMPLO1
AS
PROCEDURE proc_municipios
AS
BEGIN
FOR V_DATOS IN V_CURSOR LOOP
DBMS_OUTPUT.PUT_LINE('MUNICIPALIDAD : ’ ||
V_DATOS.NOMBRE);
END LOOP;
END;
END;
1-1-150150 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES
Al igual que los procedimientos, funciones y
paquetes, los disparadores se almacenan en la
base de datos y no pueden ser declarados en un
bloque PL/SQL.
El disparador se ejecuta de manera implícita cada
vez que tiene lugar el suceso de disparo y no
admite argumentos.
1-1-151151 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES
Los disparadores pueden utilizarse para:
- Mantener restricciones de integridad complejas.
- Acciones de auditoria.
- Realizar otras acciones a raíz de la ejecución de
sentencias DML.
1-1-152152 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: Restricciones
- Un disparador no puede emitir ninguna orden de
control de transacciones: COMMIT, ROLLBACK o
SAVEPOINT.
- El cuerpo del disparador no puede contener
ninguna declaración de variables LONG o LONG
RAW.
1-1-153153 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES
Sintaxis :
CREATE [OR REPLACE ] TRIGGER nombre_disparo
BEFORE | AFTER | INSTEAD OF suceso_disparo
claúsula_referencia
[ WHEN condición_disparo ]
[ FOR EACH ROW ]
cuerpo_disparo ;
1-1-154154 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES
Existen tres principales tipos de disparadores:
DML
SUSTITUCION
SISTEMA
1-1-155155 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: DML
Un disparador DML se activa con una operación
INSERT, UPDATE o DELETE realizada sobre una
tabla de la base de datos.
1-1-156156 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: DML
Ejemplo:
CREATE OR REPLACE TRIGGER update_municipios
AFTER INSERT OR DELETE OR UPDATE ON municipios
DECLARE
v_numero NUMBER(4);
BEGIN
SELECT count(*) INTO v_numero FROM MUNICIPIOS;
INSERT INTO TEMP (A,H) VALUES (v_numero,
'Municipalidades registradas');
END ;
1-1-157157 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: Sistema
Un disparador del sistema se activa cuando tiene
lugar un suceso del sistema.
1-1-158158 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
TRIGGERS SISTEMA: Manejo de Sucesos
Suceso
SHUTDOWN
SERVERRROR
LOGON
LOGOFF
CREATE
DROP
ALTER
Temporización Permitido
BEFORE
AFTER
AFTER
BEFORE
BEFORE, AFTER
BEFORE, AFTER
BEFORE, AFTER
1-1-159159 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
Ejemplo:
CREATE OR REPLACE TRIGGER log_modifica
AFTER ALTER ON SCHEMA
BEGIN
INSERT INTO TEMP (USUARIO,DUENO,TIPO,FECHA
DATE) VALUES(USER,SYS.DICTIONARY_OBJ_OWNER,
SYS.DICTIONARY_OBJ_NAME,
SYS.DICTIONARY_OBJ_TYPE, SYSDATE);
END ;
DISPARADORES: Sistema
1-1-160160 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: Sustitución
Un disparador por sustitución pueden definirse
únicamente sobre vistas.
1-1-161161 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
Ejemplo:
CREATE OR REPLACE VIEW v_municipios
AS SELECT * FROM MUNICIPIOS ;
CREATE OR REPLACE TRIGGER insert_vista
INSTEAD OF INSERT ON v_municipios
BEGIN
INSERT INTO MUNICIPIOS
VALUES(:NEW.MUNIID,:NEW.NOMBRE,:NEW.DIRECCION,
:NEW.POBLACION, :NEW.EXTENSION ) ;
END ;
DISPARADORES: Sustitución
1-1-162162 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: Habilitar - Deshabilitar
Un disparador se elimina así:
DROP TRIGGER nombre_disparador ;
A diferencia de los procedimientos, funciones y
paquetes un disparador se puede deshabilitar sin
necesidad de eliminarlo:
ALTER TRIGGER nombre_disparador
[ DISABLE | ENABLE ] ;
1-1-163163 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
DISPARADORES: Habilitar - Deshabilitar
También se puede habilitar o deshabilitar todos los
disparadores de una tabla determinada utilizando la
orden ALTER TABLE con la cláusula ENABLE ALL
TRIGGERS o DISABLE ALL TRIGGERS.
ALTER TABLE temp
[ ENABLE | DISABLE ] ALL TRIGGERS ;
1-1-164164 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
Utilizando :OLD y :NEW
Dentro del disparador, puede acceder a los datos
de la fila que está siendo actualmente procesada
utilizando :OLD y :NEW
1-1-165165 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
Utilizando :OLD y :NEW
Orden
INSERT
UPDATE
DELETE
:OLD
No definido - NULL
Valores originales de
la fila, antes de la
actualización
Valores originales
antes del borrado de
la fila
:NEW
Valores que serán
insertados cuando se
complete la orden
Nuevos valores que
serán escritos cuando
se complete la orden
No definido - NULL
1-1-166166 Copyright © ADA, 2005. Todos los derechos reservados.
Disparadores
Utilizando predicados : INSERTING, UPDATING y
DELETING
En los disparadores se pueden utilizar funciones para
controlar el flujo de ejecución de las sentencias:
INSERTING retorna TRUE si se inserta una fila
UPDATING retorna TRUE si se actualiza una fila.
DELETING retorna TRUE si se elimina una fila.
1-1-167167 Copyright © ADA, 2005. Todos los derechos reservados.
ResumenResumen
En este capítulo, hemos visto como:En este capítulo, hemos visto como:
• Usar sentencias SQL para la selección de datos.Usar sentencias SQL para la selección de datos.
• Usar sentencias SQL para la manipulación deUsar sentencias SQL para la manipulación de
datos.datos.
• Crear bloques de código PL/SQL.Crear bloques de código PL/SQL.
• Usar sentencias de control de flujo.Usar sentencias de control de flujo.
• Crear unidades de programa.Crear unidades de programa.

Más contenido relacionado

Similar a Administración de base de datos oracle - sesion 1

Similar a Administración de base de datos oracle - sesion 1 (20)

1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
 
Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)
 
Exposición
ExposiciónExposición
Exposición
 
TRANSACT-SQL
TRANSACT-SQLTRANSACT-SQL
TRANSACT-SQL
 
Exposición
ExposiciónExposición
Exposición
 
Sql
SqlSql
Sql
 
Sql plus oracle
Sql plus oracleSql plus oracle
Sql plus oracle
 
Tsql
TsqlTsql
Tsql
 
Introduccion ddl
Introduccion ddlIntroduccion ddl
Introduccion ddl
 
Introduccion ddl
Introduccion ddlIntroduccion ddl
Introduccion ddl
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
Comandos SQL
Comandos SQLComandos SQL
Comandos SQL
 
Actividad2 capitulo I contenido
Actividad2 capitulo I  contenidoActividad2 capitulo I  contenido
Actividad2 capitulo I contenido
 
Lecc01
Lecc01Lecc01
Lecc01
 
Lumisaca hector bdii_t7
Lumisaca hector bdii_t7Lumisaca hector bdii_t7
Lumisaca hector bdii_t7
 
103305862 t-sql
103305862 t-sql103305862 t-sql
103305862 t-sql
 
t-sql
t-sqlt-sql
t-sql
 
Introduccion ddl
Introduccion ddlIntroduccion ddl
Introduccion ddl
 
Attachment
AttachmentAttachment
Attachment
 
Transact+Sql+2005
Transact+Sql+2005Transact+Sql+2005
Transact+Sql+2005
 

Más de Sefira111

Programacion web jee semana8 jdeveloper-grabardatos
Programacion web jee   semana8 jdeveloper-grabardatosProgramacion web jee   semana8 jdeveloper-grabardatos
Programacion web jee semana8 jdeveloper-grabardatosSefira111
 
ORACLE EJERCICIO LABORATORIO
ORACLE EJERCICIO LABORATORIOORACLE EJERCICIO LABORATORIO
ORACLE EJERCICIO LABORATORIOSefira111
 
JDBC MONOGRAFIA
JDBC MONOGRAFIAJDBC MONOGRAFIA
JDBC MONOGRAFIASefira111
 
Administración de base de datos oracle - sesion 13
Administración de base de datos oracle -  sesion 13Administración de base de datos oracle -  sesion 13
Administración de base de datos oracle - sesion 13Sefira111
 
Administración de base de datos oracle - sesion 12
Administración de base de datos oracle -  sesion 12Administración de base de datos oracle -  sesion 12
Administración de base de datos oracle - sesion 12Sefira111
 
Administración de base de datos oracle - sesion 11
Administración de base de datos oracle  -  sesion 11Administración de base de datos oracle  -  sesion 11
Administración de base de datos oracle - sesion 11Sefira111
 
Administración de base de datos oracle - sesion 10
Administración de base de datos oracle - sesion 10Administración de base de datos oracle - sesion 10
Administración de base de datos oracle - sesion 10Sefira111
 
Administración de base de datos oracle - sesion 9
Administración de base de datos oracle -  sesion 9Administración de base de datos oracle -  sesion 9
Administración de base de datos oracle - sesion 9Sefira111
 
Administración de base de datos oracle - sesion 8
Administración de base de datos oracle - sesion 8Administración de base de datos oracle - sesion 8
Administración de base de datos oracle - sesion 8Sefira111
 
Administración de base de datos oracle - sesion 7
Administración de base de datos oracle - sesion 7Administración de base de datos oracle - sesion 7
Administración de base de datos oracle - sesion 7Sefira111
 
Administración de base de datos oracle - sesion 6
Administración de base de datos oracle - sesion 6Administración de base de datos oracle - sesion 6
Administración de base de datos oracle - sesion 6Sefira111
 
Administración de base de datos oracle - sesion 5
Administración de base de datos oracle - sesion 5Administración de base de datos oracle - sesion 5
Administración de base de datos oracle - sesion 5Sefira111
 
Administración de base de datos oracle - sesión 4
Administración de base de datos oracle - sesión 4Administración de base de datos oracle - sesión 4
Administración de base de datos oracle - sesión 4Sefira111
 
Administración de base de datos oracle - sesion 3
Administración de base de datos oracle - sesion 3Administración de base de datos oracle - sesion 3
Administración de base de datos oracle - sesion 3Sefira111
 
Administración de base de datos oracle - sesion 2
Administración de base de datos oracle - sesion 2Administración de base de datos oracle - sesion 2
Administración de base de datos oracle - sesion 2Sefira111
 
Administración de base de datos oracle - sesion 0
Administración de base de datos oracle - sesion 0Administración de base de datos oracle - sesion 0
Administración de base de datos oracle - sesion 0Sefira111
 

Más de Sefira111 (16)

Programacion web jee semana8 jdeveloper-grabardatos
Programacion web jee   semana8 jdeveloper-grabardatosProgramacion web jee   semana8 jdeveloper-grabardatos
Programacion web jee semana8 jdeveloper-grabardatos
 
ORACLE EJERCICIO LABORATORIO
ORACLE EJERCICIO LABORATORIOORACLE EJERCICIO LABORATORIO
ORACLE EJERCICIO LABORATORIO
 
JDBC MONOGRAFIA
JDBC MONOGRAFIAJDBC MONOGRAFIA
JDBC MONOGRAFIA
 
Administración de base de datos oracle - sesion 13
Administración de base de datos oracle -  sesion 13Administración de base de datos oracle -  sesion 13
Administración de base de datos oracle - sesion 13
 
Administración de base de datos oracle - sesion 12
Administración de base de datos oracle -  sesion 12Administración de base de datos oracle -  sesion 12
Administración de base de datos oracle - sesion 12
 
Administración de base de datos oracle - sesion 11
Administración de base de datos oracle  -  sesion 11Administración de base de datos oracle  -  sesion 11
Administración de base de datos oracle - sesion 11
 
Administración de base de datos oracle - sesion 10
Administración de base de datos oracle - sesion 10Administración de base de datos oracle - sesion 10
Administración de base de datos oracle - sesion 10
 
Administración de base de datos oracle - sesion 9
Administración de base de datos oracle -  sesion 9Administración de base de datos oracle -  sesion 9
Administración de base de datos oracle - sesion 9
 
Administración de base de datos oracle - sesion 8
Administración de base de datos oracle - sesion 8Administración de base de datos oracle - sesion 8
Administración de base de datos oracle - sesion 8
 
Administración de base de datos oracle - sesion 7
Administración de base de datos oracle - sesion 7Administración de base de datos oracle - sesion 7
Administración de base de datos oracle - sesion 7
 
Administración de base de datos oracle - sesion 6
Administración de base de datos oracle - sesion 6Administración de base de datos oracle - sesion 6
Administración de base de datos oracle - sesion 6
 
Administración de base de datos oracle - sesion 5
Administración de base de datos oracle - sesion 5Administración de base de datos oracle - sesion 5
Administración de base de datos oracle - sesion 5
 
Administración de base de datos oracle - sesión 4
Administración de base de datos oracle - sesión 4Administración de base de datos oracle - sesión 4
Administración de base de datos oracle - sesión 4
 
Administración de base de datos oracle - sesion 3
Administración de base de datos oracle - sesion 3Administración de base de datos oracle - sesion 3
Administración de base de datos oracle - sesion 3
 
Administración de base de datos oracle - sesion 2
Administración de base de datos oracle - sesion 2Administración de base de datos oracle - sesion 2
Administración de base de datos oracle - sesion 2
 
Administración de base de datos oracle - sesion 0
Administración de base de datos oracle - sesion 0Administración de base de datos oracle - sesion 0
Administración de base de datos oracle - sesion 0
 

Administración de base de datos oracle - sesion 1

  • 1. 1-1-11 Copyright © ADA, 2005. Todos los derechos reservados. Sesión 1Sesión 1 SQL y PL/SQLSQL y PL/SQL
  • 2. 1-1-22 Copyright © ADA, 2005. Todos los derechos reservados. Introducción a SQLIntroducción a SQL
  • 3. 1-1-33 Copyright © ADA, 2005. Todos los derechos reservados. ObjetivosObjetivos • Recuperar datos de fila y de columna de las tablas con la sentencia SELECT. • Conocer y ejecutar sentencias DML para actualización de datos. • Utilizar funciones SQL para generar y recuperar datos personalizados. Buscar datos mediante subconsultas avanzadas.
  • 4. 1-1-44 Copyright © ADA, 2005. Todos los derechos reservados. Proceso de una Consulta Proceso de Usuario Proceso de servidor Select * from emp order by name; Select * from emp order by name; Parse ------------- Execute -------------------- Fetch Ok Resultados Sentencia Manejo
  • 5. 1-1-55 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones SQL en Oracle DML Lenguaje de manipulación de datos, permite recuperar y actualizar datos. Los comandos SQL utilizados son: INSERT, UPDATE, DELETE y SELECT. DDL Lenguaje de definición de datos, es utilizado para modificar la estructura de los objetos que soportan los datos. Los comandos SQL utilizados son: CREATE, DROP, ALTER, etc. DCL Lenguaje de control de datos, es utilizada para controlar el acceso a los datos. Los comandos SQL son: GRANT y REVOKE. Tipos de comandos SQL:
  • 6. 1-1-66 Copyright © ADA, 2005. Todos los derechos reservados. Tabla de Sentencias DML DELETE INSERT SELECT UPDATE MERGE TRUNCATE Table Data Manipulation Language Statements
  • 7. 1-1-77 Copyright © ADA, 2005. Todos los derechos reservados. Tabla de Sentencias DDL Table Data Definition Language Statements ALTER CLUSTER ALTER DATABASE ALTER DIMENSION ALTER FUNCTION ALTER INDEX CREATE TABLE CREATE TABLESPACE CREATE TRIGGER CREATE TYPE CREATE USER DROP OPERATOR DROP PACKAGE DROP PROCEDURE DROP PROFILE DROP ROLE DROP SEQUENCE DROP SYNONYM DROP TABLE DROP TABLESPACE DROP TRIGGER
  • 8. 1-1-88 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones SQL en Oracle Control de Transacciones COMMIT ROLLBACK SAVEPOINT SET TRANSACTION Table Transaction Control Statements Control de Sesión ALTER SESSION SET ROLE Table Session Control Statements
  • 9. 1-1-99 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones SQL en Oracle Control de Sistema Table System Control Statement ALTER SYSTEM
  • 10. 1-1-1010 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Sentencia SELECT La sentencia SELECT …. FROM se utiliza para consultar los datos de las filas de una tabla de datos, siendo una tabla estrictamente una matriz de filas y columnas. SQL> SELECT empno, ename, sal, job FROM emp; SQL> DESCRIBE emp; SQL> DESC emp; Para visualizar la estructura de una objeto se utiliza la sentencia DESCRIBE de SQL*PLUS.
  • 11. 1-1-1111 Copyright © ADA, 2005. Todos los derechos reservados. Operadores de Comparación SQL> Select ename, sal FROM emp WHERE sal BETWEEN 1000 AND 1500; BETWEEN…AND SQL> Select ename, sal, comm FROM emp WHERE sal <= comm ; Instrucciones DML - Sentencia SELECT =, >, <=, <,<= , <>
  • 12. 1-1-1212 Copyright © ADA, 2005. Todos los derechos reservados. Operadores de Comparación IN (...lista...) SQL> Select ename FROM emp WHERE ename LIKE ‘_A%’; LIKE SQL> Select ename, sal, mgr FROM emp WHERE mgr IN (7902,7566,7788); Instrucciones DML - Sentencia SELECT
  • 13. 1-1-1313 Copyright © ADA, 2005. Todos los derechos reservados. Operadores de Comparación IS NULL /* Mostrar los empleados que no ganan comisión */ SQL> Select ename, job, comm FROM emp WHERE comm IS NULL; Instrucciones DML - Sentencia SELECT
  • 14. 1-1-1414 Copyright © ADA, 2005. Todos los derechos reservados. Operadores Lógicos AND OR SQL> Select ename, job, sal FROM emp WHERE sal >=1100 AND job=‘CLERK’; SQL> Select ename, job, sal FROM emp WHERE sal >=1100 OR job=‘CLERK’; Instrucciones DML - Sentencia SELECT
  • 15. 1-1-1515 Copyright © ADA, 2005. Todos los derechos reservados. Operadores Lógicos NOT SQL> Select ename, job FROM emp WHERE job NOT IN ( ‘CLERK’, ’MANAGER’, ’ANALYST’ ); También se puede combinar: NOT BETWEEN - NOT NULL - NOT LIKE Instrucciones DML - Sentencia SELECT
  • 16. 1-1-1616 Copyright © ADA, 2005. Todos los derechos reservados. Cláusula ORDER BY……DESC [ASC] SQL> Select empno, ename, sal *12 as salario FROM emp ORDER BY salario DESC; Instrucciones DML - Sentencia SELECT
  • 17. 1-1-1717 Copyright © ADA, 2005. Todos los derechos reservados. Uso de ALIAS SQL> Select A.empno, A.ename FROM emp A ORDER BY A.ename DESC; SQL> Select a.empno as codigo, a.ename as nombre FROM emp A ORDER BY a.sal DESC; SQL> Select a.empno codigo, a.ename nombre FROM emp A ORDER BY sal DESC; Instrucciones DML - Sentencia SELECT
  • 18. 1-1-1818 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de Conversión : LOWER (‘CURSO SQL’) Funciones de Carácter : Instrucciones DML - Funciones de una Fila UPPER (‘sql course’) INITCAP (‘sql course’) Función
  • 19. 1-1-1919 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de manipulación de caracteres : CONCAT (‘Hola’,’como estas ’) Instrucciones DML - Funciones de una Fila SUBSTR (‘Profesor’,1,3) LENGTH (‘Hola’) Función INSTR (‘Amigos’,’g’) LPAD (salario,10,’*’) TRIM (‘ Hola a todos ‘)
  • 20. 1-1-2020 Copyright © ADA, 2005. Todos los derechos reservados. ROUND Funciones numéricas : Instrucciones DML - Funciones de una Fila TRUNC MOD Función ROUND(45.926) TRUNC(45.926) MOD (1600,300) Ejemplo 45.93 45.92 100 Resultado
  • 21. 1-1-2121 Copyright © ADA, 2005. Todos los derechos reservados. MONTHS_BETWEEN(‘01-ENE-05’,’01-MAR-05’) Funciones de Fecha : Instrucciones DML - Funciones de una Fila ADD_MONTHS(sysdate,6) NEXT_DAY(sysdate,1) Función 3 11-ENE-06 Resultado 18-JUL-05 LAST_DAY(sysdate) 31-JUL-05 ROUND(sysdate,’MM’) 01-JUL-05 ROUND(sysdate,’YYYY’) 01-ENE-06 TRUNC(sysdate,’MM’) 01-JUL-05 TRUNC(sysdate,’YYYY’) 01-ENE-05
  • 22. 1-1-2222 Copyright © ADA, 2005. Todos los derechos reservados. Ejemplo: SQL> SELECT SYSDATE,ADD_MONTHS(SYSDATE,4) AGREGAR_MES , NEXT_DAY(SYSDATE,1) AGREGAR_SEMANA, LAST_DAY(sysdate) ULTIMO FROM DUAL; Instrucciones DML - Funciones de una Fila
  • 23. 1-1-2323 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de conversión : Instrucciones DML - Funciones de una Fila VARCHAR2 o CHAR VARCHAR2 o CHAR NUMBER De NUMBER DATE VARCHAR2 A Conversión de tipos de datos implícitos DATE VARCHAR2
  • 24. 1-1-2424 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de conversión : Instrucciones DML - Funciones de una Fila YYYY YEAR MM Formato Año completo Año en texto Número de Mes Descripción Conversión de tipos de datos explícitos: TO_CHAR MONTH Mes en texto DY Día abreviado DAY Día en texto
  • 25. 1-1-2525 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de conversión : Instrucciones DML - Funciones de una Fila 9 0 $ Formato Representa un número Fuerza que cero se muestre Coloca un signo dólar Descripción Conversión de tipos de datos explícitos: TO_NUMBER . Imprime un punto decimal , Imprime un indicador de miles
  • 26. 1-1-2626 Copyright © ADA, 2005. Todos los derechos reservados. Funciones de conversión : Instrucciones DML - Funciones de una Fila YYYY YEAR MM Formato Año completo Año en texto Número de Mes Descripción Conversión de tipos de datos explícitos: TO_DATE MONTH Mes en texto DY Día abreviado DAY Día en texto
  • 27. 1-1-2727 Copyright © ADA, 2005. Todos los derechos reservados. Función NVL : Instrucciones DML - Funciones de una Fila SQL> Select NVL(comm,0) FROM emp; Convierte un nulo a un valor que puede ser un número, un carácter o una fecha. SQL> Select NVL(hiredate,sysdate) FROM emp; SQL> Select NVL(job,’no job’) FROM emp;
  • 28. 1-1-2828 Copyright © ADA, 2005. Todos los derechos reservados. EMP Instrucciones DML - Funciones de múltiples Filas EMPNO ENAME DEPTNO ----- ----------- ------------ 7369 SMITH 20 7499 ALLEN 30 7521 WARD 30 7566 JONES 20 7654 MARTIN 30 7698 BLAKE 30 7782 CLARK 10 7788 SCOTT 20 7839 KING 10 7844 TURNER 30 7876 ADAMS 20 7900 JAMES 30 7902 FORD 50 7934 MILLER 10 DEPTNO DNAME LOC ------ -------------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 60 PRUEBA PRUEBA DEPT
  • 29. 1-1-2929 Copyright © ADA, 2005. Todos los derechos reservados. Tipos de Join: Instrucciones DML - Funciones de múltiples Filas Equijoin SQL> SELECT a.ename, a.job, a.sal, b.dname FROM emp a, dept b WHERE a.deptno = b.deptno ; ENAME JOB SAL DNAME -------------------- --------------- --------- -------------- SMITH CLERK 800.00 RESEARCH ALLEN SALESMAN 1600.00 SALES WARD SALESMAN 1250.00 SALES ……... JAMES CLERK 950.00 SALES FORD ANALYST 3000.00 RESEARCH MILLER CLERK 1300.00 ACCOUNTING 14 rows selected
  • 30. 1-1-3030 Copyright © ADA, 2005. Todos los derechos reservados. Tipos de Join: Instrucciones DML - Funciones de múltiples Filas Non- equijoin SQL> SELECT a.* FROM emp a, salgrade b WHERE a.sal BETWEEN b.losal and b.hisal; GRADE LOSAL HISAL ---------- ---------- ---------- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 ENAME JOB SAL GRADE --------------- --------------- --------- ---------- SMITH CLERK 800.00 1 ADAMS CLERK 1100.00 1 JAMES CLERK 950.00 1 ..….. SCOTT ANALYST 3000.00 4 FORD ANALYST 3000.00 4 KING PRESIDENT 5000.00 5 14 rows selected
  • 31. 1-1-3131 Copyright © ADA, 2005. Todos los derechos reservados. Tipos de Join: Instrucciones DML - Funciones de múltiples Filas Outer-Join SQL> SELECT nvl(a.ename,'<VACIO>') ename, NVL(a.sal,0.00) SAL, A.DEPTNO, NVL(b.dname,'NULL') FROM emp a, dept b WHERE a.deptno = b.deptno (+);
  • 32. 1-1-3232 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Funciones de múltiples Filas EMPNO ENAME DEPTNO ----- ----------- ------------ 7369 SMITH 20 7499 ALLEN 30 7521 WARD 30 7566 JONES 20 7654 MARTIN 30 7698 BLAKE 30 7782 CLARK 10 7788 SCOTT 20 7839 KING 10 7844 TURNER 30 7876 ADAMS 20 7900 JAMES 30 7902 FORD 50 7934 MILLER 10 DEPTNO DNAME LOC ------ -------------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 60 PRUEBA PRUEBA EMP DEPT
  • 33. 1-1-3333 Copyright © ADA, 2005. Todos los derechos reservados. Resultado: Instrucciones DML - Funciones de múltiples Filas ENAME SAL DEPTNO DNAME -------------------- ---------- ------------- -------------- SMITH 800 20 RESEARCH ALLEN 1600 30 SALES WARD 1250 30 SALES JONES 2975 20 RESEARCH MARTIN 1250 30 SALES BLAKE 2850 30 SALES CLARK 2450 10 ACCOUNTING SCOTT 3000 20 RESEARCH KING 5000 10 ACCOUNTING TURNER 1500 30 SALES ADAMS 1100 20 RESEARCH JAMES 950 30 SALES FORD 3000 50 NULL MILLER 1300 10 ACCOUNTING 14 rows selected
  • 34. 1-1-3434 Copyright © ADA, 2005. Todos los derechos reservados. Tipos de Join: Instrucciones DML - Funciones de múltiples Filas Outer-Join SQL> SELECT nvl(a.ename,'<VACIO>') ename, NVL(a.sal,0.00) SAL, NVL(A.DEPTNO,0) DEPTNO , NVL(b.dname,'NULL') FROM emp a, dept b WHERE a.deptno (+) = b.deptno;
  • 35. 1-1-3535 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Funciones de múltiples Filas EMPNO ENAME DEPTNO ----- ----------- ------------ 7369 SMITH 20 7499 ALLEN 30 7521 WARD 30 7566 JONES 20 7654 MARTIN 30 7698 BLAKE 30 7782 CLARK 10 7788 SCOTT 20 7839 KING 10 7844 TURNER 30 7876 ADAMS 20 7900 JAMES 30 7902 FORD 50 7934 MILLER 10 DEPTNO DNAME LOC ------ -------------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 60 PRUEBA PRUEBA EMP DEPT
  • 36. 1-1-3636 Copyright © ADA, 2005. Todos los derechos reservados. Resultado: Instrucciones DML - Funciones de múltiples Filas ENAME SAL DEPTNO DNAME -------------------- ---------- ------------- -------------- CLARK 2450 10 ACCOUNTING KING 5000 10 ACCOUNTING MILLER 1300 10 ACCOUNTING SMITH 800 20 RESEARCH ADAMS 1100 20 RESEARCH SCOTT 3000 20 RESEARCH JONES 2975 20 RESEARCH ALLEN 1600 30 SALES BLAKE 2850 30 SALES MARTIN 1250 30 SALES JAMES 950 30 SALES TURNER 1500 30 SALES WARD 1250 30 SALES <VACIO> 0 0 OPERATIONS <VACIO> 0 0 PRUEBA 15 rows selected
  • 37. 1-1-3737 Copyright © ADA, 2005. Todos los derechos reservados. Tipos de Join: Instrucciones DML - Funciones de múltiples Filas Self Join SQL> SELECT a.ename EMPLEADO,a.sal SALARIO, a.job OCUPACION, m.ename MANAGER FROM emp a, emp m WHERE a.mgr = m.empno and a.empno=7369; EMPLEADO SALARIO OCUPACION MANAGER -------------------- -------------- --------------- -------------------- SMITH 800.00 CLERK FORD
  • 38. 1-1-3838 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Funciones de múltiples Filas EMPNO ENAME JOB MGR ------- -------------------- --------------- ------- 7369 SMITH CLERK 7902 7499 ALLEN SALESMAN 7698 7521 WARD SALESMAN 7698 7566 JONES MANAGER 7839 7654 MARTIN SALESMAN 7698 7698 BLAKE MANAGER 7839 7782 CLARK MANAGER 7839 7788 SCOTT ANALYST 7566 7839 KING PRESIDENT 7844 TURNER SALESMAN 7698 7876 ADAMS CLERK 7788 7900 JAMES CLERK 7698 7902 FORD ANALYST 7566 7934 MILLER CLERK 7782 EMP
  • 39. 1-1-3939 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Funciones de Grupo AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANCE Ejemplo: SQL> SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; Estas funciones operan en grupos de registros para entregar un resultado por grupos. Estas funciones son: DEPTNO AVG(SAL) ------ ---------- 10 2916.66666666667 20 2175 30 1566.66666666667
  • 40. 1-1-4040 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Funciones de Grupo Ejemplo: SQL> SELECT deptno, job, sum(sal) FROM emp GROUP BY deptno, job ; DEPTNO JOB SUM(SAL) ----------- --------------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600
  • 41. 1-1-4141 Copyright © ADA, 2005. Todos los derechos reservados. HAVING Instrucciones DML - Funciones de Grupo Este comando permite filtrar los registros agrupados. Ejemplo: SQL> SELECT deptno, job, sum(sal) FROM emp GROUP BY deptno, job HAVING sum(sal)>2500; DEPTNO JOB SUM(SAL) ----------- --------------- ---------- 10 PRESIDENT 5000 20 ANALYST 6000 20 MANAGER 2975 30 MANAGER 2850 30 SALESMAN 5600
  • 42. 1-1-4242 Copyright © ADA, 2005. Todos los derechos reservados. ROLLUP, CUBE Instrucciones DML - Funciones de Grupo Estos comandos se utilizan para totalizar los grupos de datos. Ejemplo: SQL> SELECT deptno, job, sum(sal) FROM emp GROUP BY ROLLUP(deptno,job) ; DEPTNO JOB SUM(SAL) ------ --------------- ------------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 30 9400 2902529025
  • 43. 1-1-4343 Copyright © ADA, 2005. Todos los derechos reservados. ROLLUP, CUBE Instrucciones DML - Funciones de Grupo Ejemplo: SQL> SELECT deptno, job, sum(sal) FROM emp GROUP BY CUBE (deptno, job) ; DEPTNO JOB SAL ------ --------------- ---------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 10 8750 20 ANALYST 6000 20 CLERK 1900 20 MANAGER 2975 20 10875 30 CLERK 950 30 MANAGER 2850 30 SALESMAN 5600 30 9400 ANALYST 6000 CLERK 4150 MANAGER 8275 PRESIDENT 5000 SALESMAN 5600 2902529025
  • 44. 1-1-4444 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Subconsultas Se puede manejar dentro de la cláusula de una sentencia SELECT otra sentencia SELECT. La cláusula puede ser : WHERE, HAVING o FROM Sintaxis: SELECT select_list FROM table WHERE expresión operador (SELECT select_list FROM table) ; Donde operador puede ser : >, =, >=,<,<>, >= ó IN, ANY, ALL
  • 45. 1-1-4545 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Subconsultas a. Subconsultas de una fila SQL> SELECT ename, sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno=7566) ; ENAME SAL -------------------- ----------- SCOTT 3000.00 KING 5000.00 FORD 3000.00 Tipos de Subconsultas : SAL --------- 2975.00
  • 46. 1-1-4646 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Subconsultas b. Subconsultas de múltiples filas SQL> SELECT ename, sal, deptno FROM emp WHERE sal IN (SELECT min(sal) FROM emp group by deptno) ; ENAME SAL DEPTNO -------------------- --------- ------ SMITH 800.00 20 JAMES 950.00 30 MILLER 1300.00 10 Tipos de Subconsultas : MIN(SAL) ---------- 1300 800 950
  • 47. 1-1-4747 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML - Subconsultas b. Subconsultas de múltiples columnas SQL> SELECT ename, sal, deptno FROM emp WHERE (deptno,sal) IN (SELECT deptno,min(sal) FROM emp group by deptno); Tipos de Subconsultas :
  • 48. 1-1-4848 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia INSERT Forma Convencional SQL> INSERT INTO emp VALUES (2296, ’AROMANO’, ’SALESMAN’, 7782 , to_date( ‘03/02/1997 ’, ’dd/mm/yyyy’ ), 1300 , NULL, 10) ; Con variables de sustitución SQL> INSERT INTO dept (deptno, dname, loc) VALUES ( &departamento, ’&Nombre’, ’&Localizacion’ ) ;
  • 49. 1-1-4949 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia INSERT Con prompts personalizados SQL> ACCEPT depto_id prompt ‘Ingrese número dpto: ‘; SQL> ACCEPT name_id prompt ‘Ingrese nombre dpto: ‘; SQL> INSERT INTO dept (deptno, dname) VALUES (&depto_id, ‘&name_id’ );
  • 50. 1-1-5050 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia INSERT Copiando filas de otra tabla SQL> INSERT INTO managers (id, name, salary, hiredate) SELECT empno, ename, sal, hiredate FROM emp WHERE job = ‘MANAGER’ ; 3 rows inserted
  • 51. 1-1-5151 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia UPDATE Forma convencional SQL> UPDATE emp SET deptno = 20 WHERE empno=7782; Con una subconsulta de múltiples columnas SQL> UPDATE emp SET ( job , deptno) = ( Select job, deptno FROM emp WHERE empno = 7788 ) WHERE empno = 7698 ; JOB DEPTNO -------------- ----------- ANALYST 20
  • 52. 1-1-5252 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia UPDATE Basándose en otras tablas SQL> UPDATE emp SET deptno = ( Select deptno FROM emp WHERE empno = 7788 ) WHERE job = (Select job FROM emp WHERE empno = 7788 ) ; DEPTNO ------ 20 JOB --------------- CLERK
  • 53. 1-1-5353 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia DELETE Forma convencional SQL> DELETE FROM dept WHERE dname = ‘RESEARCH’ ; Basándose en otra Tabla SQL> DELETE FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname = ‘SALES’ ) ;
  • 54. 1-1-5454 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia MERGE Forma convencional SQL> MERGE INTO bonus D USING (SELECT ename,job,sal,comm FROM emp WHERE deptno = 30) S ON (D.ename = S.ename) WHEN MATCHED THEN UPDATE SET D.comm = S.sal*1.25 WHEN NOT MATCHED THEN INSERT (D.ename,D.job,D.sal,D.comm) VALUES (S.ename,S.job,S.sal,S.sal*1.25);
  • 55. 1-1-5555 Copyright © ADA, 2005. Todos los derechos reservados. Instrucciones DML – Sentencia TRUNCATE Forma convencional SQL> TRUNCATE TABLE bonus;
  • 56. 1-1-5656 Copyright © ADA, 2005. Todos los derechos reservados. Introducción a PL/SQLIntroducción a PL/SQL
  • 57. 1-1-5757 Copyright © ADA, 2005. Todos los derechos reservados. ObjetivosObjetivos • Explicar como la arquitectura de PL/SQL mejora el funcionamiento de una aplicación. • Identificar las importantes extensiones que PL/SQL proporciona a SQL. • Escribir y ejecutar bloques de PL/SQL.
  • 58. 1-1-5858 Copyright © ADA, 2005. Todos los derechos reservados. Estructura de un bloque PL/SQL BLOQUE PL/SQL DECLARE ....... ........ BEGIN ..... ..... .... EXCEPTION ..... ...... END ; Se declaran Variables, Exceptions y Cursores. Se manipulan las variables y cursores ya definidos. Aquí se dan las instrucciones procedimentales y de SQL. Es la única sección obligatoria. Para manejar errores que puedan existir en el bloque anterior. Es decir, aquí se introducen las rutinas de manejo de Errores.
  • 59. 1-1-5959 Copyright © ADA, 2005. Todos los derechos reservados. NOTA - Solo se requiere que aparezca la sección ejecutable. - Solo se permiten las siguientes instrucciones SQL en un bloque PL/SQL: - Las instrucciones terminan con un ; ( Punto y coma) - Se permite el uso de comentarios, usando para ello: Estructura de un bloque PL/SQL INSERT UPDATE DELETE SELECT - - comentario / * comentario * /
  • 60. 1-1-6060 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE .... BEGIN ....... BEGIN .... END; EXCEPTION WHEN OTHERS THEN BEGIN .... END; END ; Cualquier bloque puede contener sub - bloques. Un sub-bloque se puede colocar en las sección ejecutable y de manejo de errores de un bloque. Estructura de un bloque PL/SQL
  • 61. 1-1-6161 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE BEGIN ....... ....... La sección DECLARE forma parte del bloque PL/SQL, y en ella se declaran variables, cursores y excepciones. Palabras reservadas Las palabras reservadas son los nombres que utiliza Oracle para la ejecución de sus procesos. Sección de Declarativa
  • 62. 1-1-6262 Copyright © ADA, 2005. Todos los derechos reservados. Sección Declarativa : Variables Tipo Escalar NUMBER BYNARY_INTEGER CHAR VARCHAR2 DATE BOOLEAN Tipos de datos Escalar Descripción Enteros con o sin decimales Únicamente enteros Caracteres de longitud fija Caracteres de longitud variable. Valores de fecha TRUE, FALSE, NULL
  • 63. 1-1-6363 Copyright © ADA, 2005. Todos los derechos reservados. Nombre_variable [CONSTANT] tipo_de_dato [NOT NULL] [ : = expresion_sql ] ; REGLAS - Comienzan con una letra - Luego de la letra pueden colocarse números, letras y/o caracteres especiales. - Los nombres de las variables no son mas de 30 caracteres, y no pueden incluirse espacios. SINTAXIS Sección Declarativa : Variables Tipo Escalar
  • 64. 1-1-6464 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_fecha DATE; v_apellido VARCHAR2(20); ...... ...... Ejemplo: Sección Declarativa : Variables Tipo Escalar
  • 65. 1-1-6565 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_estado_civil CHAR ; v_direccion VARCHAR2 (20); v_nombre VARCHAR2 (10) := ‘Juan’ ; v_apellido VARCHAR2 (10) NOT NULL := ‘Perez’; CHAR / VARCHAR2 Sección Declarativa : Variables Tipo Escalar
  • 66. 1-1-6666 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_On_Off BOOLEAN NOT NULL := FALSE; v_Tipo_pago BOOLEAN; BOOLEAN Sección de Declarativa : Variables Tipo Escalar
  • 67. 1-1-6767 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_contador NUMBER ; v_salario NUMBER (6,2) ; v_minutos_diarios NUMBER := 24 * 60 ; v_total_ingresos BINARY_INTEGER (10) := 0 ; NUMBER / BINARY_INTEGER Sección de Declarativa : Variables Tipo Escalar
  • 68. 1-1-6868 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_fecha_pago DATE := ‘31-JUN-02’ ; v_fecha_bodas DATE ; v_fecha_inicio DATE NOT NULL := ‘01-JAN-90’ ; DATE Sección Declarativa : Variables Tipo Escalar
  • 69. 1-1-6969 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_nombre CONSTANT VARCHAR2 (10) := ‘Iris’; v_minutos_diarios CONSTANT NUMBER := 24 * 60 ; CONSTANTES Sección Declarativa : Variables Tipo Escalar
  • 70. 1-1-7070 Copyright © ADA, 2005. Todos los derechos reservados. TYPE nombre_tipo IS TABLE OF tipo_dato [ NOT NULL] INDEX BY BYNARY_INTEGER ; TABLE Sección Declarativa : Variables Tipo Compuesto Es un tipo de variable definido por el usuario, que permite personalizar la estructura de los datos que manipula un programa. Las filas de estos no son almacenadas en orden particular, pero su índice o número identificador permite locarlizarla y ordenarlas al momento que se realice un recuperación de estos, igual que un arreglo (array). Sintaxis :
  • 71. 1-1-7171 Copyright © ADA, 2005. Todos los derechos reservados. TYPE munitabla_tipo IS TABLE OF varchar2 (10); TYPE sal IS TABLE OF number; TYPE fec_nac IS TABLE OF date; TYPE periodo_tipo IS TABLE OF char(5); Sección Declarativa : Variables Tipo Compuesto Ejemplo:
  • 72. 1-1-7272 Copyright © ADA, 2005. Todos los derechos reservados. RECORD Sección Declarativa : Variables Tipo Compuesto Son datos relacionados almacenados en campos, c/u de ellos tiene su propio nombre y tipo de dato. TYPE nombre_tipo IS RECORD (campo1 tipo_dato [ NOT NULL] , campo2 tipo_dato [ NOT NULL] , ....) ; nombre_record NOMBRE_TIPO; Sintaxis :
  • 73. 1-1-7373 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE TYPE datamuni_tipo IS RECORD (municipalidad NUMBER(4), nombre_muni VARCHAR2(50), total_personas NUMBER(3)); data_muni DATAMUNI_TIPO; RECORD Sección Declarativa : Variables Tipo Compuesto Ejemplo :
  • 74. 1-1-7474 Copyright © ADA, 2005. Todos los derechos reservados. TYPE nombre_tipo IS VARRAY(tamaño_maximo) OF tipo_elemento [NOT NULL]; VARRAY Sección Declarativa : Variables Tipo Compuesto Permiten asociar a un simple identificador toda una colección o grupo de datos. SINTAXIS Donde, tipo_elemento, es cualquier tipo de datos de PL/SQL a excepción de: Binary_integer, Boolean, Long, Long raw, Nchar, Nvarchar2, Nclob, Table, Ref cursor, Positive, Natural, NaturalN, String, Pls_integer, Signtype, PositiveN
  • 75. 1-1-7575 Copyright © ADA, 2005. Todos los derechos reservados. Conversión de Datos PL/SQL soporta una conversión explícita y una implícita (la cual es automática) Conversión EXPLICITA Date Number Char Char Char Char Date Number De Función TO_DATE TO_NUMBER TO_CHAR TO_CHAR A PL/SQL no puede convertir un varchar2 que contiene valores caracteres alfabéticos a un tipo NUMERICO.
  • 76. 1-1-7676 Copyright © ADA, 2005. Todos los derechos reservados. Conversión de Datos Conversión IMPLICITA PL/SQL convierte automáticamente un tipo de dato de una columna fuente al tipo de dato de la variable. Si PL /SQL no pudiera realizar la conversión automáticamente, se generará un error de compilación y deberá usarse una función .
  • 77. 1-1-7777 Copyright © ADA, 2005. Todos los derechos reservados. Conversión de Datos DECLARE v_fecha_nac CHAR(5) := &que_año_naciste; v_fecha_actual CHAR(5) ; v_edad_hoy NUMBER(5) ; BEGIN SELECT TO_CHAR(SYSDATE,’YYYY’) INTO v_fecha_actual FROM DUAL; v_edad_hoy := v_fecha_actual - v_fecha_nac ; END ; Ejemplo :
  • 78. 1-1-7878 Copyright © ADA, 2005. Todos los derechos reservados. SQL en Bloques PL/SQL DECLARE v_cod_cargo NUMBER(4) := 10; v_nombre_cargo VARCHAR2 (25) := ‘OBRERO’; BEGIN INSERT INTO cargos VALUES (v_cod_cargo, v_nombre_cargo); END; Ejemplo con INSERT:
  • 79. 1-1-7979 Copyright © ADA, 2005. Todos los derechos reservados. SQL en Bloques PL/SQL DECLARE v_prueba CHAR(1) := ‘X’; BEGIN UPDATE cargos SET nomb_cargo = ( v_prueba || ‘ ‘ || nomb_cargo ) WHERE cargoid<3; END; Ejemplo con UPDATE:
  • 80. 1-1-8080 Copyright © ADA, 2005. Todos los derechos reservados. SQL en Bloques PL/SQL DECLARE v_cod_cargo NUMBER(4) := 10; v_nombre_cargo VARCHAR2 (25) := ‘OBRERO’; BEGIN DELETE FROM cargos WHERE cargoid = cod_cargo; END; Ejemplo con DELETE:
  • 81. 1-1-8181 Copyright © ADA, 2005. Todos los derechos reservados. SQL en Bloques PL/SQL DECLARE ------ BEGIN ----- SELECT col1 [ ,col2,col3,....] INTO var1 [ , var2, var3, ...........] FROM nombre_tabla WHERE condicion1 [ AND / OR condicion2.....] ; END; SELECT: La instrucción SELECT debe regresar exactamente un registro, si regresa 0 ó mas de 1 registro, ocurrirá un error. Sintaxis:
  • 82. 1-1-8282 Copyright © ADA, 2005. Todos los derechos reservados. IF < expresión> THEN <secuencia de sentencias> [ ELSIF <expresión booleana > THEN <secuencia de sentencias> ] [ ELSIF <expresión booleana > THEN <secuencia de sentencias> ] [ ELSE <expresión booleana > <secuencia de sentencias> ] END IF; IF Control Condicional e Interactivo Sintaxis:
  • 83. 1-1-8383 Copyright © ADA, 2005. Todos los derechos reservados. IF v_ingresos >= 20000 THEN v_impuestos := 18 ; ELSIF (v_ingresos > = 15 and v_ingresos < 20000 ) THEN v_impuestos : = 15 ; ELSE v_impuestos := 10 ; END IF ; IF Control Condicional e Interactivo Ejemplo:
  • 84. 1-1-8484 Copyright © ADA, 2005. Todos los derechos reservados. LOOP Control Condicional e Interactivo La sentencia LOOP se utiliza para ejecutar múltiples veces una secuencia de instrucciones. PL/SQL provee diferentes tipos de LOOPS: - Basic LOOP - WHILE loop - FOR loop - Cursor FOR loop
  • 85. 1-1-8585 Copyright © ADA, 2005. Todos los derechos reservados. LOOP < secuencia de sentencias > END LOOP; Basic LOOP Control Condicional e Interactivo Sintaxis : Donde: Secuencia de sentencias es un grupo de sentencias que se repetirá una o varias veces hasta que se ejecute un EXIT que estará dentro del grupo de sentencias.
  • 86. 1-1-8686 Copyright © ADA, 2005. Todos los derechos reservados. a := 0; LOOP a := a+1 ; IF a = 10 THEN EXIT ; END IF ; END LOOP; Basic LOOP Control Condicional e Interactivo Ejemplo:
  • 87. 1-1-8787 Copyright © ADA, 2005. Todos los derechos reservados. Basic LOOP Control Condicional e Interactivo También se puede terminar el bucle con la sentencia EXIT WHEN, EXIT WHEN <condición> ; Ejemplo: a := 0; LOOP a := a+1 ; EXIT WHEN a := 10 ; END LOOP;
  • 88. 1-1-8888 Copyright © ADA, 2005. Todos los derechos reservados. FOR LOOP Control Condicional e Interactivo Repiten una secuencia de instrucciones una determinada cantidad de veces: Sintaxis: FOR <índice> IN [ REVERSE ] <entero>..<entero> LOOP < secuencia de sentencias > END LOOP;
  • 89. 1-1-8989 Copyright © ADA, 2005. Todos los derechos reservados. FOR LOOP Control Condicional e Interactivo Donde: • Índice, es un índice numérico que identifica a la variable que será aumentada o disminuida, esta no necesita ser declarada en la sección DECLARE. • REVERSE, nos indica que la secuencia del índice ira disminuyendo. • Entero, es el rango de números de la secuencia que índice deberá recorrer.
  • 90. 1-1-9090 Copyright © ADA, 2005. Todos los derechos reservados. FOR a IN 1..10 LOOP b := a+1 ; END LOOP; FOR a IN REVERSE 1..10 LOOP b := a+10 ; END LOOP; FOR LOOP Control Condicional e Interactivo Ejemplo:
  • 91. 1-1-9191 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_a NUMBER(3) := 0 ; v_b NUMBER(3) := 0 ; BEGIN FOR v_a IN 1..50 LOOP INSERT INTO temp (a, g) VALUES ( v_a+v_b, ‘DEFECTO’) ; END LOOP; FOR v_b IN REVERSE 1..50 LOOP INSERT INTO temp (a, g) VALUES ( v_a+v_b, ‘REVERSA’) ; END LOOP; END ; Control Condicional e Interactivo
  • 92. 1-1-9292 Copyright © ADA, 2005. Todos los derechos reservados. WHILE LOOP Control Condicional e Interactivo Repiten una secuencia de instrucciones siempre y cuando la condición expresada inicialmente se cumpla. SIntaxis: WHILE <condición> LOOP < secuencia de sentencias > END LOOP;
  • 93. 1-1-9393 Copyright © ADA, 2005. Todos los derechos reservados. WHILE LOOP Control Condicional e Interactivo Donde: Condición, es la condición que deberá cumplirse antes de que se pueda ejecutar la secuencia de instrucciones o sentencias que siguen a continuación. NOTA: La diferencia con el LOOP SIMPLE es que se ejecuta aunque sea una vez, mientras que WHILE LOOP puede que no se ejecute ni una vez ya que la condición inicial así lo puede determinar.
  • 94. 1-1-9494 Copyright © ADA, 2005. Todos los derechos reservados. WHILE v_declarada < 10 LOOP v_declarada := v_declarada +1 ; END LOOP; WHILE LOOP Control Condicional e Interactivo Ejemplo:
  • 95. 1-1-9595 Copyright © ADA, 2005. Todos los derechos reservados. DECLARE v_a NUMBER (3) : = 10 ; v_b temp.a%TYPE : = 1 ; BEGIN WHILE v_a > 1 LOOP INSERT INTO temp (a,g,h) VALUES (v_a,’ while’, ‘a’) ; v_a : = v_a - 1 ; END LOOP; WHILE v_b < 10 LOOP INSERT INTO temp (a,g,h) VALUES (v_b,’ while’, ‘b’) ; v_b : = v_b + 1 ; END LOOP; END ; Control Condicional e Interactivo
  • 96. 1-1-9696 Copyright © ADA, 2005. Todos los derechos reservados. Cursores Oracle permite abrir y nombrar un area de trabajo que guardará la información procesada. Sintaxis: CURSOR <nombre_cursor> IS < Instrucción select >
  • 97. 1-1-9797 Copyright © ADA, 2005. Todos los derechos reservados. Cursores Ejemplos: CURSOR c1 IS SELECT empno, ename, job, sal FROM emp WHERE sal > 2000; CURSOR c2 IS SELECT * FROM dept WHERE deptno = 10;
  • 98. 1-1-9898 Copyright © ADA, 2005. Todos los derechos reservados. Cursores Ejemplo: SET SERVEROUTPUT ON; DECLARE CURSOR c_datos IS SELECT deptno,dname FROM DEPT; vDEPTNO NUMBER(2); vDNAME VARCHAR2(14); BEGIN OPEN c_datos; LOOP FETCH c_datos INTO vDEPTNO,vDNAME; EXIT WHEN c_datos%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre: '||vDNAME) ; END LOOP; CLOSE c_datos; END;
  • 99. 1-1-9999 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Son aquellos que se forman con una sentencia SELECT que recupera múltiples renglones. El siguiente ejemplo es un CURSOR EXPLICITO. DECLARE CURSOR c_1 IS SELECT ename FROM emp; v_name varchar2(10); BEGIN OPEN c_1 ; FETCH c_1 INTO v_name; CLOSE c_1 ; END ;
  • 100. 1-1-100100 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Permite recuperar los registros del cursor, uno por uno. Sintaxis: FECTH nombre_cursor INTO nombre_variable1[,nombre_variable2,…]; FECTH … INTO
  • 101. 1-1-101101 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Este atributo es verdadero si el FETCH no regresa ninguna fila. Sintaxis: nombre_cursor%NOTFOUND; ATRIBUTO: %NOTFOUND LOOP FETCH c_1 INTO c_periodo; EXIT WHEN c_1%NOTFOUND; END LOOP ; Ejemplo:
  • 102. 1-1-102102 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Este atributo es verdadero si el FETCH regresa una fila, inicialmente es NULL, y si no regresa ninguna fila es FALSE. Sintaxis: nombre_cursor%FOUND ; ATRIBUTO: %FOUND
  • 103. 1-1-103103 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Ejemplo: SET SERVEROUTPUT ON; DECLARE CURSOR c_datos IS SELECT deptno,dname FROM DEPT; vDEPTNO NUMBER(2); vDNAME VARCHAR2(14); BEGIN OPEN c_datos; FETCH c_datos INTO vDEPTNO,vDNAME; WHILE c_datos%FOUND LOOP DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre: '||vDNAME) ; FETCH c_datos INTO vDEPTNO,vDNAME; END LOOP; CLOSE c_datos; END;
  • 104. 1-1-104104 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Este atributo cuenta el número de registros que se han obtenido con el FETCH. Cuando el cursor es abierto tiene el valor de 0 (cero). Sintaxis: nombre_cursor%ROWCOUNT; ATRIBUTO: %ROWCOUNT
  • 105. 1-1-105105 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Ejemplo: SET SERVEROUTPUT ON; DECLARE CURSOR c_datos IS SELECT deptno,dname FROM DEPT; vDEPTNO NUMBER(2); vDNAME VARCHAR2(14); BEGIN OPEN c_datos; DBMS_OUTPUT.PUT_LINE( c_datos%rowcount ); FETCH c_datos INTO vDEPTNO,vDNAME; DBMS_OUTPUT.PUT_LINE( c_datos%rowcount ); WHILE c_datos%FOUND LOOP DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre: '||vDNAME); FETCH c_datos INTO vDEPTNO,vDNAME; END LOOP; DBMS_OUTPUT.PUT_LINE( c_datos%rowcount ); CLOSE c_datos; END;
  • 106. 1-1-106106 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS El atributo te permite saber si el cursor esta abierto, en cuyo caso retorna el valor de TRUE, caso contrario retorna FALSE. Sintaxis: nombre_cursor%ISOPEN; ATRIBUTO: %ISOPEN
  • 107. 1-1-107107 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS SET SERVEROUTPUT ON; DECLARE CURSOR c_datos IS SELECT deptno,dname FROM DEPT; vDEPTNO NUMBER(2); vDNAME VARCHAR2(14); BEGIN IF c_datos%ISOPEN THEN DBMS_OUTPUT.PUT_LINE( 'cursor abierto' ); ELSE DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' ); END IF; OPEN c_datos; IF c_datos%ISOPEN THEN DBMS_OUTPUT.PUT_LINE( 'cursor abierto' ); ELSE DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' ); END IF;
  • 108. 1-1-108108 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS FETCH c_datos INTO vDEPTNO,vDNAME; WHILE c_datos%FOUND LOOP DBMS_OUTPUT.PUT_LINE( 'codigo: ' || vDEPTNO || ' ... nombre: '||vDNAME) ; FETCH c_datos INTO vDEPTNO,vDNAME; END LOOP; CLOSE c_datos; IF c_datos%ISOPEN THEN DBMS_OUTPUT.PUT_LINE( 'cursor abierto' ); ELSE DBMS_OUTPUT.PUT_LINE( 'cursor cerrado' ); END IF; END;
  • 109. 1-1-109109 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Esta forma especial de FOR especifica que se ejecutará una secuencia de instrucciones cada vez que el cursor regrese un renglón. Sintaxis: FOR < nombre_registro > IN < nombre_cursor > LOOP < secuencia de instrucciones > END LOOP ; Sentencia FOR para Cursores
  • 110. 1-1-110110 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS Cuando un ciclo del cursor FOR se inicia, se ejecuta un OPEN implícito al cursor. Para cada registro que satisface la consulta asociada con el cursor, se ejecuta un FETCH implícito sobre las variables de <nombre_registro>. Cuando ya no hay más registros que extraer se ejecuta un CLOSE implícito sobre el cursor, y así termina el ciclo. Sentencia FOR para Cursores
  • 111. 1-1-111111 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: EXPLICITOS SET SERVEROUTPUT ON; DECLARE CURSOR c_datos IS SELECT deptno,dname FROM DEPT; BEGIN FOR v_datos IN c_datos LOOP DBMS_OUTPUT.PUT_LINE( 'codigo: ' || v_datos.deptno || ' ... nombre: '||v_datos.dname) ; END LOOP; END; Ejemplo:
  • 112. 1-1-112112 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: IMPLICITOS SQL%NOTFOUND Solo funciona con instrucciones SQL DML. Un cursor implícito es llamado también CURSOR SQL. Atributos de Cursores Implícitos SQL%FOUND SQL%ROWCOUNT
  • 113. 1-1-113113 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: IMPLICITOS Es verdadero si la ultima instrucción SQL ejecutada no implicó ningún registro. Ejemplo : ATRIBUTO: %NOTFOUND SET SERVEROUTPUT ON; BEGIN DELETE FROM emp WHERE empno=9999; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE( 'No existe empleado' ) ; END IF; END;
  • 114. 1-1-114114 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: IMPLICITOS Es verdadero si la última instrucción SQL ejecutada implicó algún registro. Ejemplo : ATRIBUTO: %FOUND SET SERVEROUTPUT ON; DECLARE v_ename varchar2(14); BEGIN select ename into v_ename from emp where empno=7902; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE( 'Si existe empleado' ) ; END IF; END;
  • 115. 1-1-115115 Copyright © ADA, 2005. Todos los derechos reservados. Cursores: IMPLICITOS Cuenta el total de renglones afectados por la última instrucción SQL ejecutada. Ejemplo : ATRIBUTO: %ROWCOUNT SET SERVEROUTPUT ON; BEGIN UPDATE emp SET hiredate=sysdate WHERE deptno='30'; DBMS_OUTPUT.PUT_LINE( 'Lineas afectadas : ' || SQL %ROWCOUNT ) ; COMMIT; END;
  • 116. 1-1-116116 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION Los errores de PL/SQL son llamados excepciones, que puede estar predefinida o puede ser definida por el usuario. Existe una diferencia entre ambos tipos de excepciones, las primeras se disparan sin necesidad de ser invocadas, las segundas tienen que ser invocadas, para ello se utiliza la sentencia RAISE.
  • 117. 1-1-117117 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION Sintaxis : DECLARE exception_usuario EXCEPTION ; BEGIN ......... ......... EXCEPTION WHEN exception_oracle/exception_usuario/OTHERS THEN < secuencia de sentencias >; END ;
  • 118. 1-1-118118 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION Se dispara cuando un select retorna mas de 1 línea o registro. TOO_MANY_ROWS Se dispara cuando un select no retorna ninguna línea o registro. NO_DATA_FOUND Se dispara cuando se ha especificado o hecho referencia a un cursor inválido. INVALID_CURSOR
  • 119. 1-1-119119 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION Se dispara cuando ha ocurrido un error de conversión o validación (aritmética, numérica, cadena de caracteres). VALUE_ERROR Se dispara cuando se ha intentado realizar un división por 0. ZERO_DIVIDE Se dispara cuando se ha intentado insertar un valor duplicado en una columna con índice único. DUP_VAL_ON_INDEX
  • 120. 1-1-120120 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION Otras excepciones : INVALID_NUMBER VALUE_ERROR LOGIN_DENIED PROGRAM_ERROR CURSOR_ALREADY_OPEN TIME_OUT_RESOURCE STORAGE_ERROR NOT_LOGGED_ON
  • 121. 1-1-121121 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION SET SERVEROUTPUT ON; DECLARE v_dname varchar2(14); BEGIN select dname into v_dname from dept where deptno between 10 and 30; --select dname into v_dname from dept where deptno between 80 and 90; DBMS_OUTPUT.PUT_LINE( 'Lineas afectadas : ' || SQL %ROWCOUNT ) ; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Hay mas de un registro!!!!!'); WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No hay datos!!!!'); END; Ejemplo 1:
  • 122. 1-1-122122 Copyright © ADA, 2005. Todos los derechos reservados. Sección EXCEPTION SET SERVEROUTPUT ON; DECLARE v_cnt varchar2(14); mierror EXCEPTION; BEGIN select count(*) into v_cnt from dept; if v_cnt>1 then RAISE mierror; else DBMS_OUTPUT.PUT_LINE( '1 Departamento' ); end if; EXCEPTION WHEN mierror THEN DBMS_OUTPUT.PUT_LINE('Error de usuario!!!!!'); END; Ejemplo 2:
  • 123. 1-1-123123 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas ANONIMOS Existen dos tipos principales de bloques PL/SQL: ANONIMOS y NOMINADOS Los bloques anónimos se compilan cada vez que se ejecutan, no se almacenan en la base de datos y no pueden llamarse directamente desde otros bloques PL/SQL. DECLARE ... BEGIN ......... END ;
  • 124. 1-1-124124 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas NOMINADOS Se pueden almacenar en la base de datos y ejecutarse cuando sea conveniente. De manera similar a otros objetos, un subprograma se crea mediante la instrucción CREATE. Las siguientes son estructuras nominadas : PROCEDIMIENTOS FUNCIONES PAQUETESDISPARADORES
  • 125. 1-1-125125 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas PROCEDIMIENTO La estructura de un procedimiento tiene, por tanto, la siguiente sintaxis: CREATE [ OR REPLACE ] PROCEDURE nombre_procedimiento AS /* esta es la sección declarativa */ BEGIN /* esta es la sección ejecutable */ EXCEPTION /* esta es la sección de tratamiento de errores */ END;
  • 126. 1-1-126126 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas PROCEDIMIENTO La sintaxis básica de la instrucción CREATE [OR REPLACE ] PROCEDURE es : CREATE [ OR REPLACE ] PROCEDURE nombre_procedimiento [ ( argumento [ IN | OUT | IN OUT ] tipo, ..... argumento [ IN | OUT | IN OUT ] tipo ) ] IS | AS cuerpo_procedimiento
  • 127. 1-1-127127 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas PROCEDIMIENTO Ejemplo : CREATE OR REPLACE PROCEDURE proc_ejemplo1 AS CURSOR V_CURSOR IS SELECT * FROM MUNICIPIOS; BEGIN FOR v_datos IN v_cursor LOOP DBMS_OUTPUT.PUT_LINE('Municipalidad:’ || v_datos.nombre ); END LOOP; END;
  • 128. 1-1-128128 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas PROCEDIMIENTO Un procedimiento se puede ejecutar de varias formas : 1. Utilizando el comando EXECUTE EXECUTE Proc_ejemplo1; BEGIN Proc_ejemplo1; END ; 2. Llamándolo desde un bloque de programa o subprograma
  • 129. 1-1-129129 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas FUNCION La sintaxis de creación de una función es muy parecida a la de los procedimientos: CREATE [ OR REPLACE ] FUNCTION nombre_función [ ( argumento [ IN | OUT | IN OUT ] tipo, ..... argumento [ IN | OUT | IN OUT ] tipo ) ] IS | AS RETURN tipo_retorno IS | AS cuerpo_función
  • 130. 1-1-130130 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Consideraciones: 1. La lista de argumentos es opcional. Si no hay parámetros, los paréntesis no aparecerían ni en la declaración de la función ni en la llamada a la misma. 2. El tipo de valor que devuelve la función en necesario, y es parte de la sintaxis de la declaración. FUNCION
  • 131. 1-1-131131 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas La instrucción RETURN se utiliza para devolver el control, junto con un valor, al entorno que realizó la llamada. RETURN expresión; - Puede haber más de una instrucción RETURN en una función. - La finalización de una función sin que se ejecute una instrucción RETURN es un error. FUNCION: Instrucción RETURN
  • 132. 1-1-132132 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Ejemplo 1 : CREATE OR REPLACE FUNCTION func_ejemplo1 RETURN empleados.nombre%TYPE AS v_dato empleados.nombre%TYPE ; v_codigo empleados.empleadoid%TYPE := 0 ; BEGIN SELECT nombre INTO v_dato FROM EMPLEADOS WHERE empleadoid=v_codigo; RETURN v_dato; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN ’ Codigo de empleado no existe!!! ’ ; END; FUNCION
  • 133. 1-1-133133 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Una función se puede ejecutar de varias formas : 1. En una sentencia SELECT SELECT func_ejemplo1 FROM DUAL; BEGIN v_dato = func_ejemplo2 (5001); END; 2. Llamándolo desde un bloque de programa o subprograma FUNCION
  • 134. 1-1-134134 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Ejemplo 2 : CREATE OR REPLACE FUNCTION func_ejemplo2 ( p_codigo in empleados.empleadoid%TYPE) RETURN empleados.nombre%TYPE AS v_dato empleados.nombre%TYPE; BEGIN SELECT nombre INTO v_dato FROM EMPLEADOS WHERE empleadoid=p_codigo; RETURN v_dato; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 'Codigo de empleado no existe!!!'; END ; FUNCION
  • 135. 1-1-135135 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Eliminación de Procedimientos y Funciones La sintaxis para eliminar un procedimiento es: DROP PROCEDURE nombre_procedimiento La sintaxis para eliminar una función es: DROP FUNCTION nombre_función
  • 136. 1-1-136136 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Parámetros de los subprogramas Los parámetros tiene distintos modos : - Dentro del procedimiento, el parámetro formal se comporta como una constante - Se considera de sólo lectura y no se puede cambiar. - Cuando el procedimiento finaliza y se devuelve el control al entorno que lo llamo, el parámetro real no se modifica. IN
  • 137. 1-1-137137 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas - Se ignora cualquier valor que el parámetro real pueda tener cuando se produce la llamada. - Se puede escribir en ella. - Cuando el procedimiento finaliza y se devuelve el control al entorno que lo llamo, se asigna el valor del parámetro formal al parámetro real. Parámetros de los subprogramas OUT
  • 138. 1-1-138138 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas - Este modo es la combinación de los modos IN y OUT. - El valor del parámetro real se pasa al procedimiento - Se puede leer y escribirse en ella. - Cuando el procedimiento finaliza y se devuelve el control al entorno que lo llamo, se asigna el valor del parámetro formal al parámetro real. Parámetros de los subprogramas IN OUT
  • 139. 1-1-139139 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Ejemplo : CREATE OR REPLACE PROCEDURE proc_ejemplo2 ( p_codigo IN number ) AS v_nombre VARCHAR2(50) := ’ v_nombre = <VACIO> ’ ; BEGIN dbms_output.put_line(v_nombre) ; proc_busca_empleado(p_codigo,v_nombre) ; dbms_output.put_line('v_nombre = '||v_nombre) ; END; Parámetros de los subprogramas
  • 140. 1-1-140140 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas CREATE OR REPLACE PROCEDURE proc_busca_empleado ( p_codigo in char, p_nombre in out varchar2) AS BEGIN SELECT nombre INTO p_nombre FROM EMPLEADOS WHERE empleadoid=p_codigo; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line (’ codigo de empleado no existe!!! ') ; END; Parámetros de los subprogramas
  • 141. 1-1-141141 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas PL/SQL permite agrupar toda la programación relacionada en un objeto de base de datos, llamado paquete. Un paquete es una estructura de PL/SQL que permite almacenar juntos varios objetos relacionados. Package
  • 142. 1-1-142142 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Cabecera Incluye información acerca del contenido del paquete. Cuerpo Es un objeto independiente de la cabecera. El cuerpo no puede compilarse hasta que la cabecera tenga estado válido. Package : Componentes
  • 143. 1-1-143143 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas CREATE PACKAGE mipack AS PROCEDURE miproc ( v_dato1,v_dato2 ) ; FUNCTION mifunc ( v_dato1) RETURN number; END ; CREATE PACKAGE BODY mipack AS PROCEDURE miproc ( v_dato1,v_dato2 ) as begin -- end; FUNCTION mifunc (v_dato1) RETURN number begin -- end; END;
  • 144. 1-1-144144 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Sintaxis : Package CREATE [ OR REPLACE ] PACKAGE nombre_paquete IS | AS especificación_procedimientos | especificación_funciones | declaración_variables | declaración_excepciones | declaración_cursores | END nombre_paquete;
  • 145. 1-1-145145 Copyright © ADA, 2005. Todos los derechos reservados. Sub-Programas Ejemplo : Package CREATE OR REPLACE PACKAGE PACK_EJEMPLO1 AS PROCEDURE proc_municipios; END; /* Cabecera */
  • 146. 1-1-146146 Copyright © ADA, 2005. Todos los derechos reservados. Paquetes Package CREATE OR REPLACE PACKAGE BODY PACK_EJEMPLO1 AS PROCEDURE proc_municipios AS CURSOR V_CURSOR IS SELECT * FROM MUNICIPIOS; BEGIN FOR V_DATOS IN V_CURSOR LOOP DBMS_OUTPUT.PUT_LINE('MUNICIPALIDAD : ’ || V_DATOS.NOMBRE); END LOOP; END; END ; /* Cuerpo */
  • 147. 1-1-147147 Copyright © ADA, 2005. Todos los derechos reservados. Paquetes Un paquete se puede ejecutar de la siguiente manera : BEGIN PACK_EJEMPLO1.proc_municipios; END; Llamándolo desde un bloque de programa o subprograma Package SELECT PACK_EJEMPLO1.func_numero(10) FROM DUAL; Utilizando una sentencia SELECT
  • 148. 1-1-148148 Copyright © ADA, 2005. Todos los derechos reservados. Paquetes Cualquier objeto que se declara en la cabecera del paquete se encuentra dentro del ámbito y es visible fuera paquete. Package : Ámbito Ejemplo : CREATE OR REPLACE PACKAGE PACK_EJEMPLO1 AS CURSOR v_cursor IS SELECT * FROM MUNICIPIOS; PROCEDURE proc_municipios; END;
  • 149. 1-1-149149 Copyright © ADA, 2005. Todos los derechos reservados. Paquetes Package : Ambito CREATE OR REPLACE PACKAGE BODY PACK_EJEMPLO1 AS PROCEDURE proc_municipios AS BEGIN FOR V_DATOS IN V_CURSOR LOOP DBMS_OUTPUT.PUT_LINE('MUNICIPALIDAD : ’ || V_DATOS.NOMBRE); END LOOP; END; END;
  • 150. 1-1-150150 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES Al igual que los procedimientos, funciones y paquetes, los disparadores se almacenan en la base de datos y no pueden ser declarados en un bloque PL/SQL. El disparador se ejecuta de manera implícita cada vez que tiene lugar el suceso de disparo y no admite argumentos.
  • 151. 1-1-151151 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES Los disparadores pueden utilizarse para: - Mantener restricciones de integridad complejas. - Acciones de auditoria. - Realizar otras acciones a raíz de la ejecución de sentencias DML.
  • 152. 1-1-152152 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: Restricciones - Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o SAVEPOINT. - El cuerpo del disparador no puede contener ninguna declaración de variables LONG o LONG RAW.
  • 153. 1-1-153153 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES Sintaxis : CREATE [OR REPLACE ] TRIGGER nombre_disparo BEFORE | AFTER | INSTEAD OF suceso_disparo claúsula_referencia [ WHEN condición_disparo ] [ FOR EACH ROW ] cuerpo_disparo ;
  • 154. 1-1-154154 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES Existen tres principales tipos de disparadores: DML SUSTITUCION SISTEMA
  • 155. 1-1-155155 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: DML Un disparador DML se activa con una operación INSERT, UPDATE o DELETE realizada sobre una tabla de la base de datos.
  • 156. 1-1-156156 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: DML Ejemplo: CREATE OR REPLACE TRIGGER update_municipios AFTER INSERT OR DELETE OR UPDATE ON municipios DECLARE v_numero NUMBER(4); BEGIN SELECT count(*) INTO v_numero FROM MUNICIPIOS; INSERT INTO TEMP (A,H) VALUES (v_numero, 'Municipalidades registradas'); END ;
  • 157. 1-1-157157 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: Sistema Un disparador del sistema se activa cuando tiene lugar un suceso del sistema.
  • 158. 1-1-158158 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores TRIGGERS SISTEMA: Manejo de Sucesos Suceso SHUTDOWN SERVERRROR LOGON LOGOFF CREATE DROP ALTER Temporización Permitido BEFORE AFTER AFTER BEFORE BEFORE, AFTER BEFORE, AFTER BEFORE, AFTER
  • 159. 1-1-159159 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores Ejemplo: CREATE OR REPLACE TRIGGER log_modifica AFTER ALTER ON SCHEMA BEGIN INSERT INTO TEMP (USUARIO,DUENO,TIPO,FECHA DATE) VALUES(USER,SYS.DICTIONARY_OBJ_OWNER, SYS.DICTIONARY_OBJ_NAME, SYS.DICTIONARY_OBJ_TYPE, SYSDATE); END ; DISPARADORES: Sistema
  • 160. 1-1-160160 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: Sustitución Un disparador por sustitución pueden definirse únicamente sobre vistas.
  • 161. 1-1-161161 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores Ejemplo: CREATE OR REPLACE VIEW v_municipios AS SELECT * FROM MUNICIPIOS ; CREATE OR REPLACE TRIGGER insert_vista INSTEAD OF INSERT ON v_municipios BEGIN INSERT INTO MUNICIPIOS VALUES(:NEW.MUNIID,:NEW.NOMBRE,:NEW.DIRECCION, :NEW.POBLACION, :NEW.EXTENSION ) ; END ; DISPARADORES: Sustitución
  • 162. 1-1-162162 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: Habilitar - Deshabilitar Un disparador se elimina así: DROP TRIGGER nombre_disparador ; A diferencia de los procedimientos, funciones y paquetes un disparador se puede deshabilitar sin necesidad de eliminarlo: ALTER TRIGGER nombre_disparador [ DISABLE | ENABLE ] ;
  • 163. 1-1-163163 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores DISPARADORES: Habilitar - Deshabilitar También se puede habilitar o deshabilitar todos los disparadores de una tabla determinada utilizando la orden ALTER TABLE con la cláusula ENABLE ALL TRIGGERS o DISABLE ALL TRIGGERS. ALTER TABLE temp [ ENABLE | DISABLE ] ALL TRIGGERS ;
  • 164. 1-1-164164 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores Utilizando :OLD y :NEW Dentro del disparador, puede acceder a los datos de la fila que está siendo actualmente procesada utilizando :OLD y :NEW
  • 165. 1-1-165165 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores Utilizando :OLD y :NEW Orden INSERT UPDATE DELETE :OLD No definido - NULL Valores originales de la fila, antes de la actualización Valores originales antes del borrado de la fila :NEW Valores que serán insertados cuando se complete la orden Nuevos valores que serán escritos cuando se complete la orden No definido - NULL
  • 166. 1-1-166166 Copyright © ADA, 2005. Todos los derechos reservados. Disparadores Utilizando predicados : INSERTING, UPDATING y DELETING En los disparadores se pueden utilizar funciones para controlar el flujo de ejecución de las sentencias: INSERTING retorna TRUE si se inserta una fila UPDATING retorna TRUE si se actualiza una fila. DELETING retorna TRUE si se elimina una fila.
  • 167. 1-1-167167 Copyright © ADA, 2005. Todos los derechos reservados. ResumenResumen En este capítulo, hemos visto como:En este capítulo, hemos visto como: • Usar sentencias SQL para la selección de datos.Usar sentencias SQL para la selección de datos. • Usar sentencias SQL para la manipulación deUsar sentencias SQL para la manipulación de datos.datos. • Crear bloques de código PL/SQL.Crear bloques de código PL/SQL. • Usar sentencias de control de flujo.Usar sentencias de control de flujo. • Crear unidades de programa.Crear unidades de programa.