Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
Создать триггер фиксирующий ежеквартальное увеличение заработной платы для сотрудников предприятия. Данные о предварительных изменениях фиксировать во вспомогательной таблице с указанием даты сделанных изменений. Перед обновлением триггер считывает информацию из вспомогательной таблицы, сравнивая текущую дату с датой последней прибавки, в случае если со времени последнего пересчета прошло более 3-х месяцев во вспомогательной таблице фиксируется дата текущего пересчета и значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.

CREATE TABLE staff -- таблица сотрудников
(sno NUMBER(*,0) NOT NULL, -- id сотрудника
fname VARCHAR2(50) NOT NULL, -- имя сотрудника
lname VARCHAR2(50) NOT NULL, -- фамилия сотрудника
address VARCHAR2(255) NOT NULL, -- адресс
tel_no VARCHAR2(255) NOT NULL, -- номер телефона
position VARCHAR2(255) NOT NULL, -- должность
sex NUMBER(1,0) NOT NULL, -- пол
dob DATE NOT NULL, -- дата рождения
salary NUMBER(*,5), -- заработная плата
bno NUMBER(*,0) NOT NULL) -- id департамента в котором он работает

Простые писать умею а с этим беда. :(
7 ноя 12, 11:30    [13431451]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
alexbff,

разумеется вы уже готовы показать свои попытки решить эту задачу?
7 ноя 12, 11:32    [13431475]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
env
alexbff,

разумеется вы уже готовы показать свои попытки решить эту задачу?


проблема в том что я нуб-нубом в БД. И если бы у меня было решение, я бы сюда не пришел.

CREATE OR REPLACE TRIGGER log_rise_salary_at_quot
BEFORE
UPDATE
ON staff
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
declare

begin
if UPDATING then

-- тело триггера.

end if;

end;
что делать дальше я не знаю. Создавать временную таблицу - создам, как туда записать средние значения со всей таблицы если у меня триггер срабатывает для каждой строки. получается нужно две таблицы временных делать. в одну выгружать старые и новые значения position, подсчитывать среднюю зп для :old и :new salary. а потом каким то образом передавать подсчитанные значения в другую временную таблицу.
7 ноя 12, 12:02    [13431786]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
alexbff
проблема в том что я нуб-нубом в БД. И если бы у меня было решение, я бы сюда не пришел.
А кто и зачем заставляет вас писать триггеры?
7 ноя 12, 12:04    [13431826]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
ORA__SQL
alexbff
проблема в том что я нуб-нубом в БД. И если бы у меня было решение, я бы сюда не пришел.
А кто и зачем заставляет вас писать тригеры?


феномен Белоруского высшего образование - экономисту нужны базы данных. В лабе написать три тригерра первых два - простых я сделал. а этот я не совсем понимаю с чего начать.
7 ноя 12, 12:06    [13431846]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
alexbff
фиксируется дата текущего пересчета и значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.

поясните что значит значения средних зарплат??
7 ноя 12, 12:22    [13432012]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
mlc
alexbff
фиксируется дата текущего пересчета и значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.

поясните что значит значения средних зарплат??


я не знаю. есть догадка что увеличение зп касается не одного сотрудника а всех в таблице. т.е если зп повышают то наверное всем сразу. потом в зависимости от должности нужно считать среднюю зп до и после увеличения.
7 ноя 12, 12:34    [13432112]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
alexbff
значения средних зарплат сотрудников

средних
- за период?
- по отделу?
- по должности?
- по проценту от общей суммы зарплатного фонда?
- по первым трём цифрам номера телефона?
- по хешу от фамилии сотрудника?
- ..?
7 ноя 12, 12:56    [13432343]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
Corner
Member

Откуда:
Сообщений: 1270
alexbff
есть догадка

у вас даже постановки конкретной нет, а вы хотите что б вам помогли.
7 ноя 12, 12:58    [13432362]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
Corner
Member

Откуда:
Сообщений: 1270
автор
увеличение зп касается не одного сотрудника а всех в таблице.

а если сотрудник уволен, вы его удаляете из таблицы?
7 ноя 12, 13:00    [13432372]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
автор
увеличение зп касается не одного сотрудника а всех в таблице.

А если сотрудника перевели на др. должность?
7 ноя 12, 13:06    [13432418]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
mlc, и все остальные....

Парни, всё что написано в методичке по этому триггеру перед вами. Я думаю это из серии догадайся сам. Поэтому не нужно меня гнобить, что я не понимаю чего я хочу. задача поставлена, она перед вами - большей информации у меня нет. я сам читал больше часа думал и гадал и в отчаянии пришёл сюда, вспомнив что у меня есть здесь регистрация.
7 ноя 12, 13:15    [13432498]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
Corner
Member

Откуда:
Сообщений: 1270
alexbff
я сам читал больше часа думал и гадал и в отчаянии пришёл сюда


т.е. вы хотите что б вам подсказали решение или реализацию?
7 ноя 12, 13:23    [13432558]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
Corner
alexbff
я сам читал больше часа думал и гадал и в отчаянии пришёл сюда


т.е. вы хотите что б вам подсказали решение или реализацию?


Уважаемый, а конкретно вы, - что можете подсказать решение или реализацию?
7 ноя 12, 13:26    [13432597]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
alexbff,

Для начала - найдите того, кто может конкретизировать постановку задачи. По кое-какой постановке всегда можно сделать какое-то решение, но результат будет чем угодно.
7 ноя 12, 14:24    [13433150]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
Я на измене
Guest
могу предположить, что среднее считаем в разрезе должности:
alexbff
и значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.
7 ноя 12, 14:29    [13433183]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
Я на измене
могу предположить, что среднее считаем в разрезе должности:
alexbff
и значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.


согласен, это выглядит логично.
7 ноя 12, 14:53    [13433393]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
env
alexbff,

Для начала - найдите того, кто может конкретизировать постановку задачи. По кое-какой постановке всегда можно сделать какое-то решение, но результат будет чем угодно.


я ж не приду к преподу и не скажу: - Ты знаешь мне крутой нОгибатор SQL с ником env, сказал что ты "Алень".
7 ноя 12, 14:57    [13433434]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
FANTASIST
Member

Откуда:
Сообщений: 38
таблица:

create table xxx_logs
(sno NUMBER(*,0) NOT NULL, -- id сотрудника
position VARCHAR2(255) NOT NULL, -- должность
sr_salary_old NUMBER(*,5),
sr_salary_new NUMBER(*,5),
salary NUMBER(*,5),
change_date date);

триггер:

create or replace trigger t_staff
before update of salary on staff
for each row
declare
last_date date;
summ number;
changed number;
begin
select max(change_date)
into last_date
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

if last_date is null then
insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, :old.salary, :old.salary, :old.salary, sysdate);
elsif add_months(last_date, 3) < sysdate then
select sum(salary), count(1)
into summ, changed
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, summ/changed, (summ+:new.salary)/(changed+1),:new.salary, sysdate)
end if;
end;
7 ноя 12, 14:57    [13433441]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
FANTASIST
таблица:

create table xxx_logs
(sno NUMBER(*,0) NOT NULL, -- id сотрудника
position VARCHAR2(255) NOT NULL, -- должность
sr_salary_old NUMBER(*,5),
sr_salary_new NUMBER(*,5),
salary NUMBER(*,5),
change_date date);

триггер:

create or replace trigger t_staff
before update of salary on staff
for each row
declare
last_date date;
summ number;
changed number;
begin
select max(change_date)
into last_date
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

if last_date is null then
insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, :old.salary, :old.salary, :old.salary, sysdate);
elsif add_months(last_date, 3) < sysdate then
select sum(salary), count(1)
into summ, changed
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, summ/changed, (summ+:new.salary)/(changed+1),:new.salary, sysdate)
end if;
end;


О! Спасибо. ща опробуем.
7 ноя 12, 15:02    [13433486]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
FANTASIST,
select max(change_date)
 into last_date
 into my_date
 from xxx_logs
 where sno = :old.sno
 and position := :old.position;
into,into 12c?
7 ноя 12, 15:06    [13433533]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
mlc
Member

Откуда: Asus Winter Cup
Сообщений: 487
alexbff,

alexbff
Я на измене
могу предположить, что среднее считаем в разрезе должности:
alexbff
значения средних зарплат сотрудников до и после изменения в зависимости от занимаемых должностей.



согласен, это выглядит логично.

FANTASIST
select sum(salary), count(1)
into summ, changed
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;


тебе нужно в логи записывать зп по сотруднику или среднюю по всему отделу?
7 ноя 12, 15:16    [13433620]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
alexbff
FANTASIST
таблица:

create table xxx_logs
(sno NUMBER(*,0) NOT NULL, -- id сотрудника
position VARCHAR2(255) NOT NULL, -- должность
sr_salary_old NUMBER(*,5),
sr_salary_new NUMBER(*,5),
salary NUMBER(*,5),
change_date date);

триггер:

create or replace trigger t_staff
before update of salary on staff
for each row
declare
last_date date;
summ number;
changed number;
begin
select max(change_date)
into last_date
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

if last_date is null then
insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, :old.salary, :old.salary, :old.salary, sysdate);
elsif add_months(last_date, 3) < sysdate then
select sum(salary), count(1)
into summ, changed
into my_date
from xxx_logs
where sno = :old.sno
and position := :old.position;

insert into xxx_logs(sno,position,sr_salary_old, sr_salary_new, salary,change_date)
values (:old.sno, :old.position, summ/changed, (summ+:new.salary)/(changed+1),:new.salary, sysdate)
end if;
end;


О! Спасибо. ща опробуем.


не хватает ; - после инсерта.

походу ругается на

into summ, changed
into my_date
from xxx_logs

6:06:29 Start Compiling 1 object(s) ...
6:06:29 Executing ALTER TRIGGER t_staff COMPILE DEBUG ...
6:06:29 [7:16] PL/SQL: ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось
6:06:29 [6:1] PL/SQL: SQL Statement ignored
6:06:29 [18:20] PL/SQL: ORA-00923: ключевое слово FROM не найдено там, где оно ожидалось
6:06:29 [17:1] PL/SQL: SQL Statement ignored
6:06:29 Compilation complete - 4 error(s) found
6:06:29 End Compiling 1 object(s)
7 ноя 12, 15:16    [13433623]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
FANTASIST
Member

Откуда:
Сообщений: 38
да ошибся просто. уж пофиксить-то не ленитесь
7 ноя 12, 15:18    [13433636]     Ответить | Цитировать Сообщить модератору
 Re: Здравствуйте, помогите написать триггер  [new]
alexbff
Member

Откуда:
Сообщений: 14
FANTASIST
да ошибся просто. уж пофиксить-то не ленитесь


у вас icq или скайп и кошелёк вебмани - хочу вас отблагодарить :)
7 ноя 12, 15:19    [13433649]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить