Total Salary for Unidentified departments IS 11000
##########################################################
SET SERVEROUT ON
DECLARE
sal_total NUMBER;
dept_no emp.deptno%TYPE;
CURSOR c_sal IS
SELECT sum(sal), deptno
FROM emp
GROUP BY deptno;
BEGIN
OPEN c_sal;
LOOP
FETCH c_sal INTO sal_total, dept_no;
EXIT WHEN c_sal%NOTFOUND;
IF dept_no IS NOT NULL THEN
dbms_output.put_line('Total Salary for Department '|| dept_no||' IS ' ||sal_total);
ELSE
dbms_output.put_line('Total Salary for Unidentified departments IS ' ||sal_total);
END IF;
END LOOP;
CLOSE c_sal;
END;
/
Как бихте могли да получите същият резултат без да използвате PL/SQL блок?
######################################################
SELECT 'Total Salary for Department '|| deptno||' IS ' ||sum(sal) as "TOTAL SALARY"
FROM emp
WHERE deptno is not null
GROUP by deptno
UNION
SELECT 'Total Salary for Unidentified departments IS ' ||sum(sal) as "TOTAL SALARY "
FROM emp
WHERE deptno is null
GROUP BY deptno
/**************************************************** Variant 2 *************************************************/
/*SELECT DECODE(NVL(deptno,-1),
'-1', 'Total Salary for unidentified departments IS ' ||sum(sal),
'Total Salary for Department '|| deptno||' IS ' ||sum(sal)
)
as "TOTAL SALARY"
FROM emp
GROUP BY deptno
*/
-
Разгледайте функциите rank() и dense_rank() в SQL Reference от документацията. Можете ли стяхна помощ да реализирате зад.3 без да използвате курсори и цикли?
Кое от решенията е по-ефективно?
###################################################
begin
insert into top_dogs as
select ename,sal
from
(
select w.ename,w.sal, rank() over (order by sal desc) top_n
from emp w
)
where top_n <=3 -- rownum <=2
end
-------------
begin
insert into top_dogs as
select ename,sal
from
(select e.ename,e.sal, dense_rank() over (order by sal desc) top_n
from emp e )
where top_n <=3
end
EXCEPTIONS
-
Напишете PL/SQL блок, който селектира името на работникът с дадена заплата.
-
Ако въведената заплата връща повече от един ред, прихванете изключението и въведете в таблицата MESSAGES съобщението “More than one employee with a salary of ”;
##############################
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary value: '
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE := &p_sal;
BEGIN
SELECT ename
INTO v_ename
FROM emp
WHERE sal = v_sal;
INSERT INTO messages (results)
VALUES (v_ename || ' - ' || v_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages (results)
VALUES ('No employee with a salary of '|| TO_CHAR(v_sal));
WHEN too_many_rows THEN
INSERT INTO messages (results)
VALUES ('More than one employee with a salary of '||
TO_CHAR(v_sal));
WHEN others THEN
INSERT INTO messages (results)
VALUES ('Some other error occurred.');
END;
/
SET VERIFY ON
-
Ако въведената заплата не връща нито един ред, прихванете изключението и въведете в таблицата MESSAGES съобщението “No employee with a salary of ”;
-
Ако въведената заплата връща само един ред, въведете в таблицата MESSAGES името на работника и неговата заплата;
###########################################
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary value: '
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE := &p_sal;
v_err_code NUMBER;
v_err_msg VARCHAR(100);
BEGIN
SELECT ename
INTO v_ename
FROM emp
WHERE sal = v_sal;
INSERT INTO messages (results)
VALUES (v_ename || ' - ' || v_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages (results)
VALUES ('No employee with a salary of '|| TO_CHAR(v_sal));
WHEN too_many_rows THEN
INSERT INTO messages (results)
VALUES ('More than one employee with a salary of '||TO_CHAR(v_sal));
WHEN others THEN
v_err_code:=SQLCODE;
v_err_msg :=SQLERRM;
INSERT INTO messages (results)
VALUES ('Some other error occurred.'||' ErrorCode='||TO_CHAR(v_err_code)|| '. Msg='||v_err_msg);
END;
/
SET VERIFY ON
-
Прихванете останалите изключения и въведете в таблицата MESSAGES съобщението “Some other error occurred.”
-
Тествайте програмата:
-
Тествайте със следните стойности за заплатата: 2850, 5000, 3000, 33
-
Как да тестваме OTHERS?
-
Променете програмата, така че случая на непредвидена грешка в (случая OTHERS) да се записва номера и съобщението на грешката.
-
Създайте PL/SQL блок, които променя местоположението на съществуващ отдел. Съхранете вашия PL/SQL блок във файл наречен Except_Sol2.sql.
-
Използвайте субституционен параметър за номера на отдела;
-
Използвайте субституционен параметър за местоположението на отдела;
-
Тествайте блока;
#################################3
SET VERIFY OFF
ACCEPT p_deptno PROMPT 'Please enter the department number: '
ACCEPT p_loc PROMPT 'Please enter the department location: '
BEGIN
UPDATE dept
SET loc = UPPER('&p_loc')
WHERE deptno = &p_deptno;
COMMIT;
END;
/
SET VERIFY ON
-
Изкарайте номера, името и местоположението на променения отдел.
#################################
SELECT *
FROM dept
WHERE deptno = &p_deptno;
-
Модифицирайте Except_Sol2.sql и добавете exception handler.
-
Напишете подходящ exception handler, така че да изкарате съобщение на потребителя, когото подадения от него номер на отдел е номер на несъществуващ отдел;
-
Изпълнете PL/SQL блокът като въведете отдел, който не съществува.
################################################
SET VERIFY OFF
VARIABLE g_message VARCHAR2(40)
ACCEPT p_deptno PROMPT 'Please enter the department number: '
ACCEPT p_loc PROMPT 'Please enter the department location: '
DECLARE
e_invalid_dept EXCEPTION;
v_deptno dept.deptno%TYPE := &p_deptno;
BEGIN
UPDATE dept
SET loc = '&p_loc'
WHERE deptno = v_deptno;
COMMIT;
IF SQL%NOTFOUND THEN
raise e_invalid_dept;
END IF;
EXCEPTION
WHEN e_invalid_dept THEN
:g_message := 'Department '|| TO_CHAR(v_deptno) ||
' is an invalid department';
END;
/
SET VERIFY ON
PRINT g_message
-
Напишете PL/SQL блок, който отпечатва номерата на работниците, които имат плюс или минус 100 от заплатата, въведена като параметър.
-
Ако няма работници във този обхват, изкарайте съобщение на потребителя указващо, че случаят е такъв;
-
Ако има един или повече работници в този обхват, съобщението трябва да указва колко са на брой работниците от обхвата;
###################################################
VARIABLE g_message VARCHAR2(100)
SET VERIFY OFF
ACCEPT p_sal PROMPT 'Please enter the salary: '
DECLARE
v_sal emp.sal%TYPE := &p_sal;
v_low_sal emp.sal%TYPE := v_sal - 100;
v_high_sal emp.sal%TYPE := v_sal + 100;
v_no_emp NUMBER(7);
e_no_emp_returned EXCEPTION;
e_more_than_one_emp EXCEPTION;
BEGIN
SELECT count(ename)
INTO v_no_emp
FROM emp
WHERE sal between v_low_sal and v_high_sal;
IF v_no_emp = 0 THEN
RAISE e_no_emp_returned;
ELSIF v_no_emp > 0 THEN
RAISE e_more_than_one_emp;
END IF;
EXCEPTION
WHEN e_no_emp_returned THEN
:g_message := 'There is no employee salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal);
WHEN e_more_than_one_emp THEN
:g_message := 'There is/are '|| TO_CHAR(v_no_emp) ||
' employee(s) with a salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal);
END;
/
SET VERIFY ON
PRINT g_message
-
Прихванете всички останали изключения. Съобщението трябва да указва, че някаква друга грешка е възникнала.
##############################################3
SET VERIFY OFF
SET SERVEROUTPUT ON
ACCEPT p_sal PROMPT 'Please enter the salary: '
DECLARE
v_sal emp.sal%TYPE := &p_sal;
v_low_sal emp.sal%TYPE := v_sal - 100;
v_high_sal emp.sal%TYPE := v_sal + 100;
v_no_emp NUMBER(7);
e_no_emp_returned EXCEPTION;
e_more_than_one_emp EXCEPTION;
BEGIN
SELECT count(ename)
INTO v_no_emp
FROM emp
WHERE sal between v_low_sal and v_high_sal;
IF v_no_emp = 0 THEN
RAISE e_no_emp_returned;
ELSIF v_no_emp > 0 THEN
RAISE e_more_than_one_emp;
END IF;
EXCEPTION
WHEN e_no_emp_returned THEN
dbms_output.put_line('There is no employee salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal));
WHEN e_more_than_one_emp THEN
dbms_output.put_line( 'There is/are '|| TO_CHAR(v_no_emp) ||
' employee(s) with a salary between '||
TO_CHAR(v_low_sal) || ' and '||
TO_CHAR(v_high_sal));
WHEN others THEN
dbms_output.put_line( 'Some other error occured.');
END;
/
SET VERIFY ON
EXPLICIT CURSORS
-
Използвайте курсор, за да върнете номер и име на отдел от таблицата DEPT. Подайте номерът на отдела на друг курсор, за да върнете от таблицата EMP информация за името, длъжността, дата на назначаване и заплатата на всички работници, които работят в този отдел.
Department Number : 10 Department Name : ACCOUNTING
CLARK MANAGER 09-JUN-81 2450
MILLER CLERK 23-JAN-82 1300
DOE CLERK 05-MAR-04
Department Number : 20 Department Name : RESEARCH
JONES MANAGER 02-APR-81 2975
SMITH CLERK 17-DEC-80 800
ADAMS CLERK 12-JAN-83 1100
JONES1 MANAGER 02-APR-81 2975
Department Number : 30 Department Name : SALES
BLAKE MANAGER 01-MAY-81 2850
MARTIN SALESMAN 28-SEP-81 1250
ALLEN SALESMAN 20-FEB-81 1600
TURNER SALESMAN 08-SEP-81 1500
JAMES CLERK 03-DEC-81 950
WARD SALESMAN 22-FEB-81 1250
Department Number : 40 Department Name : OPERATIONS
#################################################
SET SERVEROUTPUT ON
DECLARE
CURSOR dept_cursor IS
SELECT deptno,dname
FROM dept
ORDER BY deptno;
CURSOR emp_cursor (v_deptno NUMBER) IS
SELECT ename,job,hiredate,sal
FROM emp
WHERE deptno = v_deptno;
v_current_deptno dept.deptno%TYPE;
v_current_dname dept.dname%TYPE;
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
v_mgr emp.mgr%TYPE;
v_hiredate emp.hiredate%TYPE;
v_sal emp.sal%TYPE;
v_line varchar2(100);
BEGIN
v_line := '
';
OPEN dept_cursor;
LOOP
FETCH dept_cursor INTO v_current_deptno,v_current_dname;
EXIT WHEN dept_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE ('Department Number : ' || v_current_deptno || ' Department Name : ' || v_current_dname);
DBMS_OUTPUT.PUT_LINE(v_line);
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
OPEN emp_cursor (v_current_deptno);
LOOP
FETCH emp_cursor INTO v_ename,v_job,v_hiredate,v_sal;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (v_ename || ' ' || v_job || ' ' || v_hiredate || ' ' || v_sal);
END LOOP;
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
DBMS_OUTPUT.PUT_LINE(v_line);
END LOOP;
IF emp_cursor%ISOPEN THEN
CLOSE emp_cursor;
END IF;
CLOSE dept_cursor;
END;
/
SET SERVEROUTPUT OFF
-
Добавете нова колона наречена STARS от тип VARCHAR2 и дължина 50 в таблицата EMP за съхранение на звездички.
############################################
ALTER TABLE emp
ADD stars VARCHAR2(50)
/
-
Създайте блок, който награждава работник като добавя звездички в колоната STARS за всеки 100$ от заплатата му. Съхранете този блок във файл наречен p3.sql.
-
Приемете номера на работника като като потребителски вход чрез субституционна променлива на SQL*Plus;
-
Инициализирайте променливата, която ще съдържа низа от звездички;
-
Добавяйте звездичка в низа за всеки 100$ от заплатат му. Например, ако работникът има заплата от 800$, низът от звездички ще съдържа 8 звездички. Ако работникът има заплата от 1250$, низът от звездички ще съдържа 13 звездички;
-
Променете STARS колоната на работника със съответния брой звезди;
-
Потвърдете направената промяна;
-
Тествайте блока за работници, които имат нямат заплата, както и за работници, които имат.
####################################
SET VERIFY OFF
ACCEPT p_empno PROMPT 'Please enter the employee number: '
DECLARE
v_empno emp.empno%TYPE := &p_empno;
v_asterisk emp.stars%TYPE := NULL;
v_sal emp.sal%TYPE;
BEGIN
SELECT NVL(ROUND(sal/100), 0)
INTO v_sal
FROM emp
WHERE empno = v_empno;
FOR i IN 1..v_sal LOOP
v_asterisk := v_asterisk ||'*';
END LOOP;
UPDATE emp
SET stars = v_asterisk
WHERE empno = v_empno;
COMMIT;
END;
/
SET VERIFY ON
-
Модифицирайте p3.sql, за да включите FOR UPDATE и WHERE CURRENT OF функционалност в изпълнението на курсор.
################################################
SET VERIFY OFF
ACCEPT p_empno PROMPT 'Please enter the employee number: '
DECLARE
v_empno emp.empno%TYPE := &p_empno;
v_asterisk emp.stars%TYPE := NULL;
CURSOR emp_cursor IS
SELECT empno, NVL(ROUND(sal/100), 0) sal
FROM emp
WHERE empno = v_empno
FOR UPDATE;
BEGIN
FOR emp_record IN emp_cursor LOOP
FOR i IN 1..emp_record.sal LOOP
v_asterisk := v_asterisk ||'*';
END LOOP;
UPDATE emp
SET stars = v_asterisk
WHERE CURRENT OF emp_cursor;
v_asterisk := NULL;
END LOOP;
COMMIT;
END;
/
SET VERIFY ON
CREATING PROCEDURES
-
Създайте и извикайте съхранена процедура LOG_EXECUTION без параметри, която записва потребителя и текущата дата в таблицата LOG_TABLE. Разгледайте получените резултати.
##############################################################
CREATE OR REPLACE PROCEDURE log_execution
IS
BEGIN
INSERT INTO log_table (user_id, log_date)
VALUES (user, sysdate);
END log_execution;
/
-
Създайте и извикайте процедура LEAVE_EMP и разгледайте получените резултати.
-
Създайте процедура наречена LEAVE_EMP за изтриване на работник от таблицата EMP.
-
Подайте номера на работника, който е напуснал като параметър.
-
Използвайте процедурата LOG_EXECUTION, за да регистрирате в таблицата LOG_TABLE потребителя, който изпълнява процедурата LEAVE_EMP.
-
Тествайте процедурата и разгледайте получените резултати.
####################################################
CREATE OR REPLACE PROCEDURE leave_emp (v_id IN emp.empno%TYPE)
IS
BEGIN
DELETE FROM emp
WHERE empno = v_id;
log_execution;
END leave_emp;
/
-
Създайте и извикайте процедурата ADD_PROD и разгледайте получените резултати.
-
Създайте процедура наречена ADD_PROD за въвеждане на нов продукт в таблицата PRODUCT.
-
Подайте номер на продукт и негово описание като използвате 2 параметъра.
-
Компилирайте кода, извикайте процедурата и напишете заявка върху таблицата PRODUCT, за да видите резултата.
-
Извикайте процедурата отново, подавайки продукт с номер 100860. Какво се случва и защо?
#######################################
CREATE OR REPLACE PROCEDURE add_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE)
IS
BEGIN
INSERT INTO product (prodid, descrip)
VALUES (v_prodid, v_descrip);
COMMIT;
END add_prod;
/
-
Създайте и извикайте процедура наречена UPD_PROD за модифициране на продукт в таблицата PRODUCT.
-
Създайте процедура наречена UPD_PROD за промяна на описанието на продукт. Подайте номер на продукт и ново описание като използвате 2 параметъра. Включете необходимата обработка на изключения, ако не са настъпили никакви промени.
-
Компилирайте кода, извикайте процедурата и след това изкарайте необходимата информация от таблицата PRODUCT, за да видите резултатите. Проверете също обработката на изключения като се опитате да промените несъществуващ продукт.
###########################################
CREATE OR REPLACE PROCEDURE upd_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE)
IS
BEGIN
UPDATE product
SET descrip = v_descrip
WHERE prodid = v_prodid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202,'No products updated.');
END IF;
END upd_prod;
/
-
Създайте и извикайте процедура наречена DEL_PROD за изтриване на продукт от таблицата PRODUCT.
-
Създайте процедура наречена DEL_PROD за изтриване на продукт от таблицата PRODUCT. Включете необходимата обработка на изключения, ако не е изтрит нито един продукт.
-
Компилирайте кода, извикайте процедурата и напишете заявка върху таблицата PRODUCT, за да видите резултата. Проверете и обработката на изключения като се опитате да изтриете несъществуващ продукт.
#####################################
CREATE OR REPLACE PROCEDURE del_prod
(v_prodid IN product.prodid%TYPE)
IS
BEGIN
DELETE FROM product
WHERE prodid = v_prodid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20203,'No products deleted.');
END IF;
END DEL_PROD;
/
-
Създайте процедура наречена QUERY_EMP, която извлича информация от таблицата EMP , връщайки заплатата и длъжността на работник, когато подадете номера на работник.
-
Създайте процедура, която връща стойности от колоните SAL и JOB за определен работник (използвайте EMPNO).
-
Използвайте променливи на средата за двата OUT параметъра.
-
Компилирайте кода, извикайте процедурата и изкарайте на екрана заплатата и длъжността за работник с номер 7839.
-
Извикайте процедурата отново, подавайки работник с номер 9898. Какво се случва и защо?
###########################################3
CREATE OR REPLACE PROCEDURE query_emp
(v_empno IN emp.empno%TYPE,
v_sal OUT emp.sal%TYPE,
v_job OUT emp.job%TYPE)
IS
BEGIN
SELECT sal, job
INTO v_sal, v_job
FROM emp
WHERE empno = v_empno;
END query_emp;
/
Допълнителна задача (с малко по-висока трудност от горните)
Задача 7.
Създайте процедура наречена UPD_DEPT_DEPTNO, която променя номер на отдел. Уверете се, че в случая когато променяме номер на непразен отдел (с регистрирани работници), процедурата работи коректно.
Как се държи вашата процедура, когато и се подаде несъществуващ номер на отдел? Ами ако новият номер на отдел е номер на вече съществуващ отдел?
#########################################
CREATE OR REPLACE PROCEDURE UPD_DEPT_DEPTNO
(v_deptno IN dept.deptno%TYPE,
v_new_deptno IN dept.deptno%TYPE)
IS
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE;
e_dept_exist EXCEPTION;
PRAGMA EXCEPTION_INIT (e_dept_exist, -00001);
BEGIN
SELECT dname,loc
INTO v_dname,v_loc
FROM dept
WHERE deptno=v_deptno;
INSERT INTO dept
VALUES (v_new_deptno,v_dname,v_loc);
UPDATE EMP
SET deptno=v_new_deptno
WHERE deptno=v_deptno;
DELETE dept
WHERE deptno=v_deptno;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR (-20001,'No such department');
WHEN e_dept_exist THEN
RAISE_APPLICATION_ERROR (-20002,'Department ' || v_new_deptno ||' already exist!');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20003,'Error');
Rollback;
END UPD_DEPT_DEPTNO;
/
-- execute upd_dept_deptno(40,10);
########################################################
CREATE OR REPLACE PROCEDURE UPD_DEPT_DEPTNO
(v_deptno IN dept.deptno%TYPE,
v_new_deptno IN dept.deptno%TYPE)
IS
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE;
v_new_dept_check number;
e_dept_exist EXCEPTION;
BEGIN
SELECT count(*) INTO v_new_dept_check
FROM dept
WHERE deptno=v_new_deptno;
IF v_new_dept_check<>0
THEN RAISE e_dept_exist;
END IF;
SELECT dname,loc
INTO v_dname,v_loc
FROM dept
WHERE deptno=v_deptno;
INSERT INTO dept
VALUES (v_new_deptno,v_dname,v_loc);
UPDATE EMP
SET deptno=v_new_deptno
WHERE deptno=v_deptno;
DELETE dept
WHERE deptno=v_deptno;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR (-20001,'No such department');
WHEN e_dept_exist THEN
RAISE_APPLICATION_ERROR (-20001,'Department ' || v_new_deptno ||' already exist!');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20001,'Error');
Rollback;
END UPD_DEPT_DEPTNO;
/
-- execute upd_dept_deptno(40,10);
###########################################################
CREATE OR REPLACE PROCEDURE UPD_DEPT_DEPTNO
(v_deptno IN dept.deptno%TYPE,
v_new_deptno IN dept.deptno%TYPE)
IS
v_dname dept.dname%TYPE;
v_loc dept.loc%TYPE;
v_new_dept_check number;
v_dept_check number;
e_new_dept_exist EXCEPTION;
e_dept_exist EXCEPTION;
BEGIN
SELECT count(*) INTO v_new_dept_check
FROM dept
WHERE deptno=v_new_deptno;
IF v_new_dept_check<>0
THEN RAISE e_new_dept_exist;
END IF;
SELECT count(*) INTO v_dept_check
FROM dept
WHERE deptno=v_deptno;
IF v_dept_check<>0
THEN RAISE e_dept_exist;
ELSE
update dept
set deptno=v_new_deptno
where deptno=v_deptno;
END IF;
EXCEPTION
WHEN e_new_dept_exist THEN
RAISE_APPLICATION_ERROR (-20001,'Department ' || v_new_deptno ||' already exist!');
WHEN e_dept_exist THEN
BEGIN
SELECT dname,loc
INTO v_dname,v_loc
FROM dept
WHERE deptno=v_deptno;
INSERT INTO dept
VALUES (v_new_deptno,v_dname,v_loc);
UPDATE EMP
SET deptno=v_new_deptno
WHERE deptno=v_deptno;
DELETE dept
WHERE deptno=v_deptno;
EXCEPTION
WHEN no_data_found THEN RAISE_APPLICATION_ERROR (-20001,'No such department');
WHEN OTHERS THEN Rollback; RAISE_APPLICATION_ERROR (-20001,'Inner Error');
END;
WHEN OTHERS THEN Rollback; RAISE_APPLICATION_ERROR (-20001,'Error');
END UPD_DEPT_DEPTNO;
/
-- execute upd_dept_deptno(40,10);
############################################################
-
Създайте и извикайте процедура наречена EMP_GRADE, която по подаден grade, извежда имената на всички работници със съответния grade. Ако бъде подаден невалиден grade, то процедурата вдига програмна грешка с номер -20100 и съобщение “Invalid grade!”
-
Подайте grade като входен параметър
-
Изведете имената и длъжностите на работниците със съответния grade на екрана, като използвате пакета DBMS_OUTPUT.
-
Тествайте различните случаи и демонстрирайте получения резултат.
TEST:
-
GRADE
| RESULT |
0
|
PL/SQL procedure successfully completed.
|
3
|
ALLEN,SALESMAN
TURNER,SALESMAN
PL/SQL procedure successfully completed.
|
5
|
KING,PRESIDENT
PL/SQL procedure successfully completed.
|
6
|
…
ORA-20100: Invalid grade!
…
|
Сподели с приятели: |