92
1 SUBCONSULTAS

Sub Consultas Oracle 2008

Embed Size (px)

DESCRIPTION

oracle

Citation preview

SUBCONSULTAS

1SUBCONSULTAS12DEFINICION DE SUBCONSULTAUNA SUBCONSULTA ES UNA SENTENCIA SELECT INCRUSTADA EN UNA CLAUSULA DE OTRA SENTENCIA SELECT DE SQLSELECT FROM WHERE EXPRESION OPERADOR(SELECT FROM )23SUBCONSULTASUNA SUBCONSULTA SE EJECUTA PRIMERO Y SU RESULTADO ES USADO PARA COMPLETAR LA CONDICION DE LA CONSULTA PADRE.SINTAXISUNA SUBCONSULTA DEBE ESTAR ENTRE PARNTESIS.UNA SUBCONSULTA DEBE APARECER A LA DERECHA DEL OPERADOR DE COMPARACIONUNA SUBCONSULTA NO PUEDE CONTENER UN ORDER BY. SE PUEDE USAR SLO UN ORDER BY EN UNA SENTENCIA SELECT PADRE.34SUBCONSULTASELECCIONE 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.

45SUBCONSULTASSQL> 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=MAYOR QUE O IGUAL AB.SALPROMORDER BY A.ENAME;1112SUBCONSULTA DE MULTIPLES COLUMNASSELECT ENAME,SAL,DEPTNOFROM EMP WHERE (DEPTNO,SAL) IN (SELECT DEPTNO, MIN(SAL) FROM EMP GROUP BY DEPTNO);1213SUBCONSULTAS CORRELACIONADASQUE 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 1314SUBCONSULTA CORRELACIONADAUNA 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 CANDIDATAUSA LOS VALORES OBTENIDOS DE LA CONSULTA INTERNA PARA CALIFICAR O DESCALIFICAR LA CANDIDATA.REPETIR MIENTRAS EXISTAN FILAS CANDIDATAS.1415

1516SUBCONSULTA CORRELACIONADASQL> 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 20COMO 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.1617EXISTSES 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, DEPTNOFROM EMP OUTERWHERE EXISTS (SELECT EMPNO FROM EMP INNER WHERE INNER.MGR=OUTER.EMPNO);

EMPNO ENAME JOB DEPTNO---------- ---------- --------- ---------- 7566 JONES MANAGER 20 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7788 SCOTT ANALYST 20 7839 KING PRESIDENT 10 7902 FORD ANALYST 20

6 filas seleccionadas.1718EXISTSCUANDO NO SEA NECESARIO DEVOLVER VALORES DE COLUMNAS Y SOLO IMPORTE QUE EXISTE UNA FILA O MAS QUE CUMPLAN LAS CONDICIONES, SE USA EXISTSHALLE LOS DEPT QUE NO TIENEN EMPLEADOS:SQL> SELECT DEPTNO, DNAME2 FROM DEPT 3 WHERE NOT EXISTS4 (SELECT 1 FROM EMP WHERE DEPT.DEPTNO=EMP.DEPTNO); DEPTNO DNAME---------- -------------- 40 OPERATIONSPARA OBTENER ESTA FILA SE HA DEVUELTO UN UNO EN LA SUBCONSULTA AL NO ENCONTRAR NINGUNA FILA QUE TENGA NUMEROS DE DEPARTAMENTOS A LOS QUE APUNTA LA CONSULTA PADRE.

1819TRANSACCIONESEL SERVIDOR ORACLE SE ASEGURA DE MANTENER LA CONSISTENCIA DE DATOS A TRAVES DE LAS TRANSACCIONES.LAS TRANSACCIONES LE DAN MAYOR FLEXIBILIDAD Y CONTROL CUANDO SE CAMBIAN LOS DATOS Y SE ASEGURA DE MANTENER LA CONSISTENCIA DE LOS DATOS EN EL EVENTO DEL PROCESO DEL USUARIO QUE FALLE O SI FALLA EL SISTEMA.LAS TRANSACCIONES SON SENTENCIAS DEL SISTEMAS DEL LENGUAJE DE MANIPULACION DE DATOS QUE HACEN UN CAMBIO DE DATOS CONSISTENTE.UNA TRANSACCION SE INICIA CUANDO LA 1RA SENTENCIA EJECUTABLE ES ENCONTRADA Y TERMINA CUANDO OCURRE ALGUNA DE LAS SIGUIENTES ACCIONES:SE EJECUTA UNA SENTENCIA COMMIT O ROLLBACKES EJECUTADA UNA SENTENCIA DDL.SE EJECUTA UNA SENTENCIA GRANT O REVOKEEL USUARIO SALE DEL SQL +LA MAQUINA O SISTEMA FALLEDESPUES DE QUE UNA TRANSACCION TERMINE, LA SIGUIENTE SENTENCIA EJECUTABLE AUTOMATICAMENTE INICIA LA SIGUIENTE TRANSACCION.1920COMMITPARA TERMINAR UNA TRANSACCION Y HACER QUE LOS CAMBIOS REALIZADOS A LA BASE DE DATOS SEAN PERMANENTES.NO SE REQUIEREN PRIVILEGIOS PARA REALIZAR UN COMMIT;

2021ROLLBACKELIMINA TODOS LOS CAMBIOS QUE HA RECIBIDO LA BASE DE DATO HASTA EL ULTIMO COMMIT.

2122SAVEPOINTSIRVE PARA IDENTIFICAR UN PUNTO DE UNA TRANSACCION A LA QUE POSTERIORMENTE PODEMOS REGRESAR CON UN ROLLBACKUPDATE 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;2223LENGUAJE DE PROCEDIMIENTO PARA SQL2324DEFINICION DE PLSQLPL/SQL SUPLEMENTA EL LENGUAJE ESTANDAR DE BASE DE DATOS RELACIONALES, CON AMPLIO RANGO DE POSIBILIDADES DE PROCESAMIENTOPL/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.

2425CONCEPTOS BASICOS DEL PL/SQLPL/SQL ESTA ESTRUCTURADO EN BLOQUES Y PUEDE USAR SENTENCIAS CONDICIONALES, BUCLES Y SALTOS PARA CONTROLAR EL FLUJO DEL PROGRAMA.LAS VARIABLES PUEDEN SER DEFINIDAS DE TAL FORMA DE QUE SEAN VISIBLES UNICAMENTE EN EL BLOQUE DONDE SE LES DECLARE.LOS PROCEDIMIENTOS DEL PL/SQL SON DE 3 TIPOS, PROCEDIMIENTOS ANONIMOS, PROCEDIMIENTOS NOMBRADOS Y FUNCIONES NOMBRADAS.UN PROCEDIMIENTO ANONIMO ES UN PROCEDIMIENTO SIN NOMBRE Y NO PUEDE SER LLAMADO. UN PROCEDIMIENTO CON NOMBRE PUEDE SER LLAMADO, PUEDE ACEPTAR PARAMETROS PERO NO PUEDE DEVOLVER NINGUN VALOR. UNA FUNCION NOMBRADA TAMBIEN PUEDE SER LLAMADA, PUEDE ACEPTAR PARAMETROS Y CASI SIEMPRE DEVUELVE VALORES.

UN PROCEDIMIENTO TIENE LA SIGUIENTES PARTES:

DECLARE EN DONDE SE DEFINEN LAS VARIABLES O OBJETOSBEGIN SENTENCIAS SQL O CONTROL QUE CONSTRUYEN LOS BLOQUES.EXCEPTION AREA DONDE SE MANIPULAN LAS EXCEPCIONES.END; MARCADOR DE FIN DE BLOQUE.2526CONCEPTOS BASICOS DEL PL/SQLEJE :-

DECLARETEMP_COMM EMP.COMM%TYPE;

BEGINSELECT NVL(COMM,0) INTO TEMP_COMM FROM EMPWHERE EMPNO = 7934;IF TEMP_COMM > 0 THENUPDATE EMPSET COMM = (TEMP_COMM*1.175) WHERE EMPNO =7934;ELSEUPDATE EMP SET COMM = 200 WHERE EMPNO = 7934;END IF;COMMIT;EXCEPTIONWHEN NO_DATA_FOUND THEN INSERT INTO ERRORES (CODE, MESSAGE) VALUES(99, EMPNO 21 NOT FOUND');END;

2627VARIABLES Y CONSTANTES: ESTOS OBJETOS SON USADOS PARA ALMACENAR Y MANIPULAR DATOS. PUEDEN SER DEL TIPO CHAR, VARCHAR2, NUMBER, DATE O BOOLEANTODAS LAS SENTENCIAS SQL SON SOPORTADAS POR EL PL/SQL INCLUYENDO SENTENCIAS DE CONTROL DE TRANSACCIONES.REGISTROS DE TIPOS DE DATOS COMPUESTOS SOPORTAN GRUPOS DE CAMPOS.EL CONTROL DE FLUJO SE REALIZA A TRAVES DE IF Y GOTO Y ETIQUETAS.MANIPULACION DE CURSORES (AREA DE MEMORIA QUE MANTIENE UN CONJUNTO RESULTADO DE FILAS) PUEDE SER DEFINIDA Y MANIPULADA PERMITIENDO EL PROCESO DE MULTIPLES FILAS UNA A UNA.EL BLOQUE DE MANIPULACION DE EXCEPCIONES TIENE LA HABILIDAD DE CAPTURAR Y MANIPULAR CONDICIONES DE ERROR (EXCEPCIONES IMPLICITAS).ES POSIBLE GENERAR EXCEPCIONES EXPLICITAS CON LA LOGICA DEL PROGRMA Y LOS ERRORES DE DATOSBLOQUES DE CODIGO SE PUEDEN ALMACENAR COMO OBJETOS DEL ORACLE COMO PROCEDIMIENTOS, FUNCIONES, PAQUETES (PACKAGE) O TRIGGERS (DISPARADORES).2728EL CODIGO PL/SQL SIEMPRE DEBE CONSTITUIR UN BLOQUE. COMO MINIMO DEBE ESTAR DELIMITADO POR LAS PALABRAS BEGIN Y END.LAS SENTENCIAS SELECT SON SENTENCIAS SQL INCRUSTADAS EN EL PL/SQL.LAS SENTENCIAS SELECT DEBEN RETORNAR SOLO UNA FILA. SI NO DEVUELVE FILAS O DEVUELVE MAS DE UNA FILA GENERARA UN ERRORSI SE DESEA MANIPULAR UN GRUPO DE FILAS SE DEBE MANIPULAR CON UN CURSORLA CLAUSULA INTO ES MANDATORIA PARA LAS SENTENCIAS SELECT PARA ALMACENAR LOS VALORES QUE DEVUELVEN.SI SE INCLUYE UNA SECCION EXCEPTION, LAS SENTENCIAS PROGRAMADAS EN ELLA SOLO SON PROCESADAS SI LA CONDICION A LA QUE SE REFIEREN OCURRE.LA EJECUCION DE UN BLOQUE SE TERMINA DESPUES DE QUE SE EJECUTA LA RUTINA DE EXCEPTION SE EJECUTA.LOS BLOQUES DEL PL/SQL PUEDEN ANIDARSE, EL ANIDAMIENTO PUEDE SER UBICADO EN CUALQUIER PARTE DEL BLOQUE, INCLUIDA LA SECCION EXCEPTION.2829DECLARANDO VARIABLES Y CONTANTESDECLAREV_NUM1 NUMBER NOT NULL := 10109;NUM8 NUMBER(3,1);XYZ NUMBER(2,2) := 31.8;ABC12 NUMBER(9,2) := XYZ * 131;V_CHR1 CHAR(89);V_CHR2 VARCHAR2(12) := "JANUARY";TODAY DATE := SYSDATE;TRUEFALSE BOOLEAN;

DECLAREPI CONSTANT NUMBER(9,3) := 3.142;VAT CONSTANT NUMBER(4,2) := 17.5;

DECLAREV_NUM1 JD11.BOOK.COST%TYPE;2930REGISTROS DE PL/SQLLOS REGISTROS SON VARIABLES QUE CONTIENEN UNA COLECCION SEPARADA DE CAMPOS.CADA CAMPO INDIVIDUALMENTE ES DIRECCIONABLE Y REFERENCIABLELOS CAMPOS EN UN REGISTRO PUEDEN SER DE DIFERENTES TIPOS DE DATOS Y TAMAOS COMO COLUMNAS EN UNA TABLALOS 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)ISR_EMP EMP%ROWTYPE;BEGINSELECT * INTO R_EMP FROM EMPWHERE EMP.ENAME=V_ENAME;DBMS_OUTPUT.PUT_LINE('R_EMP.EMPNO :'||R_EMP.EMPNO);END;30PROCEDIMIENTO ANNIMOSET SERVEROUTPUT ON; --ACTIVA LA VARIABLE DE ENTORNO SERVEROUTPUT

DECLAREV_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;BEGINSELECT * INTO R_EMP FROM EMPWHERE 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;31SET SERVEROUTPUT ON;DECLAREV_ENAME EMP.ENAME%TYPE := 'BLAKE';R_EMP EMP%ROWTYPE;BEGINSELECT * INTO R_EMP FROM EMPWHERE EMP.ENAME=V_ENAME;DBMS_OUTPUT.PUT_LINE('R_EMP.EMPNO :'||R_EMP.EMPNO);END;32DECLARE 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;3334ASIGNACIONESSE 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);3435CURSORES IMPLICITOSCUANDO SE EJECUTA UNA SENTENCIA SQL EL SERVIDOR DE BASE DE DATOS ABRE UN AREA DE MEMORIA EN DONDE EL COMANDO ES COMPILADO Y EJECUTADO. ESTA AREA SE LE DENOMINA CURSORPL/SQL PROVEE ALGUNOS ATRIBUTOS QUE PERMITE EVALUAR QUE SUCEDE CUANDO UN CURSOR IMPLICITO SE TERMINA DE USAR.

3536CURSORES EXPLICITOSLOS SELECT QUE SE PRESENTAN EN EL PL/SQL SON CONOCIDOS COMO INCRUSTADOS.DEBEN RETORNAR UNA FILASI RETORNA MAS DE UNA FILA SE REQUIERE MANIPULAR LOS DATOS MEDIANTE UN CURSOR.LOS CURSORES SON CONTROLADOS POR LOS SIGUIENTES COMANDOS:

DECLARE DEFINE EL NOMBRE Y ESTRUCTURA DEL CURSOR JUNTO CON LA SENTENCIA SELECT QUE PUEBLE EL CURSOR CON DATOS. LA CONSULTA ES VALIDADA PERO NO EJECUTADA.OPEN EJECUTA LA CONSULTA QUE PUEBLA EL CURSOR CON FILAS.FETCH CARGA LA FILA DIRECCIONADA POR EL PUNTERO DEL CURSOR EN LAS VARIABLES Y MUEVE EL PUNTERO DEL CURSOR A LA SIGUIENTE FILA.CLOSE LIBERA LOS DATOS DEL CUROSR Y LOS CIERRA. EL CURSOR PUEDE SER REABIERTO PARA REFRESCAR SUS DATOS.3637ATRIBUTOS DE LOS CURSORES%ROWCOUNTNUMERO DE FILAS PROCESADAS POR LA SENTENCIA SQL.%FOUNDTRUE SI POR LO MENOS UNA FILA FUE PROCESADA.%NOTFOUNDTRUE SI NINGUNA FILA FUE PROCESADA%ISOPENTRUE SI EL CURSOR ESTA ABIERTO.FALSE SI EL CUROSR NO HA SIDO ABIERTO O SE HA CERRADO.SOLO PARA CURSORES EXPLICITOS. iscursor c1 isselect 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; close c1;end;3738SQL> set serveroutput onSQL> exec cursor01;0 >>>>>>>>**1 7369**2 7499**3 7521**4 7566**5 7654**6 7698**7 7782**8 7788**9 7839**10 7844**11 7876**12 7900**13 7902**14 7934

Procedimiento PL/SQL terminado correctamente.39EJE. CURSORES EXPLICITOSDECLARECURSOR MYCUR IS SELECT ISBN, COST FROM JD11.BOOK;THISISBN NUMBER(10);THISCOST NUMBER(10,2);BEGINOPEN MYCUR;LOOPFETCH MYCUR INTO THISISBN, THISCOST;EXIT WHEN MYCUR%NOTFOUND;END LOOP;CLOSE MYCUR;END;3940EJE. CURSORES EXPLICITOSDECLARECURSOR MYCUR IS SELECT ISBN, COST FROM JD11.BOOK;PARTBOOK MYCUR%ROWTYPE;BEGINOPEN MYCUR;LOOPFETCH MYCUR INTO PARTBOOK;EXIT WHEN MYCUR%NOTFOUND;IF PARTBOOK.ISBN = 21 THEN PARTBOOK.COST = 19.10;END IF;END LOOP;CLOSE MYCUR;END;4041EJE. CURSORES EXPLICITOSDECLARECURSOR MYCUR IS SELECT ISBN, COST FROM JD11.BOOK;PARTBOOK MYCUR%ROWTYPE;BEGINOPEN MYCUR;LOOPFETCH MYCUR INTO PARTBOOK;EXIT WHEN MYCUR%NOTFOUND;IF PARTBOOK.ISBN = 21 THENDELETE FROM JD11.BOOKWHERE CURRENT OF MYCUR;END IF;END LOOP;CLOSE MYCUR;END;4142as 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 thenbegin 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 thenbegin 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;43 (NUMIN NUMBER,DENOMINADOR NUMBER)ISX NUMBER;BEGIN X := NUMIN / DENOMINADOR; DBMS_OUTPUT.PUT_LINE('DIVISION :'||X); EXCEPTION WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('DIVISION POR 0'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('ALGUN OTRO PROBLEMA');END DBZ_EXCEPTION;44MANIPULACION DE EXCEPCIONESSQL PERMITE DETECTAR Y PROCESAR CONDICIONES DE ERROR PREDEFINIDOS O DEFINIDOS POR EL USUARIO. DENOMINADO EXCEPCIONES.CUANDO OCURRE UN ERROR UNA EXCEPCIN SE LEVANTA, LA EJECUCIN NORMAL SE DETIENE Y TRANSFIERE EL CONTROL A LA PARTE DE MANIPULACIN DEL ERROR DEL BLOQUE DE PL/SQL.LAS EXCEPCIONES PREDEFINIDAS SON LEVANTADAS IMPLCITAMENTE, LAS EXCEPCIONES DEFINIDAS POR EL USUARIO DEBEN SER EXPLCITAMENTE LEVANTADAS EXPLCITAMENTE CON UN SENTENCIA RAISED.SI SU CODIGO NO MANEJA UNA EXCEPCIN, EL PROGRAMA TERMINAR NORMALMENTE EN EL FIN DEL CDIGO PL/SQL Y EL CONTROL SE PASARA EL CONTROL AL SISTEMA OPERATIVO.SI SE CREAN EXCEPCIONES PROPIAS SE EMPLEA LA SENTENCIA RAISE_APLICATION_ERROR . PERMITE QUE LOS USUARIOS PREDEFINAN SUSMENSAJES DE ERROR. LOS RANGOS DE ERRORES SE NUMERAN DE -20000 A -20999.

4445CREATE TABLE TEMP (C1 NUMBER,C2 NUMBER,C3 CHAR(3));

INSERT INTO TEMP VALUES(-1,1,ABC);DECLAREBAD_VALUE EXCEPTION;C1_VAL NUMBER;BEGINSELECT C1 INTO C1_VAL FROM TEMP WHERE C2=1;IF C1_VAL 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;EXCEPTIONWHEN 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;4849 (inval NUMBER)ISPARNO 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;50EXCEPTIONSLAS EXCEPCIONE SON IDENTIFICADORES QUE SE LEVANTAN DURANTE LA EJECUCION DE UN BLOQUE PARA TERMINAR SU ACCION.HAY DOS CLASES DE EXCEPCIONES:PREDEFINIDAS: ORACLE PREDEFINE ERRORES QUE SON ASOCIADAS CON CODIGOS DE ERROR ESPECIFICOS.DEFINIDOS POR EL USUARIO: DECLARADAS POR EL USUARIO. SE PUEDE ASOCIAR CON CODIGO DE ERROR.LAS EXCEPCIONES SE PROPAGAN EN LOS BLOQUES ANIDADOS HASTA QUE UNA DE ELLAS SEA MANIPULADA.

DECLARETEMP_COST NUMBER(10,2);TEMP_ISBN NUMBER(10);BEGINSELECT 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;EXCEPTIONWHEN 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;5051DECLARESALARY_ERROR EXCEPTION;OUT_SALARY NUMBER;BEGINSELECT SAL INTO OUT_SALARYFROM EMPWHERE ENAME =SCOTT;IF OUT_SALARY>10000THENRAISE SALARY_ERROR;END IF;EXCEPTIONWHEN SALARY_ERRORTHENDBMS_OUTPUT.PUT_LINE(SALARIO EXCEDE 10000);WHEN OTHERSTHENNULL;END;

5152EXCEPTIONSDECLARETEMP_COST NUMBER(10,2);TEMP_ISBN NUMBER(10);ERR_MSG VARCHAR2(100);ERR_CDE NUMBER;BEGINSELECT 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;EXCEPTIONWHEN 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 THENERR_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;5253EXCEPTIONSDECLARETEMP_COST NUMBER(10,2);TEMP_ISBN NUMBER(10);THIS_IS_WRONG EXCEPTION;BEGINSELECT ISBN, COST INTO TEMP_ISBN, TEMP_COST FROM JD11.BOOK WHERE ISBN < 0;RAISE THIS_IS_WRONGEXCEPTIONWHEN THIS_IS_WRONG THEN INSERT INTO JD11.ERRORS (CODE, MESSAGE) VALUES(99, OOPS);END;5354CREATE TABLE ERRORS (CODE NUMBER, MESSAGE VARCHAR2(100));TABLE CREATED.

CREATE OR REPLACE procedure EXECPTION_ERRORS(P_EMPNO NUMBER, P_SUELDO_MIN NUMBER)ISSAL_ERROR EXCEPTION;ERR_MSG VARCHAR(100);ERR_CODE NUMBER;V_SAL EMP.SAL%TYPE;V_COMM EMP.COMM%TYPE;BEGIN SELECT SAL, COMM INTO V_SAL, V_COMM FROM EMP WHERE EMPNO=P_EMPNO; IF V_SAL EXEC EXECPTION_ERRORS(7900,900);PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.SQL> SELECT * FROM ERRORS;NO ROWS SELECTEDSQL> EXEC EXECPTION_ERRORS(7369,900);PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.SQL> SELECT * FROM ERRORS;CODE MESSAGE---------- -------------------------------------------------------------------------------- -199 HAY QUE SUBIR ESTE SALARIOSQL> EXEC EXECPTION_ERRORS(90,900);PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.SQL> SELECT * FROM ERRORS;CODE MESSAGE---------- -------------------------------------------------------------------------------- -199 HAY QUE SUBIR ESTE SALARIO 100 ORA-01403: NO DATA FOUND5556 (p_empno number, p_sueldo_min number)issal_error exception;err_msg varchar(100);err_code number;v_sal emp.sal%type;v_comm emp.comm%type;begin select sal, comm into v_sal, v_comm from emp where empno=p_empno; if v_sal SELECT TEXT FROM USER_SOURCE WHERE NAME='EXECPTION_ERRORS';PROCEDURE "EXECPTION_ERRORS" (P_EMPNO NUMBER, P_SUELDO_MIN NUMBER)ISSAL_ERROR EXCEPTION;ERR_MSG VARCHAR(100);ERR_CODE NUMBER;V_SAL EMP.SAL%TYPE;V_COMM EMP.COMM%TYPE;BEGIN SELECT SAL, COMM INTO V_SAL, V_COMM FROM EMP WHERE EMPNO=P_EMPNO; IF V_SAL 6667ESTRUCTURAS DE CONTROL DE PROCESOSIF PROVEE CONTROL SELECTIVO DE LAS ACCIONES BASADAS EN LA VERIFICACIONDE UNA CONDICIONIF A = 1 THEND := 1 + E;E1 := H * 1.176;ELSIF A = 1 THENE := 1 + D;E1 := H * 1.1876;E2 := 3;ELSIF A = 3 THENB := 1.123;ELSE B := 2.01;END IF;6768ESTRUCTURAS DE CONTROL DE PROCESOSLoop PROVEE REPETICIONES DE LAS SENTENCIAS DEL GRUPO SIN UNA CONDICION.EXIT PROVEE UNA RUPTURA DEL LOOPLOOPI := I + 1;IF I = 10 THENEXIT;END IF;END LOOP;LOOPI := I + 1;EXIT WHEN I = 10;END LOOP;6869ESTRUCTURAS DE CONTROL DE PROCESOSBUCLES FOR PROVEE LA EJECUCION DE ITERACIONES BASADO EN UNA CUENTA. FOR CNT IN 12 .. 150 LOOPA := A + (CNT * 10);EXIT WHEN A > 12900;END LOOP;FOR CNT IN REVERSE 18 .. 121 LOOPA := A + (CNT * 10);END LOOP;6970ESTRUCTURAS DE CONTROL DE PROCESOSBUCLE WHILE PROVEE EJECUCIONDE SENTENCIAS ITERATIVA BASADA EN UNA CONDICION

WHILE B > 0 AND JAD11 Lift OR JAD11 Platform LOOPFOR CNT IN REVERSE 18 .. 121 LOOPA := A + (CNT * 10);IF A > 12900 THENJAD11 = Platform;END IF;END LOOP;END LOOP;7071PROCEDIMIENTOSCREATE OR REPLACE PROCEDURE EMP_COUNT (NUM_DEPT_PARAM number)ISE_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;7172PROCEDIMIENTOSCREATE OR REPLACE PROCEDURE CUENTA_PRO_DEPTV_DNAME DEPT.DNAME%TYPE;CUENTA NUMBER;CURSOR CUR_EMP ISSELECT D.DNAME, COUNT(E.DEPTNO) AS NUM_EMPFROM DEPT D, EMP EWHERE D.DEPTNO = E.DEPTNO(+) GROUP BY D.DNAME;BEGINOPEN CUR_EMP;LOOPFETCH 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;727374SEGURIDAD

7475TRIGGERS O DISPARADORESUn 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 restriccin. 76Disparadores en OracleUso de disparadoresEvitar ejecucin de transacciones invlidasGarantizar el cumplimiento de restricciones de integridad y de reglas de negocioGenerar automticamente valores de columnas derivadasMal usoPara garantizar el cumplimiento de restricciones que puedan ser definidas a nivel de esquema CHECKDisparadores recursivosGran tamao Procedimiento almacenado77Creacin de disparadoresCREATE TRIGGER BUpCUOTABEFORE UPDATE OF f_pago ON CuotaFOR EACH ROWWHEN (new.f_pago > old.f_venc)BEGINraise_application_error(-20000, Cuota || TO_CHAR(:old.num_cuota) || del prestamo || TO_CHAR(:old.num_prest) || vencida. Por favor, dirigirse a la gerencia.);END;78CREATE TRIGGER salary_checkBEFOREINSERT OR UPDATE OF sal, jobON empFOR EACH ROWWHEN (new.job 'PRESIDENT')DECLAREminsal NUMBERmaxsal NUMBERBEGIN /* Se obtienen los valores minimo y maximo para el salario de */ /* un cargo determinado, usando la tabla sal_guide */SELECT minsal, maxsal INTO minsal, maxsalFROM sal_guideWHERE job = :new.job /* Si el salario del empleado a insertar/modificar esta por */ /* debajo del minimo, o por encima del maximo, se genera */ /* un error. */IF (:new.sal < minsal OR :new.sal > maxsal)THEN raise_application_error(-20601, 'Salary '||:new.sal|| ' out of range for job '||:new.job||' for employee '||:new.ename);END IF;END; 79Este trigger impide que se agregue o modifique un empleado con el sueldo mayor o menor que los valores mximo y mnimo respectivamente para su cargo. Se agrega la restriccin de que el trigger no se dispararn si el cargo es PRESIDENTE. Si se desea eliminar (borrar) un trigger, se usa la instruccin: SQL> DROP TRIGGER name;80Sobre la creacin de disparadoresLos nombres de los triggers deben ser nicos dentro de un esquema dado. Alguna de las dos, BEFORE o AFTER, debe ser utilizada en el CREATE TRIGGER. La sentencia activadora especifica el tipo de operacin que despierta el disparador (DELETE, INSERT o UPDATE). En la sentencia activadora se especifica la tabla asociada al trigger. Puede especificarse exactamente una tabla (no una vista) en la sentencia activadora.Si la sentencia activadora especifica un UPDATE se puede incluir una lista de columnas en dicha sentencia. Si se incluye la lista de columnas, el trigger se activa por un UPDATE slo si una de las columnas especificadas es actualizada. Si se omite la lista, el trigger se activa cuando cualquier columna de la tabla se actualiza. No se puede especificar lista de columnas para INSERT o DELETE.La presencia o ausencia de la opcin FOR EACH ROW determina si el disparador es a nivel de filas (row trigger) o a nivel de sentencia activadora (statement trigger). Especifica que el cuerpo del trigger se ejecuta individualmente para cada una de las filas de la tabla que haya sido afectada por la sentencia activadora. Opcionalmente, se pueden incluir restricciones en la definicin de un row trigger. Para ello se especifica, en una clusula WHEN, una expresin booleana de SQL. Si se incluye una clusula WHEN, la expresin se evala para cada una de las filas que el disparador afecta. Si el resultado de la evaluacin es TRUE, se ejecuta el cuerpo del trigger sobre la fila que hizo cierta la expresin. La expresin en una clusula WHEN no puede incluir subqueries.81Modificar disparadoresNo hay modificacin explcita, se reemplaza.1)CREATE OR REPLACE TRIGGER BUpCUOTA2) DROP TRIGGER BUpCUOTA ; CREATE TRIGGER BUpCUOTA

(Des)habilitarALTER TRIGGER BUpCUOTA ENABLE/DISABLE;ALTER TABLE CUOTA ENABLE/DISABLE ALL TRIGGERS;82FUNCIONESUna 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. 83SINTAXISCREATE [OR REPLACE] FUNCTION name [(param [IN] datatype) . . .]RETURN datatype [IS|AS] pl/sql_subprogram84El uso de OR REPLACE permite sobreescribir una funcin existente. Si se omite, y la funcin ya existe, se producir, un error. El nico modificador permitido para los parmetros es IN, y si se omite, se tomar por defecto. Es decir, solo se permiten parmetros de entrada. Si se desea eliminar (borrar) una funcin, se usa la instruccin: SQL> DROP FUNCTION calcula_impuesto;85EJEMPLOSCreate or replace function calcula_impuesto(monto in number) return numberismonto_imp number;begin select monto*tax_index into monto_imp from tax; return monto_imp;exception when no_data_found then return null;end;86CREATE OR REPLACE FUNCTION "ENTERO_A_TEXTO" (A INTEGER) RETURN VARCHARISERR EXCEPTION;BEGIN IF A9 THEN RAISE ERR; END IF; IF A=0 THEN RETURN 'CERO'; END IF; IF A=1 THEN RETURN 'UNO'; END IF; IF A=2 THEN RETURN 'DOS'; END IF; IF A=3 THEN RETURN 'TRES'; END IF; IF A=4 THEN RETURN 'CUATRO'; END IF; IF A=5 THEN RETURN 'CINCO'; END IF; IF A=6 THEN RETURN 'SEIS'; END IF; IF A=7 THEN RETURN 'SIETE'; END IF; IF A=8 THEN RETURN 'OCHO'; END IF; IF A=9 THEN RETURN 'NUEVE'; END IF;EXCEPTIONWHEN ERR THEN RETURN 'NO VALIDO';END;87CREATE OR REPLACE FUNCTION "FACTORIAL" (n positive) return integer--devuelve n!isE_ERR EXCEPTION;begin IF N35 Endif;SELECT SERVICIOS(7900) FROM DUAL;SERVICIOS(7900)--------------- 25.175201789create or replace function vol_cono (r number, h number)return numberise_err exception; begin if r=0 and h=0 then return 0; else return ((3.1416*r*r*h)/3);end if;end;SQL> select vol_cono(2,1) from dual;VOL_CONO(2,1)------------- 4.1888

CREATE OR REPLACE FUNCTION EXISTEPAIS (P_COUNTRY_ID COUNTRIES.COUNTRY_ID%TYPE)RETURN NUMBER ASV_EXISTE_PAIS NUMBER(1):=0;BEGIN SELECT 1 INTO V_EXISTE_PAIS FROM COUNTRIES WHERE COUNTRIES.COUNTRY_ID=UPPER(P_COUNTRY_ID); RETURN V_EXISTE_PAIS; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN V_EXISTE_PAIS;END EXISTEPAIS;9091CREATE OR REPLACE PROCEDURE "EMP_AUMENTOS" (NUM_DEPT number, tope number)--realiza aumentos a lo empleados de un dept identificado por num_dept--que tengan un salario tope igual a tope--si sus comisiones no son nulas aumentara el salario la comision--de otra manera el aumento sera del 10%IS

cursor c1 is select * from emp where deptno=num_dept and sal0 then rowemp.sal:=rowemp.sal+rowemp.comm; dbms_output.put_line('1. '||rowemp.ename||' recibio '|| rowemp.comm || ' de aumento.'); else rowemp.sal:=rowemp.sal+rowemp.sal*.1; dbms_output.put_line('2. '||rowemp.ename||' recibio '|| (rowemp.sal*.1) || ' de aumento'); end if; end loop;END;

92CREATE OR REPLACE PROCEDURE "EXECPTION_ERRORS" (p_empno number, p_sueldo_min number)issal_error exception;err_msg varchar(100);err_code number;v_sal emp.sal%type;v_comm emp.comm%type;begin select sal, comm into v_sal, v_comm from emp where empno=p_empno; if v_sal