REM , Crec un bloque PL,SQL que inserte un nueto depcrtcmento en lc tcblc DEPT.
REM , c) Usc el nmero de depcrtcmento recoido del ejercicio : sumcle :o
REM , c ese nmero como entrcdc de nmero de depcrtcmento pcrc el nueto.
REM , b) Usc un pcrcmetro pcrc el nombre de depcrtcmento.
REM , c) Dejc lc locclizccin como nulc por chorc.
REM , d) Ejecutc el bloque PL,SQL.
SET verify OFF
VAR g_dept_name VARCHAR2;
ACCEPT g_dept_name PROMPT 'Nombre de departamento:'
DELCLARE
g_deptno dept.deptno%TYPE;
BEGIN
SELECT MAX(deptno)
INTO g_deptno
FROM dept;
INSERT INTO dept(deptno, dname)
VALUES (g_deptno+10, UPPER('&g_dept_name'));
END;
/
SET verify ON
REM , e) Muestrc el nueto depcrtcmento que hcs crecdo.
SELECT *
FROM dept
WHERE deptno=50;
-------------------------------------------------------------------------------
REM ; p1Sgoj.sgl
REM , Crec un bloque PL,SQL que cctuclice lc locclizccin de un depcrtcmento
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
48
REM , existente.
REM , c) Usc un pcrcmetro pcrc el nmero de depcrtcmento.
REM , b) Usc un pcrcmetro pcrc lc locclizccin de depcrtcmento.
REM , c) Pruebc el bloque PL,SQL.
REM , d) Muestrc el nmero de depcrtcmento, nombre locclizccin pcrc
REM , el depcrtcmento cctuclizcdo.
REM , e) Muestrc el depcrtcmento que hcs cctuclizcdo.
SET verify OFF
VAR g_deptno NUMBER;
VAR g_dept_loc VARCHAR2;
ACCEPT g_deptno PROMPT 'Nmero de departamento:'
ACCEPT g_dept_loc PROMPT 'Localizacin del departamento:'
BEGIN
UPDATE dept
SET loc='&g_dept_loc'
WHERE deptno=&g_deptno;
END;
/
SELECT deptno, dname, loc
FROM dept
WHERE deptno=&g_deptno;
SET verify ON
-------------------------------------------------------------------------------
REM ; p1Sgoq.sgl
REM , Crec un bloque PL,SQL que borre el depcrtcmento crecdo en el ejercicio z.
REM , c) Usc un pcrcmetro pcrc el nmero de depcrtcmento.
REM , b) Imprime en pcntcllc el nmero de columncs cjectcdcs.
REM , c) Pruebc el bloque PL,SQL.
SET verify OFF
VAR g_deptno NUMBER;
VAR g_result VARCHAR2(30);
ACCEPT g_deptno PROMPT 'Nmero de departamento:'
DECLARE
BEGIN
DELETE FROM dept
WHERE deptno=&g_deptno;
:g_result := TO_CHAR(SQL%ROWCOUNT) || ' filas borradas';
END;
/
print g_result
SET verify ON
REM ; Nmero de departamento:50
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; G_RESULT
REM ; ----------------------------------------
REM ; 1 filas borradas
REM , d) Que ocurre cucndo introduces un nmer de depcrtcmento que no existe?
REM ; Nmero de departamento:99
REM ;
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
49
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; G_RESULT
REM ; -----------------------------------------
REM ; 0 filas borradas
REM , e) Conjirmc que el depcrtcmento hc sido borrcdo.
SELECT *
FROM dept
WHERE deptno=&g_deptno
;
REM ; no rows selected
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
50
PRACTICA 1q
REM ; p1pgo1.sgl
REM , Ejecutc el script \LAS\lcb:p_:.sql pcrc crecr (YA ESTA CREADA) lc tcblc
REM , MESSAGES. Escribe un bloque PL,SQL pcrc insertcr nmeros en lc tcblc
REM , MESSAGES.
REM , c) Insertc los nmeros del : cl :o excluendo el el 8.
REM , b) CDMMIT despues del jin de bloque.
DECLARE
numero messages.results%TYPE := 0;
BEGIN
LOOP
numero := numero + 1;
EXIT WHEN numero = 6;
INSERT INTO messages(results)
VALUES (numero);
END LOOP;
INSERT INTO messages(results)
VALUES (7);
numero := 8;
LOOP
numero := numero + 1;
EXIT WHEN numero = 11;
INSERT INTO messages(results)
VALUES (numero);
END LOOP;
END;
/
COMMIT
REM , c) Seleccionc de lc tcbc MESSAGES pcrc terijiccr que tu bloque
REM , bloque PL,SQL juncion.
SELECT * FROM MESSAGES;
REM ; RESULTS
REM ; ------------------
REM ; 1
REM ; 2
REM ; 3
REM ; 4
REM ; 5
REM ; 7
REM ; 9
REM ; 10
REM ;
REM ; 8 rows selected.
-------------------------------------------------------------------------------
REM ; p1pgoz.sgl
REM , Crec un bloque PL,SQL que cclcule el porcentcje de lc comisin pcrc
REM , un emplecdo dcdo bcscdo en el sclcrio del emplecdo.
REM , c) Ejecutc el script LAS\lcb:p_z.sql pcrc insertcr un nueto emplecdo
REM , en lc tcblc EMP. Notc: el emplecdo tendrc un sclcrio NULD.
REM , YA ESTA CREADD ESTE USUARID, ND E1ECUTAR EL SCRIPT.
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
51
REM , b) Aceptc el nmero de emplecdo como unc entrcdc de usucrio con unc
REM , sustitucin de tcricble SQLPlus.
REM , c) Si el sclcrio del emplecdo es menor de $:.ooo, pon el porcentcje
REM , de comisin pcrc el emplecdo c un :o del sclcrio.
REM , d) Si el sclcrio del emplecdo estc entre $:.ooo $:.oo, pon el
REM , porcentcje de comisin pcrc el emplecdo c un : del sclcrio.
REM , e) Si el sclcrio del emplecdo excede $:.oo, pon el porcentcje de
REM , comisin pcrc el emplecdo c un zo del sclcrio.
REM , j) Si el sclcrio del emplecdo es NULL, pon el porcentcje de
REM , comisin c o.
REM , ) CDMMIT
REM , h) Pruebc el bloque PL,SQL pcrc ccdc ccso uscndo los siuientes
REM , ccsos de pruebc, compruebc ccdc cctuclizccin de comisin.
SET verify OFF
VAR g_codigo NUMBER;
ACCEPT g_codigo PROMPT 'Nmero de Empleado:'
DECLARE
v_comision emp.comm%TYPE;
v_salario emp.sal%TYPE;
v_codigo NUMBER := &g_codigo;
BEGIN
SELECT sal
INTO v_salario
FROM emp
WHERE empno = v_codigo;
IF v_salario < 1000 THEN
v_comision := v_salario * 0.10;
ELSIF v_salario < 1500 AND v_salario > 1000 THEN
v_comision := v_salario * 0.15;
ELSIF v_salario > 1500 THEN
v_comision := v_salario * 0.20;
ELSE
v_comision := 0;
END IF;
UPDATE emp
SET comm = v_comision
WHERE empno = v_codigo;
COMMIT;
END;
/
SET verify ON
SELECT empno, ename, sal, comm
FROM emp
WHERE comm IS NOT NULL;
REM ; Nmero de Empleado:8000
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; EMPNO ENAME SAL COMM
REM ; --------- ---------- --------- ---------
REM ; 7654 MARTIN 1250 1400
REM ; 7499 ALLEN 1600 320
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
52
REM ; 7844 TURNER 1500 0
REM ; 7521 WARD 1250 500
REM ; 7369 SMITH 800 80
REM ; 7934 MILLER 1300 195
REM ; 8000 DOE 0
REM ;
REM ; 7 rows selected.
-------------------------------------------------------------------------------
REM ; p1pgoj.sgl
REM , Modijicc p:qo(.sql pcrc insertcr el texto "Number is odd" or "Number
REM , is eten", dependiendo de si el tclor es pcr o impcr. En lc tcblc
REM , MESSAGES. Consultc lc tcblc MESSAGES pcrc determincr si tu bloque
REM , PL,SQL juncion.
VAR g_char VARCHAR2(16);
VAR g_num NUMBER;
DECLARE
v_char VARCHAR2(16);
v_num NUMBER(2);
BEGIN
v_char := '42 is the answer';
v_num := TO_NUMBER(SUBSTR(v_char,1,2));
IF MOD(v_num,2) = 0 THEN
v_char := 'Number is odd';
ELSE
v_char := 'Number is even';
END IF;
INSERT INTO messages(results)
VALUES (v_char);
END;
/
SELECT * FROM MESSAGES;
REM ; RESULTS
REM ; ----------------
REM ; 1
REM ; 2
REM ; 3
REM ; 4
REM ; 5
REM ; 7
REM ; 9
REM ; 10
REM ; Number is odd
REM ;
REM ; 9 rows selected.
-------------------------------------------------------------------------------
REM ; p1pgoq.sgl
REM , Acde unc nuetc columnc c lc tcblc EMP pcrc clmccencr csterscos().
ALTER TABLE emp
ADD (stars VARCHAR2(100));
DESC emp;
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
53
REM ; Name Null? Type
REM ; ------------------------------- -------- ----
REM ; EMPNO NOT NULL NUMBER(4)
REM ; ENAME VARCHAR2(10)
REM ; JOB VARCHAR2(9)
REM ; MGR NUMBER(4)
REM ; HIREDATE DATE
REM ; SAL NUMBER(7,2)
REM ; COMM NUMBER(7,2)
REM ; DEPTNO NOT NULL NUMBER(2)
REM ; STARS VARCHAR2(100)
-------------------------------------------------------------------------------
REM ; p1pgog.sgl
REM , Crec un bloque PL,SQL que recompense cun emplecdo ccdiendo un
REM , csterisco in lc columnc STARS por ccdc $:oo del sclcrio del
REM , emplecdo. Redondec el sclcrio del emplecdo cl nmero entero
REM , mcs cerccno. Grcbc tu bloque c un jichero llcmcdo p:pqo.sql.
REM , c) Aceptc el ID del emplecdo como unc entrcdc con unc tcricble
REM , de sustitucin de SQLPlus.
REM , b) Iniciclizc unc tcricble conteniendo unc ccdenc de csteriscos.
REM , c) Acde un csterisco c lc ccdenc por ccdc $:oo del sclcrio. Por
REM , ejemplo, si el emplecdo tiene un sclcrio de $8oo, lc ccdenc
REM , deberc contener ocho csteriscos.
REM , d) Actuclizc lc columnc STARS pcr el emplecdo con su ccdenc
REM , de csteriscos.
REM , e) CDMMIT.
REM , j) Pruebc el bloque pcrc un emplecdo que no tenc sclcrio
REM , otro que si tenc.
SET verify OFF
VAR g_id NUMBER;
ACCEPT g_id PROMPT 'Nmero de empleado:'
DECLARE
v_cadena emp.stars%TYPE;
v_salario emp.sal%TYPE;
v_id emp.empno%TYPE := &g_id;
BEGIN
SELECT NVL(sal,0)
INTO v_salario
FROM emp
WHERE empno = v_id;
IF SQL%FOUND = TRUE THEN
FOR i IN 1..ROUND(v_salario/100) LOOP
v_cadena := v_cadena || '*';
END LOOP;
UPDATE emp
SET stars = v_cadena
WHERE empno = v_id;
END IF;
COMMIT;
END;
/
SET verify ON
REM , Ejecuto el script probcndo con el emplecdo ;p, ;8; el 8ooo
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
54
REM , el resultcdo es:
SELECT empno, ename, sal, stars
FROM emp
WHERE empno IN (7369,7876,8000)
;
REM ; EMPNO ENAME SAL STARS
REM ; --------- ---------- --------- --------------------
REM ; 8000 DOE
REM ; 7876 ADAMS 1100 ***********
REM ; 7369 SMITH 800 ********
-------------------------------------------------------------------------------
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
55
PRACTICA 1
REM ; pz1go1.sgl
REM , Crec un bloque PL,SQL que determine un nmero de emplecdos
REM , con mcor sclcrio.
REM , c) Aceptc un nmero n como entrcdc de usucrio con un pcrcmetro
REM , de sustitucin de SQLPlus
REM , b) En un bucle, coe los nombres sclcrios de lcs n personcs
REM , con respecto cl sclcrio de lc tcblc EMP.
REM , c) Gucrdc los nombres sclcrios en lc tcblc TDP_DDGS.
REM , d) Asume que dos emplecdos no tiene nuncc el mismo sclcrio.
REM , e) Pruebc unc tcriedcd de ccsos especicles, como n=o, donde
REM , n es mcor que el nmero de emplecdos de lc tcblc EMP.
REM , Vccc lc tcblc TDP_DDGS despues de ccdc pruebc.
SET verify OFF;
ACCEPT g_num PROMPT 'Nmero de empleados:'
DECLARE
CURSOR c1 IS
SELECT ename, sal
FROM emp
WHERE sal IS NOT NULL
ORDER BY sal DESC;
v_ename emp.ename%TYPE;
v_esal emp.sal%TYPE;
v_num NUMBER := &g_num;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_ename, v_esal;
EXIT WHEN c1%ROWCOUNT > v_num OR c1%NOTFOUND OR c1%NOTFOUND
IS NULL;
INSERT INTO top_dogs
VALUES (v_ename, v_esal);
END LOOP;
CLOSE c1;
END;
/
SET verify ON
SELECT * FROM TOP_DOGS;
REM ; Nmero de empleados:4
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; NAME SALARY
REM ; ------------------------- ---------
REM ; KING 5000
REM ; FORD 3000
REM ; SCOTT 3000
REM ; JONES 2975
-------------------------------------------------------------------------------
REM ; pz1goz.sgl
REM , Considerc el ccso donde muchos emplecdos tienen el mismo sclcrio. Si
REM , unc personc es listcdc, entonces todc lc ente que tenc el mismo
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
56
REM , sclcrio no deberc ser listcdc.
REM , c) Por ejemplo, si el usucrio entrc un tclor de z pcrc n, entonces
REM , Kin, Iord Scott debericn ser mostrcdos. (Estos emplecdos estcn
REM , empctcdos con el seundo sclcrio mcs clto).
REM , b) Si el usucrio entrc un tclor de , entonces Kin, Iord, Scott
REM , 1ones debercn ser mostrcdos.
REM , c) orrc todcs lcs jilcs de lc tcblc TDP_DDGS pruebc lc prccticc.
SET verify OFF
ACCEPT g_num PROMPT 'Nmero de empleados:'
DECLARE
CURSOR c1 IS
SELECT e.ename, e.sal
FROM emp e
WHERE &g_num >= ( SELECT COUNT(*)
FROM emp i
WHERE e.sal < i.sal)
AND e.sal IS NOT NULL
ORDER BY e.sal DESC;
BEGIN
FOR c1_record IN c1 LOOP
INSERT INTO top_dogs
VALUES (c1_record.ename, c1_record.sal);
END LOOP;
END;
/
SET verify ON
SELECT * FROM TOP_DOGS;
REM ; Nmero de empleados:2
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; NAME SALARY
REM ; ------------------------- ---------
REM ; KING 5000
REM ; FORD 3000
REM ; SCOTT 3000
DELETE top_dogs;
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
57
PRACTICA
REM ; pzzgo1.sgl
REM , Escribe unc consultc pcrc recoer todos los depcrtcmentos los
REM , emplecdos en ccdc depcrtcmento. Insertc los resultcdos en lc
REM , tcblc MESSAGES. Usc un cursor pcrc recoer el nmero de depcrtcmento
REM , pcsc el nmero de depcrtcmento c un cursor pcrc recoer los
REM , emplecdos en ese depcrtcmento.
SET verify OFF
DECLARE
CURSOR c1 IS
SELECT DISTINCT deptno
FROM dept;
CURSOR c2(v_deptno NUMBER) IS
SELECT ename
FROM emp
WHERE v_deptno=deptno;
BEGIN
FOR c_c1 IN c1 LOOP
FOR c_c2 IN c2(c_c1.deptno) LOOP
INSERT INTO messages
VALUES (c_c2.ename || ' - Department ' ||
c_c1.deptno);
END LOOP;
END LOOP;
END;
/
SET verify ON
SELECT * FROM messages;
REM ; RESULTS
REM ; ---------------------------
REM ; KING - Department 10
REM ; CLARK - Department 10
REM ; MILLER - Department 10
REM ; DOE - Department 10
REM ; JONES - Department 20
REM ; FORD - Department 20
REM ; SMITH - Department 20
REM ; SCOTT - Department 20
REM ; ADAMS - Department 20
REM ; BLAKE - Department 30
REM ; MARTIN - Department 30
REM ; ALLEN - Department 30
REM ; TURNER - Department 30
REM ; JAMES - Department 30
REM ; WARD - Department 30
REM ;
REM ; 15 rows selected.
-------------------------------------------------------------------------------
REM ; pzzgoz.sgl
REM , Modijicc p:pqo.sql pcrc incorporcr lc juncionclidcd de
REM , IDR UPDATE WHERE CURRENT DI en el proceso del cursor.
SET verify OFF
VAR g_id NUMBER;
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
58
ACCEPT g_id PROMPT 'Nmero de empleado:'
DECLARE
CURSOR c1 IS
SELECT NVL(sal,0) salary, stars
FROM emp
WHERE empno = &g_id
FOR UPDATE;
v_cadena emp.stars%TYPE;
v_salario emp.sal%TYPE;
c_c1 c1%ROWTYPE;
BEGIN
OPEN c1;
FETCH c1 INTO c_c1;
FOR i IN 1..ROUND(c_c1.salary/100) LOOP
v_cadena := v_cadena || '*';
END LOOP;
UPDATE emp
SET stars = v_cadena
WHERE CURRENT OF c1;
CLOSE c1;
COMMIT;
END;
/
SET verify ON
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
59
PRACTICA
REM ; pzjgo1.sgl
REM , Escribe un bloque PL,SQL pcrc seleccioncr el nombre del emplecdo con
REM , un sclcrio dcdo por tclor.
REM , c) Si el sclcrio entrcdo retornc mcs de unc columnc, mcnejc lc
REM , excepcin e insertc en lc tcblc MESSAGES, el menscje "Mcs de un
REM , emplecdo con un sclcrio de <sclcrio>".
REM , b) Si el sclcrio entrcdo no retornc ninunc jilc, mcnejc lc
REM , excepcin con un mcnejcdor de excepcin cpropicdo e insertc en lc
REM , tcblc MESSAGES el menscje "Ninn emplecdo con sclcrio <sclcrio>".
REM , c) Si el sclcrio entrcdo retornc solo unc jilc, insertc en lc tcblc
REM , MESSAGES el nombre del emplecdo lc ccntidcd de sclcrio.
REM , d) Mcnejc cuclquier otrc excepcin con un mcnejcdor de excepcin
REM , cpropicdo e insertc en lc tcblc MESSAGES el menscje "Alunos
REM , otros errores hcn ocurrido.".
REM , e) Pruebc el bloque pcrc tcrios ccsos.
SET verify OFF
ACCEPT g_sal PROMPT 'Introduzca el salario:'
DECLARE
v_sal emp.sal%TYPE := &g_sal;
v_ename emp.ename%TYPE;
BEGIN
SELECT ename
INTO v_ename
FROM emp
WHERE sal = v_sal;
INSERT INTO messages
VALUES (v_ename || ' - ' || TO_CHAR(v_sal));
EXCEPTION
WHEN TOO_MANY_ROWS THEN
INSERT INTO messages
VALUES ('Ms de un empleado con un saladio de ' ||
TO_CHAR(v_sal));
WHEN NO_DATA_FOUND THEN
INSERT INTO messages
VALUES ('Ningn empleado con salario ' || TO_CHAR(v_sal));
WHEN OTHERS THEN
INSERT INTO messages
VALUES ('Algunos errores han ocurrido');
END;
/
SET verify ON
SELECT * FROM messages;
DELETE messages;
REM ; Introduzca el salario:1300
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; RESULTS
REM ; -----------------------------------------
REM ; MILLER - 1300
REM ; Introduzca el salario:3000
REM ;
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
60
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; RESULTS
REM ; ------------------------------------------
REM ; Ms de un empleado con un saladio de 3000
REM ; Introduzca el salario:140
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; RESULTS
REM ; ----------------------------------------
REM ; Ningn empleado con salario 140
-------------------------------------------------------------------------------
REM ; pzjgoz.sgl
REM , Modijicc p:8qo.sql pcrc ccdir mcnejo de excepcines.
REM , c) Escribe un mcnejcdor de excepcin pcrc el error de pcscr
REM , un menscje cl usucrio de que el depcrtcmento especijiccdo
REM , no existe.
REM , b) Ejecutc el bloque PL,SQL entrcndo un depcrtcmento que no existc.
SET verify OFF
VAR g_deptno NUMBER;
VAR g_dept_loc VARCHAR2;
VAR g_msg VARCHAR2(60);
ACCEPT g_deptno PROMPT 'Nmero de departamento:'
ACCEPT g_dept_loc PROMPT 'Localizacin del departamento:'
DECLARE
g_deptno_aux dept.deptno%TYPE;
BEGIN
SELECT deptno INTO g_deptno_aux FROM dept WHERE deptno =
&g_deptno;
UPDATE dept
SET loc = '&g_dept_loc'
WHERE deptno = g_deptno_aux;
EXCEPTION
WHEN NO_DATA_FOUND THEN
:g_msg := 'El departamento ' || TO_CHAR(&g_deptno) || ' no
existe';
END;
/
print g_msg;
SET verify ON
REM ; Nmero de departamento:50
REM ; Localizacin del departamento:Crdoba
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; G_MSG
REM ; -----------------------------------------
REM ; El departamento 50 no existe
-------------------------------------------------------------------------------
Andres Reyes Torres
2 I. T. InIormatica de Gestion, Universidad de Cordoba.
61
REM ; pzjgoj.sgl
REM , Escribe un bloque PL,SQL que imprimc los nombres de los emplecdos
REM , quienes hccen mcs o menos de $:oo del tclor del sclcrio introducido.
REM , c) Si no hc emplecdo dentro del rcno sclcricl, imprime un menscje
REM , cl usucrio pcrc indiccrle este ccso. Usc unc excepcin pcrc esto.
REM , b) Si hc uno o mcs emplecdos dentro del rcno, el menscje deberc
REM , indiccr cucntos emplecdos estcn en ese rcno sclcricl.
REM , c) Mcnejc cuclquier otrc excepcin con un mcnejcdor cpropicdo, el
REM , menscje deberc indiccr que otro error ocurri.
SET verify OFF
VAR g_msg VARCHAR2(40);
ACCEPT g_sal PROMPT 'Salario:'
DECLARE
ex_ninguno EXCEPTION;
ex_alguno EXCEPTION;
v_num emp.empno%TYPE;
BEGIN
SELECT COUNT(*)
INTO v_num
FROM emp
WHERE sal >= &g_sal-100 AND sal <= &g_sal+100;
IF v_num >= 1 THEN
RAISE ex_alguno;
ELSE
RAISE ex_ninguno;
END IF;
EXCEPTION
WHEN ex_ninguno THEN
:g_msg := 'Ningn empleado dentro del rango.';
WHEN ex_alguno THEN
:g_msg := 'Empleados dentro del rango: ' || TO_CHAR(v_num);
WHEN OTHERS THEN
:g_msg := 'Error:' || SQLCODE || ' ' || SQLERRM;
END;
/
PRINT g_msg;
REM ; Salario:3000
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; G_MSG
REM ; ----------------------------------------
REM ; Empleados dentro del rango: 3
REM ; Salario:100
REM ;
REM ; PL/SQL procedure successfully completed.
REM ;
REM ;
REM ; G_MSG
REM ; ----------------------------------------
REM ; Ningn empleado dentro del rango.