Basic structures напишете pl/sql блок, който въвежда номера в таблицата messages


Създайте спецификация и тяло на пакет наречен PROD_PACK, които съдържат вашите ADD_PROD, UPD_PROD, DEL_PROD процедури, както и функцията Q_PROD



страница4/6
Дата30.03.2017
Размер450.15 Kb.
#18074
1   2   3   4   5   6

Създайте спецификация и тяло на пакет наречен PROD_PACK, които съдържат вашите ADD_PROD, UPD_PROD, DEL_PROD процедури, както и функцията Q_PROD.


Забележка: Използвайте кода, които сте съхранили в съответните скрипт файлове.

  1. Направете всички процедури и функции (конструкции), видими и достъпни (public);

Забележка: Помислете дали все още се нуждаете от процедурите и функциите, които вече сте пакетирали – те съществуват в речника на данни като “stand-alone

” обекти;





  1. Извикайте процедурата 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;

/


  1. Изведете информацията от таблицата 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;

/

  1. Създайте и извикайте процедури от пакет, които съдържа private и public конструкции


  1. Създайте спецификация и тяло на пакет наречен EMP_PACK, който съдържа вашата NEW_EMP процедура, като public конструкция и вашата VALID_DEPTNO функция като private конструкция;

  2. Извикайте 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;

/


  1. Извикайте 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;

/

  1. Създайте пакет наречен CHK_PACK, който съдържа процедурите CHK_HIREDATE и CHK_DEPT_MGR. Направете и двете конструкции public.


  1. Процедурата CHK_HIREDATE проверява дали датата на назначение на даден работник е в интервала [текущата дата - 50 години, текущата дата + 3 месеца];

Забележки:

    • Ако датата е невалидна, трябва да вдигнете програмна грешка с подходящо съобщение, което обяснява защо подадената датата е неприемлива;

    • Уверете се, че времевата компонента (указваща час, минути и секунди) се игнорира;

    • Използвайте константа, за да се обърнете, към долната граница на интервала (“текущата дата - 50 години”);

    • Null стойност за дата на назначение, трябва да се третира като невалидна дата.

  1. Процедурата 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;

/









  1. Тествайте процедурата 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



  1. Създайте пакет наречен OVER_LOAD. Създайте 2 функции в този пакет; наречете и двете функции PRINT_IT. Функцията отпечатват дата или реално число в зависимост от това как е извикана.

  • За да отпечатите стойността от тип date, използвайте “DD-MON-YY” като входен формат и “FmMonth,dd/yyyy” като изходен. Уверете се, че подадения входен параметър е валидна дата.

  • За да отпечатите стойността от тип number използвайте за входен формат “999,999.00” .

  1. Тествайте първата версия на PRINT_IT със следните команди:


SQL> variable todays_date varchar2(20)

SQL> execute :todays_date := over_load.print_it(sysdate)

PL/SQL procedure successfully completed.






Сподели с приятели:
1   2   3   4   5   6




©obuch.info 2024
отнасят до администрацията

    Начална страница