Правильно ли я программирую?

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
raulr
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-10-05 6:54:25

Правильно ли я программирую?

Непрочитанное сообщение raulr » 2011-12-03 17:19:20

Здравствуйте!! Пожалуйста, Не проявите ленивость, Обратите внимание!!!

У меня есть пакет RASUL_PKG, которого я сейчась опишу:

CREATE OR REPLACE PACKAGE ADBOLNICA.rasul_pkg is
procedure set_initial_state;
procedure save_id_p (uch number, id number);
procedure calc_vrem_preb;
cnt number := 0 ;
uch_in number;
end;

Тело пакета:

CREATE OR REPLACE PACKAGE BODY ADBOLNICA.rasul_pkg is
type istoria_table is table of number index by pls_integer;
id_patient istoria_table;
empty istoria_table;

procedure set_initial_state is
begin
cnt:=cnt+1;
if (cnt=1) then
id_patient := empty;
end if;
end;

procedure save_id_p (uch number, id number) is
begin
id_patient(uch):=id;
end;

procedure calc_vrem_preb is
--declare

date_v date;
date_p date;
begin
if cnt=1 then
uch_in := id_patient.first;
end if;
while uch_in is not null loop
select date_vipes into date_v from istoria where uch_nom = uch_in and id_p = id_patient(uch_in);
select date_post into date_p from istoria where uch_nom = uch_in and id_p = id_patient(uch_in);
if (cnt<=2) then
if (date_v is null) then begin cnt:=1;
update istoria set vrem_prebivania=0 where uch_nom=uch_in; end;
else begin cnt:=1;
update istoria set vrem_prebivania=trunc(date_v-date_p) where uch_nom=uch_in; end;
end if;
end if;
id_patient.delete(uch_in);
uch_in:=id_patient.next(uch_in);
end loop; cnt:=0;

end;
end;

И есть три UPDATE триггера, на таблицу ISTORIA. Таблица имеет такие поля, как UCH_NOM(primary key), ID_P, DATE_POST, DATE_VIPES, VREM_PRIBIVANIE. При обновлении строки этой таблицы, триггеры дожны вызывать процедур в пакете RASUL_PKG, которые в свою очередь организують вычисления значения поля VREM_PRIBIVANIE (VREM_PREBIVANIE=DATE_VIPES-DATE_POST) этой строки. Вот програмный код этих триггер.


CREATE OR REPLACE TRIGGER ADBOLNICA.rasul_trg3
before update
on istoria
begin
rasul_pkg.set_initial_state;
end;


CREATE OR REPLACE TRIGGER ADBOLNICA.rasul_trg4
after update on istoria
FOR EACH ROW
begin
rasul_pkg.save_id_p(:new.uch_nom,:new.id_p);
end;


CREATE OR REPLACE TRIGGER ADBOLNICA.rasul_trg5
After update
on istoria
begin
rasul_pkg.calc_vrem_preb;
end;

Для уточнения: Создал я этих трех триггер во избежании ошибки МУТИРУЮЩИИ ТАБЛИЦЫ. А переменную CNT в теле пакета ввел во избежании ошибки рекурсивных вызовов этих триггер (Обратите внимание, в теле пакета есть DML команда Update, который в свою очередь будет вызывать этих триггер заново)

Делаю Апдейт таблицы ISTORIA командой UPDATE istoria SET date_vipes=sysdate where ID_P>=2 and ID_P<=5. Обновляется 4 записей. Но вычеслен значение поля VREM_PRIBIVANIE только у одной строки, у которой значение поля ID_P=2.

Вопрос: Правильно ли програмный код моего пакета??????? Где я ошибся????? ИЛИ что вы посоветуете, чтоб триггеры вычисляли значения поля VREM_PREBIVANIE всех записи, которых я обновлял с помощью командой:
UPDATE istoria SET date_vipes=sysdate where ID_P>=2 and ID_P<=5.

????????????

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: Правильно ли я программирую?

Непрочитанное сообщение LMik » 2011-12-03 18:54:54

Базы то бывают разные, вы о чем?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

raulr
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-10-05 6:54:25

Re: Правильно ли я программирую?

Непрочитанное сообщение raulr » 2011-12-03 19:11:50

ORACLE 10g Enterprise Edition

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: Правильно ли я программирую?

Непрочитанное сообщение LMik » 2011-12-03 20:40:37

raulr писал(а):ORACLE 10g Enterprise Edition
Это вы сильно, нечего даже сказать :(
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
vadim64
майор
Сообщения: 2101
Зарегистрирован: 2009-09-17 15:15:26
Откуда: Засратовец

Re: Правильно ли я программирую?

Непрочитанное сообщение vadim64 » 2011-12-03 20:50:06

оракл любит нелитеральные запросы
Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.