Създайте спецификация и тяло на пакет наречен PROD_PACK, които съдържат вашите ADD_PROD, UPD_PROD, DEL_PROD процедури, както и функцията Q_PROD.
Забележка: Използвайте кода, които сте съхранили в съответните скрипт файлове.
-
Направете всички процедури и функции (конструкции), видими и достъпни (public);
Забележка: Помислете дали все още се нуждаете от процедурите и функциите, които вече сте пакетирали – те съществуват в речника на данни като “stand-alone
” обекти;
-
-
Извикайте процедурата DEL_PROD (от пакета);
################################################3
CREATE OR REPLACE PACKAGE BODY prod_pack IS
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);
END add_prod;
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;
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;
FUNCTION q_prod
(v_prodid IN product.prodid%TYPE)
RETURN VARCHAR2
IS
v_descrip product.descrip%TYPE;
BEGIN
SELECT descrip
INTO v_descrip
FROM product
WHERE prodid = v_prodid;
RETURN (v_descrip);
END q_prod;
END prod_pack;
/
-
Изведете информацията от таблицата PRODUCT, за да видите резултата.
###########################################
CREATE OR REPLACE PACKAGE prod_pack IS
PROCEDURE add_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE);
PROCEDURE upd_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE);
PROCEDURE del_prod
(v_prodid IN product.prodid%TYPE);
FUNCTION q_prod
(v_prodid IN product.prodid%TYPE)
RETURN VARCHAR2;
END prod_pack;
/
Създайте и извикайте процедури от пакет, които съдържа private и public конструкции -
Създайте спецификация и тяло на пакет наречен EMP_PACK, който съдържа вашата NEW_EMP процедура, като public конструкция и вашата VALID_DEPTNO функция като private конструкция;
-
Извикайте NEW_EMP процедурата, подавайки и номер на отдел 99;
############################################################3
CREATE OR REPLACE PACKAGE BODY emp_pack IS
FUNCTION valid_deptno
(v_deptno IN dept.deptno%TYPE)
RETURN BOOLEAN
IS
v_dummy VARCHAR2(1);
BEGIN
SELECT 'x'
INTO v_dummy
FROM dept
WHERE deptno = v_deptno;
RETURN (TRUE);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN(FALSE);
END valid_deptno;
PROCEDURE new_emp
(v_ename emp.ename%TYPE,
v_job emp.job%TYPE DEFAULT 'SALESMAN', -- Repetition
v_mgr emp.mgr%TYPE DEFAULT 7839, -- of defaults
v_sal emp.sal%TYPE DEFAULT 1000, -- for completeness
v_comm emp.comm%TYPE DEFAULT 0, -- only
v_deptno emp.deptno%TYPE DEFAULT 30)
IS
BEGIN
IF valid_deptno(v_deptno) THEN
INSERT INTO emp
VALUES (seq_empno.NEXTVAL, v_ename, v_job, v_mgr,
TRUNC (SYSDATE, 'DD'), v_sal, v_comm, v_deptno);
ELSE
RAISE_APPLICATION_ERROR (-20205,
'Invalid department number. Try again.');
END IF;
END new_emp;
END emp_pack;
/
-
Извикайте NEW_EMP процедурата, подавайки и номер на отдел 30.
#####################################################
CREATE OR REPLACE PACKAGE prod_pack IS
PROCEDURE add_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE);
PROCEDURE upd_prod
(v_prodid IN product.prodid%TYPE,
v_descrip IN product.descrip%TYPE);
PROCEDURE del_prod
(v_prodid IN product.prodid%TYPE);
FUNCTION q_prod
(v_prodid IN product.prodid%TYPE)
RETURN VARCHAR2;
END prod_pack;
/
Създайте пакет наречен CHK_PACK, който съдържа процедурите CHK_HIREDATE и CHK_DEPT_MGR. Направете и двете конструкции public. -
Процедурата CHK_HIREDATE проверява дали датата на назначение на даден работник е в интервала [текущата дата - 50 години, текущата дата + 3 месеца];
Забележки:
-
Ако датата е невалидна, трябва да вдигнете програмна грешка с подходящо съобщение, което обяснява защо подадената датата е неприемлива;
-
Уверете се, че времевата компонента (указваща час, минути и секунди) се игнорира;
-
Използвайте константа, за да се обърнете, към долната граница на интервала (“текущата дата - 50 години”);
-
Null стойност за дата на назначение, трябва да се третира като невалидна дата.
-
Процедурата CHK_DEPT_MGR проверява комбинацията от отдел и мениджър за даден работник. Процедурата приема като параметъри номер на работник и номер на мениджър и проверява дали работника и мениджъра, работят в един и същи отдел.CHK_DEPT_MGR проверява също дали длъжността на мениджъра е наистина MANAGER.
Забележки:
-
Ако комбинацията номер на отдел/мениджър е невалидна, трябва да вдигнете програмна грешка с подходящо съобщение;
-
Уверете се, че обработвате случая, в които отделът няма мениджър – т.е. подаденият номер на мениджър не е валиден номер на работник.
#########################################################
CREATE OR REPLACE PACKAGE BODY chk_pack IS
PROCEDURE chk_hiredate(v_date in emp.hiredate%type)
IS
v_low date := add_months (trunc(sysdate), - (50 * 12));
v_high date := add_months (trunc(sysdate),3);
BEGIN
IF TRUNC(v_date) NOT BETWEEN v_low and v_high
OR v_date IS NULL THEN
RAISE_APPLICATION_ERROR(-20200,'Not a valid hiredate');
END IF;
END chk_hiredate;
PROCEDURE chk_dept_mgr(v_empno in emp.empno%type,
v_mgr in emp.mgr%type)
IS
v_empnr emp.empno%type;
v_deptno emp.deptno%type;
BEGIN
BEGIN
SELECT deptno --pick up the department number
INTO v_deptno
FROM emp
WHERE empno = v_empno;
EXCEPTION
WHEN no_data_found
THEN RAISE_APPLICATION_ERROR (-20000, 'Not a valid empno');
END;
BEGIN
SELECT empno /*check valid combination
deptno/mgr for given employee */
INTO v_empnr
FROM emp
WHERE deptno = v_deptno
AND empno = v_mgr
AND job = 'MANAGER';
EXCEPTION
WHEN no_data_found
THEN RAISE_APPLICATION_ERROR (-20000,
'Not a valid manager for this department');
END;
END chk_dept_mgr;
END chk_pack;
/
-
Тествайте процедурата CHK_HIREDATE със следните команди:
-
EXECUTE chk_pack.chk_hiredate('01-JAN-47')
-
EXECUTE chk_pack.chk_hiredate(NULL)
-
EXECUTE chk_pack.chk_dept_mgr(7369,7788)
############################################################
CREATE OR REPLACE PACKAGE chk_pack IS
PROCEDURE chk_hiredate(v_date in emp.hiredate%type);
PROCEDURE chk_dept_mgr(v_empno in emp.empno%type,
v_mgr in emp.mgr%type);
END chk_pack;
/
MORE PACKAGE CONCEPTS
-
Създайте пакет наречен OVER_LOAD. Създайте 2 функции в този пакет; наречете и двете функции PRINT_IT. Функцията отпечатват дата или реално число в зависимост от това как е извикана.
-
За да отпечатите стойността от тип date, използвайте “DD-MON-YY” като входен формат и “FmMonth,dd/yyyy” като изходен. Уверете се, че подадения входен параметър е валидна дата.
-
За да отпечатите стойността от тип number използвайте за входен формат “999,999.00” .
-
Тествайте първата версия на PRINT_IT със следните команди:
SQL> variable todays_date varchar2(20)
SQL> execute :todays_date := over_load.print_it(sysdate)
PL/SQL procedure successfully completed.
Сподели с приятели: |