Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DEFINICION DE SUBCONSULTA
UNA SUBCONSULTA ES UNA
SENTENCIA SELECT INCRUSTADA EN
UNA CLAUSULA DE OTRA SENTENCIA
SELECT DE SQL
SELECT <LISTA DE COLUMNAS SELECCIONADAS>
FROM <TABLAS>
WHERE EXPRESION OPERADOR
(SELECT <LISTA DE COLUMNAS SELECCIONADAS>
FROM <TABLA>)
2
SUBCONSULTAS
UNA SUBCONSULTA SE EJECUTA PRIMERO
Y SU RESULTADO ES USADO PARA
COMPLETAR LA CONDICION DE LA
CONSULTA PADRE.
SINTAXIS
UNA SUBCONSULTA DEBE ESTAR ENTRE
PARNTESIS.
UNA SUBCONSULTA DEBE APARECER A LA
DERECHA DEL OPERADOR DE COMPARACION
UNA SUBCONSULTA NO PUEDE CONTENER UN
ORDER BY. SE PUEDE USAR SLO UN ORDER
BY EN UNA SENTENCIA SELECT PADRE.
3
SUBCONSULTA
SELECCIONE EL NOMBRE Y SALARIO
DE AQUELLOS EMPLEADOS QUE SU
TRABAJO (JOB) SEA EL MISMO DEL
EMPLEADO CUYO CDIGO SEA IGUAL
A 7369. Y SALARIOS SEAN MENORES
QUE EL PROMEDIO DEL SALARIO DE
LOS EMPLEADOS.
SUBCONSULTAS
SQL> SELECT JOB FROM EMP WHERE EMPNO=7369;
JOB
--------CLERK
SQL> SELECT AVG(SAL) FROM EMP;
AVG(SAL)
---------2073,21429
SQL> SELECT ENAME, SAL FROM EMP WHERE JOB='CLERK' AND SAL<2073.21429;
ENAME
SAL
---------- ---------SMITH
800
ADAMS
1100
JAMES
950
MILLER
1300
SELECT ENAME,SAL
FROM EMP
WHERE JOB=(SELECT JOB FROM EMP WHERE EMPNO=7369)
AND SAL<(SELECT AVG(SAL) FROM EMP);
ENAME
SAL
---------- ---------SMITH
800
ADAMS
1100
JAMES
950
MILLER
1300
SUBCONSULTAS
EJE.
SELECCIONE LOS NOMBRES Y SUELDOS DE LOS EMPLEADOS QUE
TRABAJAN EN EL MISMO DEPARTAMENTO QUE EL EMPLEADO QUE
TIENE EL MENOR SUELDO.
CUAL ES MENOR SUELDO:
SELECT MIN(SAL) FROM EMP;
800
EN QUE DEPARTAMENTO TRABAJA LA PERSONA QUE TIENE EL
MENOR SUELDO
SELECT DEPTNO FROM EMP WHERE SAL=(SELECT MIN(SAL) FROM
EMP);
20
QUIENES SON LOS EMP Y QUE SUELDO TIENEN LOS EMPLEADOS
QUE TRABAJAN EN EL MISMO DEPARTAMENTO QUE EMPLEADO QUE
TIENE EL MENOR SUELDO.
SELECT ENAME,SAL FROM EMP
WHERE DEPTNO=
(SELECT DEPTNO FROM EMP WHERE SAL=
(SELECT MIN(SAL) FROM EMP));
6
SUBCONSULTA
UNA SUBCONSULTA ES MUY UTIL CUANDO
ESCRIBIMOS SENTENCIAS SQL QUE REQUIEREN
VALORES BASADOS EN VALORES CONDICIONALES
DESCONOCIDOS.
PODEMOS IMAGINAR QUE CADA CONSULTA ES UN
BLOQUE, LAS SUBCONSULTAS SON INTERIORES Y
LA CONSULTA PRINCIPAL ES LA EXTERNA O PADRE.
UNA SUBCONSULTA PUEDE DEVOLVER FILAS
UNICAS ( LAS MAS COMUNES) DENOMINADAS
SUBCONSULTAS DE COLUMNA INDIVIDUAL, EN
LAS CUALES SE UTILIZA OPERADORES DE
COMPARACION COMUNES.
LOS OPERADORES PARA SUBCONSULTAS QUE
DEVUELVEN FILAS MULTIPLES REALIZAN UNA
COMPARACION MULTIPLE.
7
OPERADORES DE COMPARACION
OPERADORES DE
COMPARACION
INDIVIDUAL
OPERADORES DE
COMPARACION
MULTIPLE
IGUAL A
>
MAYOR QUE
>=
<
MENOR QUE
<=
<>
NO IGUAL A
IN
ANY
ALL
11
SELECT ENAME,SAL,DEPTNO
FROM EMP
WHERE (DEPTNO,SAL) IN
(SELECT DEPTNO, MIN(SAL)
FROM EMP
GROUP BY DEPTNO);
12
SUBCONSULTAS CORRELACIONADAS
QUE EMPLEADOS GANAN MAS
SALARIO QUE EL SALARIO PROMEDIO
DE SU RESPECTIVO DEPARTAMENTO.
SQL> SELECT DEPTNO,ENAME,SAL
2 FROM EMP E
3 WHERE SAL>(SELECT AVG(SAL) FROM EMP WHERE E.DEPTNO=DEPTNO)
4 ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ---------- ---------10 KING
5000
20 JONES
2975
20 SCOTT
3000
20 FORD
3000
30 BLAKE
2850
13
SUBCONSULTA CORRELACIONADA
UNA SUBCONSULTA CORRELACIONADA ES UNA
SUBCONSULTA QUE SE EVALUA UNA VEZ POR CADA FILA
PROCESADA POR LA SENTENCIA PADRE.
LA CONSULTA PADRE PUEDE SER UN SELECT, UPDATE O
DELETE.
ORACLE REALIZA UN SUBCONSULTA CORRELACIONADA
CUANDO LA SUBCONSULTA REFERENCIA UNA COLUMNA DE
LA TABLA DE LA CONSULTA PADRE.
FUNCIONA DE LA SIGUIENTE MANERA:
TRAE UNA FILA CANDIDATA (TRAIDA POR LA CONSULTA
EXTERNA)
EJECUTA LA CONSULTA INTERNA USANDO EL VALOR DE FILA
CANDIDATA
USA LOS VALORES OBTENIDOS DE LA CONSULTA INTERNA PARA
CALIFICAR O DESCALIFICAR LA CANDIDATA.
REPETIR MIENTRAS EXISTAN FILAS CANDIDATAS.
14
15
SUBCONSULTA CORRELACIONADA
SQL> SELECT EMPNO,SAL,DEPTNO
2 FROM EMP EXTERNA
3 WHERE SAL>
4 (SELECT AVG(SAL) FROM EMP INTERNA
5 WHERE
6 EXTERNA.DEPTNO=INTERNA.DEPTNO);
EMPNO
SAL DEPTNO
---------- ---------- ---------7566
2975
20
7698
2850
30
7788
3000
20
7839
5000
10
7902
3000
20
COMO LA CONSULTA EXTERNA (OUTER) Y LA INTERNA (INNER) AMBAS USAN
LA TABLA EMP EN LA CLAUSULA FROM SE LE DA UN ALIAS EN CADA
SELECCION PARA MAYOR CLARIDAD.
EL ALIAS NO SOLO HACE QUE LA SELECCIN COMPLETA SEA LEIBLE Y
COMPRENSIBLE, SINO QUE SIN EL NO SE EJECUTA CORRECTAMENTE, LA
SENTENCIA INTERNA NO PODRIA DISTINGUIR LA COLUMNA DE LA TABLA
INTERNA DE LA EXTERNA.
16
EXISTS
ES UN OPERADOR LGICO (VERDADERO O FALSO). VERIFICA
SI UN VAOR ESTA O NO.
HALLAR AQUELLOS EMP A LOS QUE AL MENOS UNA PERSONA
LES REPORTA (SON JEFES DE POR LO MENOS UNA
PERSONA).
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP OUTER
WHERE EXISTS
(SELECT EMPNO FROM EMP INNER WHERE INNER.MGR=OUTER.EMPNO);
EMPNO ENAME
JOB
---------- ---------- --------- ---------7566 JONES
MANAGER
7698 BLAKE
MANAGER
7782 CLARK
MANAGER
7788 SCOTT
ANALYST
7839 KING
PRESIDENT
7902 FORD
ANALYST
DEPTNO
20
30
10
20
10
20
6 filas seleccionadas.
17
EXISTS
CUANDO NO SEA NECESARIO DEVOLVER VALORES
DE COLUMNAS Y SOLO IMPORTE QUE EXISTE UNA
FILA O MAS QUE CUMPLAN LAS CONDICIONES, SE
USA EXISTS
HALLE LOS DEPT QUE NO TIENEN EMPLEADOS:
SQL> SELECT DEPTNO, DNAME
2 FROM DEPT
3 WHERE NOT EXISTS
4 (SELECT 1 FROM EMP WHERE DEPT.DEPTNO=EMP.DEPTNO);
DEPTNO DNAME
---------- -------------40 OPERATIONS
TRANSACCIONES
19
COMMIT
PARA TERMINAR UNA TRANSACCION
Y HACER QUE LOS CAMBIOS
REALIZADOS A LA BASE DE DATOS
SEAN PERMANENTES.
NO SE REQUIEREN PRIVILEGIOS
PARA REALIZAR UN COMMIT;
20
ROLLBACK
ELIMINA TODOS LOS CAMBIOS QUE HA
RECIBIDO LA BASE DE DATO HASTA EL
ULTIMO COMMIT.
21
SAVEPOINT
SIRVE PARA IDENTIFICAR UN PUNTO
DE UNA TRANSACCION A LA QUE
POSTERIORMENTE PODEMOS
REGRESAR CON UN ROLLBACK
UPDATE emp SET sal = 2000 WHERE ename = 'BLAKE';
SAVEPOINT blake_sal;
UPDATE emp SET sal = 1500 WHERE ename = 'CLARK';
SAVEPOINT clark_sal;
SELECT ENAME,SAL FROM emp
WHERE ENAME ='BLAKE' OR ENAME = 'CLARK';
ROLLBACK TO SAVEPOINT blake_sal;
SELECT ENAME,SAL
FROM emp
WHERE ENAME ='BLAKE' OR ENAME = 'CLARK';
ROLLBACK;
22
LENGUAJE DE
PROCEDIMIENTO PARA
SQL
23
DEFINICION DE PLSQL
PL/SQL SUPLEMENTA EL LENGUAJE ESTANDAR DE BASE DE
DATOS RELACIONALES, CON AMPLIO RANGO DE
POSIBILIDADES DE PROCESAMIENTO
PL/SQL ES UN LENGUAJE PROCEDIMENTAL (PROGRAMA
DEFINIDO COMO UNA SERIE DE ORDENES QUE SE EJECUTAN
SECUENCIALMENTE, PARA PRODUCIR UN RESULTADO), QUE
SOPORTA PROGRAMAS NOMBRADOS Y PAQUETES, MUCHA
DE SU SINTAXIS FUE COPIA DEL LENGUAJE ADA Y DEL
ORACLE LAS FUNCIONES PREHECHAS ASI COMO LOS TIPOS
DE DATOS.
PERMITE LA CONSTRUCCION DE PROGRAMAS QUE
CONSISTEN EN SECUENCIAS DE SENTENCIAS SQL
COMBINADAS CON SENTENCIAS DE CONTROL.
24
25
ELSE
UPDATE EMP
SET COMM = 200 WHERE EMPNO = 7934;
END IF;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO ERRORES (CODE, MESSAGE) VALUES(99, EMPNO 21 NOT FOUND');
END;
26
27
REGISTROS DE PL/SQL
LOS REGISTROS SON VARIABLES QUE CONTIENEN UNA COLECCION
SEPARADA DE CAMPOS.
CADA CAMPO INDIVIDUALMENTE ES DIRECCIONABLE Y
REFERENCIABLE
LOS CAMPOS EN UN REGISTRO PUEDEN SER DE DIFERENTES TIPOS
DE DATOS Y TAMAOS COMO COLUMNAS EN UNA TABLA
LOS REGISTROS SON UNA MANERA CONVENIENTE DE ALMACENAR
UNA FILA DE UNA TABLA DE LA BASE DE DATOS.
USE EL ATRIBUTO %ROWTYPE PARA DECLARAR UN REGISTRO
BASADO EN UNA FILA DE UNA TABLA. LOS CAMPOS TOMAN LOS
NOMBRES Y TIPOS DE DATOS DE LAS COLUMNAS DE LA TABLA O
VISTA.
(V_ENAME VARCHAR)
IS
R_EMP EMP%ROWTYPE;
BEGIN
SELECT * INTO R_EMP FROM EMP
WHERE EMP.ENAME=V_ENAME;
DBMS_OUTPUT.PUT_LINE('R_EMP.EMPNO :'||R_EMP.EMPNO);
END;
30
PROCEDIMIENTO ANNIMO
DECLARE
V_ENAME EMP.ENAME%TYPE := 'BLAKE';
/*V_ENAME SER DEL MISMO TIPO DE DATO QUE EMP.ENAME
Y TENDRA POR VALOR INICIAL BLAKE*/
R_EMP EMP%ROWTYPE;
BEGIN
SELECT * INTO R_EMP FROM EMP
WHERE EMP.ENAME=V_ENAME;
DBMS_OUTPUT.PUT_LINE('D''ONOFRIO'||'EMP.EMPNO :'||R_EMP.EMPNO);
/*ESCRIBE EN PANTALLA, SE USA PARA PROBAR LOS RESULTADOS
DE NUESTROS PROCEDIMIENTOS*/
END;
31
32
DECLARE
start_time CHAR(8);
finish_time CHAR(8);
elapsed_time NUMBER(10);
BEGIN
/* Get system time as seconds past midnight. */
SELECT TO_CHAR(SYSDATE,'SSSSS') INTO start_time FROM sys.dual;
-- do something
/* Get system time again. */
SELECT TO_CHAR(SYSDATE,'SSSSS') INTO finish_time FROM sys.dual;
/* Compute elapsed time in seconds. */
elapsed_time := finish_time - start_time;
dbms_output.put_line(finish_time||' '||start_time||' '|| elapsed_time);
END;
33
ASIGNACIONES
SE PUEDEN ASIGNAR VALORES A UNA
VARIABLE EN CUALQUIER PARTE DEL
BLOQUE, INCLUYENDO EN LA SECCION DE
CREACION DE UNA VARIABLE.
NUM1 := NUM1 + NUM2 + (NUM3 * 3);
ANUM3 := AVG_COST * 7 + NVL(AVG_BUY_COST, 0);
SENT := 1;
STR1 := El sueldo es = '|| TO_CHAR(SAL);
CHR1 := 'ABCDEFG';
FLAG1 := TRUE;FLAG1 := FALSE;
MALE := UPPER(TITLE);
34
CURSORES IMPLICITOS
35
CURSORES EXPLICITOS
LOS SELECT QUE SE PRESENTAN EN EL PL/SQL SON
CONOCIDOS COMO INCRUSTADOS.
DEBEN RETORNAR UNA FILA
SI RETORNA MAS DE UNA FILA SE REQUIERE MANIPULAR LOS
DATOS MEDIANTE UN CURSOR.
LOS CURSORES SON CONTROLADOS POR LOS SIGUIENTES
COMANDOS:
DECLARE
OPEN
FETCH
CLOSE
%FOUND
%NOTFOUND
%ISOPEN
is
cursor c1 is
select empno,ename,job,sal from emp;
r_emp c1%rowtype;
begin
open c1;
dbms_output.put_line(c1%ROWCOUNT||' '||r_emp.empno||'>>>>>>>>');
loop
fetch c1 into r_emp;
exit when c1%notfound;
dbms_output.put_line('**'||c1%ROWCOUNT||' '||' '||r_emp.empno);
end loop;
37
close c1;
end;
38
39
DECLARE
CURSOR MYCUR IS
SELECT ISBN, COST FROM JD11.BOOK;
PARTBOOK MYCUR%ROWTYPE;
BEGIN
OPEN MYCUR;
LOOP
FETCH MYCUR INTO PARTBOOK;
EXIT WHEN MYCUR%NOTFOUND;
IF PARTBOOK.ISBN = 21 THEN PARTBOOK.COST = 19.10;
END IF;
END LOOP;
CLOSE MYCUR;
END;
40
as
cursor c1 is select empno,deptno, sal, nvl(comm,0) v_comm from emp order by deptno;
r_emp c1%rowtype;
begin
open c1;
loop
fetch c1 into r_emp;
exit when c1%notfound;
dbms_output.put_line(r_emp.empno||' '||r_emp.v_comm||' '||r_emp.deptno);
if r_emp.v_comm>0 and r_emp.deptno=10 then
begin
r_emp.v_comm:=r_emp.v_comm*1.10;
dbms_output.put_line
(r_emp.empno ||'nueva comisin '||r_emp.v_comm) ;
end;
elsif r_emp.v_comm=0 and r_emp.deptno=20 then
begin
r_emp.v_comm:=r_emp.v_comm+500;
dbms_output.put_line
(r_emp.empno ||'nueva comisin '||r_emp.v_comm) ;
end;
elsif r_emp.v_comm>0 and r_emp.deptno=30 then
begin
r_emp.v_comm:=r_emp.v_comm+650;
dbms_output.put_line
(r_emp.empno ||'nueva comisin '||r_emp.v_comm) ;
end;
end if;
end loop;
close c1;
end;
42
43
MANIPULACION DE
EXCEPCIONES
ELSE
DBMS_OUTPUT.PUT_LINE(OK)
END IF;
EXCEPTION
WHEN BAD_VALUE
THEN
DBMS_OUTPUT.PUT_LINE(EXCEPCION CAPTURADA);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(NO HAY DATOS);
END;
.
/
UPDATE TEMP SET C1=10 WHERE C2=1;
45
EXCEPCIONES PREDEFINIDAS
CURSOR_ALREADY_OPEN
INVALID_CURSOR
INVALID_NUMBER
OUT_VAL_ON_INDEX
NO_DATA_FOUND
LOGIN_DENIED
NOT_LOGGED_ON
PROGRAM_ERROR
ROWTYPE_MISMATCH
STORAGE_ERROR
TIMEOUT_ON_RESOURCE
46
DECLARE
BAD_VALUE EXCEPTION;
C1_VAL NUMBER;
BEGIN
SELECT C1 INTO C1_VAL FROM TEMP WHERE C2=1;
IF C1_VAL<0 THEN
RAISE BAD_VAL;
ELSE
DBMS_OUTPUT.PUT_LINE(OK)
END IF;
EXCEPTION
WHEN BAD_VAL
THEN
DBMS_OUTPUT.PUT_LINE(EXCEPCION CAPTURADA);
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE(SIN DATOS);
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(EXCEPCION DESCONOCIDA);
47
DECLARE
TEMP_COST JD11.BOOK.COST%TYPE;
TEMP_ISBN JD11.BOOK.ISBN%TYPE;
BEGIN
SELECT ISBN, COST INTO TEMP_ISBN, TEMP_COST FROM
JD11.BOOK WHERE ISBN > 21;
IF TEMP_COST > 0 THEN UPDATE JD11.BOOK SET COST =
(TEMP_COST*1.175) WHERE ISBN > 21;
ELSE UPDATE JD11.BOOK SET COST = 21.32 WHERE ISBN > 21;
END IF;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN INSERT INTO JD11.ERRORS (CODE,
MESSAGE) VALUES(99, NOT FOUND);
WHEN TOO_MANY_ROWS THEN INSERT INTO JD11.ERRORS (CODE,
MESSAGE) VALUES(99, TOO MANY);
WHEN OTHERS THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE)
VALUES(99, SOME ERROR OCCURRED);
END;
48
(inval NUMBER)
IS
PARNO EXCEPTION;
IMPARNO EXCEPTION;
BEGIN
IF MOD(inval, 2) = 1 THEN
RAISE IMPARNO;
ELSE
RAISE PARNO;
END IF;
EXCEPTION
WHEN PARNO THEN
RAISE_APPLICATION_ERROR(-20001, 'INGRESO NUMERO
PAR');
WHEN IMPARNO THEN
RAISE_APPLICATION_ERROR(-20999, 'INGRESO NUMERO
IMPAR');
END raise_app_error;
49
EXCEPTIONS
DECLARE
TEMP_COST NUMBER(10,2);
TEMP_ISBN NUMBER(10);
BEGIN
SELECT ISBN, COST INTO TEMP_ISBN, TEMP_COST FROM JD11.BOOK WHERE ISBN > 21;
IF TEMP_COST > 0 THEN UPDATE JD11.BOOK SET COST = (TEMP_COST*1.175) WHERE ISBN > 21;
ELSE UPDATE JD11.BOOK SET COST = 21.32 WHERE ISBN > 21;
END IF;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(99, 'NOT
FOUND');
WHEN TOO_MANY_ROWS THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(99, 'TOO
MANY');
END;
50
DECLARE
SALARY_ERROR EXCEPTION;
OUT_SALARY NUMBER;
BEGIN
SELECT SAL INTO OUT_SALARY
FROM EMP
WHERE ENAME =SCOTT;
IF OUT_SALARY>10000
THEN
RAISE SALARY_ERROR;
END IF;
EXCEPTION
WHEN SALARY_ERROR
THEN
DBMS_OUTPUT.PUT_LINE(SALARIO EXCEDE 10000);
WHEN OTHERS
THEN
NULL;
END;
51
EXCEPTIONS
DECLARE
TEMP_COST NUMBER(10,2);
TEMP_ISBN NUMBER(10);
ERR_MSG VARCHAR2(100);
ERR_CDE NUMBER;
BEGIN
SELECT ISBN, COST INTO TEMP_ISBN, TEMP_COST FROM JD11.BOOK WHERE ISBN > 21;
IF TEMP_COST > 0 THEN UPDATE JD11.BOOK SET COST = (TEMP_COST*1.175) WHERE ISBN > 21;
ELSE UPDATE JD11.BOOK SET COST = 21.32 WHERE ISBN > 21;
END IF;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(99, NOT FOUND);
WHEN TOO_MANY_ROWS THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(99, TOO MANY);
WHEN OTHERS THEN
ERR_MSG := SUBSTR(SQLERRM,1,100); /*MENSAJE DE ERROR*/
ERR_CDE := SQLCODE; /*CODIGO DE ERROR DE ORACLE*/
INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(ERR_CDE, ERR_MSG);
END;
52
EXCEPTIONS
DECLARE
TEMP_COST NUMBER(10,2);
TEMP_ISBN NUMBER(10);
THIS_IS_WRONG EXCEPTION;
BEGIN
SELECT ISBN, COST INTO TEMP_ISBN, TEMP_COST
FROM JD11.BOOK WHERE ISBN < 0;
RAISE THIS_IS_WRONG
EXCEPTION
WHEN THIS_IS_WRONG THEN INSERT INTO
JD11.ERRORS (CODE, MESSAGE) VALUES(99,
OOPS);
END;
53
57
FUNCIONES
CREAREMOS LA FUNCIN FACTORIAL, QUE CALCULA EL FACTORIAL DE
UN NUMERO ENTERO POSITIVO
CREATE OR REPLACE FUNCTION FACTORIAL
(N POSITIVE)
RETURN INTEGER --DEVUELVE N!
IS
E_ERR EXCEPTION;
BEGIN
END IF;
EXCEPTION
RETURN -1000;
RETURN -1000;
END;
SELECT FACTORIAL(3) FROM DUAL;
58
IS
A INTEGER :=21;
V_FACT INTEGER;
E_ERR EXCEPTION;
BEGIN
A:=A-CUENTA;
DBMS_OUTPUT.PUT_LINE('CONTADOR :'||
CUENTA||'ACUMULADOR :'||A||' '||V_FACT);
END LOOP;
EXCEPTION
WHEN E_ERR THEN
DBMS_OUTPUT.PUT_LINE (V_FACT||' '||'YA ESTAMOS EN
VALORES NEGATIVOS');
END;
59
USUARIOS
CREAR UN USUARIO
REM CREAR UN USUARIO (ABR 2005)
REM CREA EL USUARIO JORGE CON PASSWORD TIGER
REM OPTIONALMENTE SE PUEDE ESPECIFICA EL TABLASPACE DE DEFAULT Y LAS CANTIDADES DE MEMORIA ASIGNADA
REM DEFAULT TABLESPACE NOMBRE_TABLESPACE
REM QUOTA 10M ON NOMBRE_TABLESAPACE
REM QUOTA 5M OM TEMP_TABLESPACE
REM QUOTA 5M ON SYSTEM
REM PROFILE ENGINEER
REM
REM
REM ASIGNA LOS PRIVILEGIOS DE Y ROLES A LOS USUARIOS Y ROLES
REM PARA ASIGNAR PRIVILEGIOS A LOS OBJETOS, USE EL COMANDO GRANT (PRIVILEGIOS DE OBJETOS).
REM PARA ASIGNAR PRIVILEGIOS DEL SISTEMA DE TENER ASIGNADA LA OPTION ADMIN OPTION O DEBE
REM HABERSELE ASIGNADO EL PRIVILEGIO GRANT ANY PRIVILEGE
REM
REM RESOURCE ES UN ROL
REM QUE INCLUYE LAS SIGUIENTE PRIVILEGIOS:
REM CREATE CLUSTER : UN CLUSTER ES UN ESQUEMA DE OBJETOS QUE CONTIENEN UNA O MAS TABLAS
REM QUE TODAS TIENE UNA O MAS COLUMNAS EN COMUN. COMPARTEN LOS MISMOS VALORES EN ESTAS COLUMNAS COMUNES
REM CREATE PROCEDURE
REM CREATE SEQUENCE
REM CREATE TABLE
REM CREATE TRIGGER
REM
REM
REM
CONNECT JORGE/TIGER@ORCL
REM
REM
REM
60
62
63
64
LEVEL DESCRIPCION
RANGOPAGINAS SUBCODIGO SUBCODIGOPADRE
---------- ----------------------------------------------------------------------------- ---------------------------- --------------------1 GUA DEL USUARIO DEL LENGUAJE DE MODELAMIENTO DE DATOS
1
2 PREFACIO
XV
2
1
2 SECCION 1: INICIANDO
1
3
1
3 CAPITULO 1: POR QUE MODELAMOS
3
4
3
4
LA IMPORTANCIA DE MODELAR
4
5
4
4
PRINCIPIOS DEL MODELAMIENTO
7
6
4
4
MODELANDO ORIENTADO AL OBJETO
10
7
4
3 CAPITULO 2: INTRODUCCIN AL UML
13
8
3
4
UNA REVISION AL UML
17
9
8
4
UN MODELO CONCEPTUAL DEL UML
17
10
8
4
ARQUITECTURA
30
11
8
4
CICLO DE VIDA DE DESARROLLO DE SOFTWARE
33
12
8
2 SECCION 2 : MODELAMIENTO ESTRUCTURAL BASICO
45
13
1
3 CAPITULO 4 : CLASES
47
14
13
4
INICIANDO LAS CLASES
47
15
14
4
CONCEPTOS Y TERMINOS
49
16
14
4
TECNICAS DE MODELAMIENTO COMUN
54
17
14
3 CAPITULO 5: INTERRELACIONES
61
18
13
4
INICIADO
62
19
18
4
CONCEPTOS Y TERMINOS
63
20
18
4
TECNICAS DE MODELAMIENTO
69
21
18
21 ROWS SELECTED.
65
14 rows selected.
SQL>
66
IF A = 1 THEN
D := 1 + E;
E1 := H * 1.176;
ELSIF A = 1 THEN
E := 1 + D;
E1 := H * 1.1876;
E2 := 3;
ELSIF A = 3 THEN
B := 1.123;
ELSE B := 2.01;
END IF;
67
END LOOP;
FOR CNT IN REVERSE 18 .. 121 LOOP
A := A + (CNT * 10);
END LOOP;
69
WHILE B > 0 AND JAD11 <> Lift OR JAD11 <> Platform LOOP
FOR CNT IN REVERSE 18 .. 121 LOOP
A := A + (CNT * 10);
IF A > 12900 THEN
JAD11 = Platform;
END IF;
END LOOP;
END LOOP;
70
PROCEDIMIENTOS
CREATE OR REPLACE PROCEDURE EMP_COUNT
(NUM_DEPT_PARAM number)
IS
E_COUNT NUMBER;
V_DNAME VARCHAR2(14);
BEGIN
SELECT DNAME INTO V_DNAME FROM DEPT WHERE
DEPTNO=NUM_DEPT_PARAM;
SELECT COUNT(*) INTO E_COUNT
FROM EMP
WHERE DEPTNO=NUM_DEPT_PARAM;
IF E_COUNT > 1 THEN
dbms_output.put_line('HAY '|| e_count || ' EN '||V_DNAME);
ELSIF e_count = 1 THEN
dbms_output.put_line('HAY UN EMP EN '||V_DNAME);
ELSE
dbms_output.put_line('NO HAY EMP EN '|| V_DNAME);
END IF;
END;
71
PROCEDIMIENTOS
CREATE OR REPLACE PROCEDURE CUENTA_PRO_DEPT
V_DNAME DEPT.DNAME%TYPE;
CUENTA NUMBER;
CURSOR CUR_EMP IS
SELECT D.DNAME, COUNT(E.DEPTNO) AS NUM_EMP
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO(+) GROUP BY D.DNAME;
BEGIN
OPEN CUR_EMP;
LOOP
FETCH CUR_EMP INTO V_DNAME, CUENTA;
EXIT WHEN CUR_EMP%NOTFOUND;
IF CUENTA = 0 THEN dbms_output.put_line('NINGUN EMP PARA
|| V_DNAME);
ELSE
dbms_output.put_line(CUENTA ||
EMPLEADOS PARA ' || V_DNAME);
END IF;
END LOOP;
CLOSE CUR_EMP;
END;
72
73
SEGURIDAD
74
TRIGGERS O DISPARADORES
Un trigger es un bloque PL/SQL asociado a una tabla, que se
ejecuta cuando una determinada instruccin en SQL se va a
ejecutar sobre dicha tabla.
La sintaxis para crear un trigger es la siguiente:
CREATE [OR REPLACE] TRIGGER
{BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, . . .,
colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, . . ., colN]. . .]}
ON table
[REFERENCING OLD AS oldname, NEW as newname]
[FOR EACH ROW [WHEN (condition)]]
pl/sql_block
El uso de OR REPLACE permite sobreescribir un trigger existente.
Si se omite, y el trigger existe, se producir, un error.
El modificador FOR EACH ROW indica que el trigger se disparar
cada vez que se desee hacer operaciones sobre una fila de la tabla.
Si se acompaa del modificador WHEN, se establece una
restriccin; el trigger solo actuar, sobre las filas que satisfagan la
75
restriccin.
Disparadores en Oracle
Uso de disparadores
Evitar ejecucin de transacciones invlidas
Garantizar el cumplimiento de restricciones de
integridad y de reglas de negocio
Generar automticamente valores de columnas
derivadas
Mal uso
Para garantizar el cumplimiento de restricciones
que puedan ser definidas a nivel de esquema
CHECK
Disparadores recursivos
Gran tamao Procedimiento almacenado
76
Creacin de disparadores
CREATE TRIGGER BUpCUOTA
BEFORE UPDATE OF f_pago ON Cuota
FOR EACH ROW
WHEN (new.f_pago > old.f_venc)
BEGIN
raise_application_error(-20000, Cuota ||
TO_CHAR(:old.num_cuota) || del prestamo ||
TO_CHAR(:old.num_prest) || vencida. Por favor, dirigirse a la
gerencia.);
END;
77
Modificar disparadores
No hay modificacin explcita, se reemplaza.
1)CREATE OR REPLACE TRIGGER BUpCUOTA
2) DROP TRIGGER BUpCUOTA ; CREATE TRIGGER
BUpCUOTA
(Des)habilitar
ALTER TRIGGER BUpCUOTA ENABLE/DISABLE;
ALTER TABLE CUOTA ENABLE/DISABLE ALL
TRIGGERS;
81
FUNCIONES
Una funcin es un conjunto de
instrucciones en PL/SQL, que pueden ser
llamados usando el nombre con que se le
haya creado. Se diferencian de los
procedimientos, en que las funciones
retornan un valor al ambiente desde
donde fueron llamadas.
82
SINTAXIS
CREATE [OR REPLACE] FUNCTION
name [(param [IN] datatype) . . .]
RETURN datatype
[IS|AS] pl/sql_subprogram
83
EJEMPLOS
86
If servicios(7521)>35
Endif;
SELECT SERVICIOS(7900) FROM DUAL;
SERVICIOS(7900)
--------------88
25.1752017
89