| ëÁÔÁÌÏÇ | ïÇÌÁ×ÌÅÎÉÅ | éÎÄÅËÓ ÒÁÚÄÅÌÁ |
| îÁÚÁÄ | ÷ÐÅÒÅÄ |
÷ ÓÒÅÄÅ Oracle Navigator ÓÏÚÄÁÅÔÓÑ ÔÒÉÇÇÅÒ ÎÁ ÔÁÂÌÉÃÕ work.
DECLARE val NUMBER;
BEGIN
/* ÷ÙÂÉÒÁÅÔÓÑ ÒÁÚÎÏÓÔØ ÍÅÖÄÕ ÛÔÁÔÎÙÍ ËÏÌÉÞÅÓÔ×ÏÍ ÓÔÁ×ÏË
ÐÏ ÄÁÎÎÏÊ ÄÏÌÖÎÏÓÔÉ (staff.rate) É ÒÅÁÌØÎÙÍ ËÏÌÉÞÅÓÔ×ÏÍ
ÓÔÁ×ÏË (×ÙÂÉÒÁÅÔÓÑ × ÐÏÄÚÁÐÒÏÓÅ) */
SELECT rate-s1 INTO val
FROM staff,
/* ëÏÌÉÞÅÓÔ×Ï ÓÔÁ×ÏË ÐÏ ÄÁÎÎÏÊ ÄÏÌÖÎÏÓÔÉ */
(SELECT :neww.staff_id AS st,SUM(rate) AS s1
FROM work
WHERE staff_id=:neww.staff_id) t1
WHERE staff_id=st;
IF val-:neww.rate<0
THEN raise_application_error( -20777, 'Rate limitation');
END IF;
/* ÷ÙÂÉÒÁÅÔÓÑ ÒÁÚÎÏÓÔØ ÍÅÖÄÕ ÌÉÍÉÔÏÍ ÚÁÒÐÌÁÔÙ
ÄÁÎÎÏÇÏ ÏÔÄÅÌÁ É ÒÅÁÌØÎÏÊ ÓÕÍÍÏÊ ÚÁÒÐÌÁÔ
ÓÏÔÒÕÄÎÉËÏ× ÏÔÄÅÌÁ */
SELECT s2-s1 INTO val
FROM
/* ÓÕÍÍÁ ÚÁÒÐÌÁÔ ÐÏ ÏÔÄÅÌÕ */
(SELECT SUM(salary) AS s1
FROM work
WHERE staff_id IN
(SELECT staff_id
FROM staff
WHERE dep_id=(SELECT dep_id
FROM staff
WHERE staff_id=:neww.staff_id))) t1,
/* ÌÉÍÉÔ ÚÁÒÐÌÁÔÙ ÏÔÄÅÌÁ */
(SELECT salary_limit AS s2
FROM staff, department
WHERE staff.dep_id=department.dep_id
AND staff.staff_id=:neww.staff_id) t2;
IF val-:neww.salary<0
THEN raise_application_error( -20777, 'Salary limitation');
END IF;
END;
WHEN (
-- óÒÁ×ÎÉ×ÁÅÔÓÑ ÛÔÁÔÎÏÅ ËÏÌÉÞÅÓÔ×ÏÍ ÓÔÁ×ÏË ÐÏ ÄÁÎÎÏÊ
-- ÄÏÌÖÎÏÓÔÉ staff.rate) É ÒÅÁÌØÎÏÅ ËÏÌÉÞÅÓÔ×Ï ÓÔÁ×ÏË
-- (×ÙÂÉÒÁÅÔÓÑ × ÐÏÄÚÁÐÒÏÓÅ)
(SELECT rate
FROM staff
WHERE staff_id=neww.staff_id ) + neww.rate
<
(SELECT SUM(rate)
FROM work
WHERE staff_id=neww.staff_id)
OR
-- óÒÁ×ÎÉ×ÁÅÔÓÑ ÌÉÍÉÔ ÚÁÒÐÌÁÔÙ ÄÁÎÎÏÇÏ ÏÔÄÅÌÁ
-- É ÒÅÁÌØÎÁÑ ÓÕÍÍÁ ÚÁÒÐÌÁÔ ÓÏÔÒÕÄÎÉËÏ× ÏÔÄÅÌÁ
(SELECT SUM(salary)
FROM work
WHERE staff_id IN
(SELECT staff_id
FROM staff
WHERE dep_id=(SELECT dep_id
FROM staff
WHERE staff_id=neww.staff_id))) + neww.salary
>
(SELECT salary_limit
FROM staff, department
WHERE staff.dep_id=department.dep_id
AND staff.staff_id=neww.staff_id)
)
SIGNAL SQLSTATE '75000' ('Rate/salary limitation')
ðÏÄÇÏÔÏ×ÉÍ ÎÏ×ÏÇÏ ÓÏÔÒÕÄÎÉËÁ, ÎÁ ÚÁÞÉÓÌÅÎÉÉ ËÏÔÏÒÏÇÏ ÍÙ ÂÕÄÅÍ ÐÒÏ×ÅÒÑÔØ ÄÅÊÓÔ×ÉÅ ÔÒÉÇÇÅÒÁ:
INSERT INTO employee VALUES (7777777777, 'ôÅÓÔÏ×ÙÊ','ôÅÓÔ', 'ôÅÓÔÏ×ÉÞ', '01.09.2001', 'ÕÌ.ëÏÎÔÒÏÌØÎÁÑ,1,Ë×.1', 777777);
ðÒÏ×ÅÄÅÍ ÐÒÅÄ×ÁÒÉÔÅÌØÎÏÅ ÉÓÓÌÅÄÏ×ÁÎÉÅ ÎÁÛÅÊ âä ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ×ÙÑÓÎÉÔØ, × ËÁËÏÊ ÏÔÄÅÌ É ÎÁ ËÁËÕÀ ÄÏÌÖÎÏÓÔØ ÎÁÍ ÎÕÖÎÏ ÚÁÞÉÓÌÑÔØ ÎÏ×ÏÇÏ ÓÏÔÒÕÄÎÉËÁ, ÞÔÏÂÙ ÐÒÏ×ÅÒÉÔØ ÂÉÚÎÅÓ-ÐÒÁ×ÉÌÁ, ÚÁÄÁ×ÁÅÍÙÅ ÔÒÉÇÇÅÒÏÍ.
äÌÑ ÜÔÏÇÏ:
SELECT department.dep_id, salary_limit, s1
FROM department,
(SELECT dep_id, SUM(salary) AS s1
FROM staff, work
where staff.staff_id=work.staff_id
GROUP BY dep_id) t1
WHERE department.dep_id=t1.dep_id
ORDER BY 1;
DEP_ID SALARY_LIMIT S1
--------- ------------ ---------
10 28500 28900
20 10500 8300
30 22000 17900
40 16000 10400
50 26500 16200
60 18500 17200
70 2200 16500
80 13000 10300
90 12500 12600
(ðÒÉ×ÅÄÅÎÁ ×ÙÂÏÒËÁ, ÐÏÌÕÞÅÎÎÁÑ × Oracle, ÒÅÚÕÌØÔÁÔÙ ÔÏÇÏ ÖÅ ÚÁÐÒÏÓÁ ÄÌÑ DB2 ÁÎÁÌÏÇÉÞÎÙ)
éÚ ÐÏÌÕÞÅÎÎÏÊ ×ÙÂÏÒËÉ ÍÙ ×ÉÄÉÍ, ÞÔÏ × ÏÔÄÅÌÅ 60 ÉÍÅÅÔÓÑ ÎÅÂÏÌØÛÏÊ "ÎÅÄÏÒÁÓÈÏÄ" ÆÏÎÄÁ ÚÁÒÐÌÁÔÙ. åÓÌÉ ××ÅÓÔÉ × ÜÔÏÔ ÏÔÄÅÌ ÎÏ×ÏÇÏ ÓÏÔÒÕÄÎÉËÁ Ó ÚÁÒÐÌÁÔÏÊ ÎÅ ÂÏÌÅÅ 1300, ÔÏ ÕÓÌÏ×ÉÅ ÏÇÒÁÎÉÞÅÎÉÑ ÐÏ ÚÁÒÐÌÁÔÅ, ÚÁÄÁ×ÁÅÍÏÅ ÔÒÉÇÇÅÒÏÍ, ×ÙÐÏÌÎÑÔØÓÑ ÎÅ ÂÕÄÅÔ; ÅÓÌÉ ÖÅ ÚÁÒÐÌÁÔÁ ÎÏ×ÏÇÏ ÓÏÔÒÕÄÎÉËÁ ÂÕÄÅÔ ÂÏÌØÛÅ 1300, ÔÏ ÔÒÉÇÇÅÒ ÎÅ ÐÏÚ×ÏÌÉÔ ××ÅÓÔÉ ÔÁËÏÅ ÎÁÚÎÁÞÅÎÉÅ.
SELECT staff.staff_id, staff.rate, s1
FROM staff,
(SELECT staff_id, SUM(rate) AS s1
FROM work
GROUP BY staff_id) t1
WHERE staff.staff_id=t1.staff_id
AND dep_id=60
ORDER BY 1;
STAFF_ID RATE S1
--------- --------- ---------
601 1 1
602 1 1
603 6 4
÷ ÏÔÄÅÌÅ 60 ÉÍÅÅÔÓÑ ÒÅÚÅÒ× ÓÔÁ×ÏË ÐÏ ÄÏÌÖÎÏÓÔÉ 603. åÓÌÉ ÎÏ×ÙÊ ÓÏÔÒÕÄÎÉË ÂÕÄÅÔ ÐÏÌÕÞÁÔØ ÏÄÎÕ ÓÔÁ×ËÕ ÐÏ ÄÏÌÖÎÏÓÔÉ 603, ÔÏ ÕÓÌÏ×ÉÅ ÏÇÒÁÎÉÞÅÎÉÑ ÐÏ ÛÔÁÔÎÏÍÕ ÒÁÓÐÉÓÁÎÉÀ, ÚÁÄÁ×ÁÅÍÏÅ ÔÒÉÇÇÅÒÏÍ, ×ÙÐÏÌÎÑÔØÓÑ ÎÅ ÂÕÄÅÔ; ÅÓÌÉ ÖÅ ÎÏ×ÏÇÏ ÓÏÔÒÕÄÎÉËÁ ÎÁÚÎÁÞÉÔØ ÎÁ ÄÏÌÖÎÏÓÔÉ 601 ÉÌÉ 602, ÔÏ ÔÒÉÇÇÅÒ ÎÅ ÐÏÚ×ÏÌÉÔ ××ÅÓÔÉ ÔÁËÏÅ ÎÁÚÎÁÞÅÎÉÅ.
éÔÁË, ÔÅÓÔÏ×ÙÅ ÚÁÐÒÏÓÙ:
INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 602, 10000, '01-SEP-2001', 1);
INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 603, 2000, '01-SEP-2001', 1);
INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 603, 1000, '01-SEP-2001', 1);
SQL> INSERT INTO work (empl_id, staff_id, salary, start_date, rate)
2 VALUES (7777777777, 602, 10000, '01-SEP-2001', 1);
INSERT INTO work (empl_id, staff_id, salary, start_date, rate)
*
ERROR at line 1:
ORA-20777: Rate limitation
ORA-06512: at "U1.T1", line 14
ORA-04088: error during execution of trigger 'U1.T1'
SQL> INSERT INTO work (empl_id, staff_id, salary, start_date, rate)
2 VALUES (7777777777, 603, 2000, '01-SEP-2001', 1);
INSERT INTO work (empl_id, staff_id, salary, start_date, rate)
*
ERROR at line 1:
ORA-20777: Salary limitation
ORA-06512: at "U1.T1", line 37
ORA-04088: error during execution of trigger 'U1.T1'
SQL> INSERT INTO work (empl_id, staff_id, salary, start_date, rate)
2 VALUES (7777777777, 603, 1000, '01-SEP-2001', 1);
1 row created.
------------------------------ Command Entered ------------------------------ INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 602, 10000, '01.09.2001', 1) ; ----------------------------------------------------------------------------- DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0438N Application raised error with diagnostic text: "Rate/salary limitation". SQLSTATE=75000 ------------------------------ Command Entered ------------------------------ INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 603, 2000, '01.09.2001', 1) ; ----------------------------------------------------------------------------- DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0438N Application raised error with diagnostic text: "Rate/salary limitation". SQLSTATE=75000 ------------------------------ Command Entered ------------------------------ INSERT INTO work (empl_id, staff_id, salary, start_date, rate) VALUES (7777777777, 603, 1000, '01.09.2001', 1) ; ----------------------------------------------------------------------------- DB20000I The SQL command completed successfully.
| îÁÚÁÄ | ÷ÐÅÒÅÄ |
| ëÁÔÁÌÏÇ | ïÇÌÁ×ÌÅÎÉÅ | éÎÄÅËÓ ÒÁÚÄÅÌÁ |