как в oracle присвоить значение переменной
От: aleksataras  
Дата: 03.02.11 13:01
Оценка:
есть процедура

create or replace procedure insert_into_total
(vn_ev_date date,
vn_ch_name long,
vn_ev_type long,
vn_ev_total number) IS
v_total number;
v_rowid long;
begin


select max (rowid) into v_rowid from ev_ctu where ch_name = vn_ch_name and ev_type = vn_ev_type;
if v_rowid <> null then
select ev_total into v_total from ev_ctu where rowid = v_rowid;
if vn_ev_total >= v_total then
insert into total_ctu values
(vn_ev_date,
vn_ch_name,
vn_ev_type,
(vn_ev_total — v_total));
else
insert into total_ctu values
(vn_ev_date,
vn_ch_name,
vn_ev_type,
vn_ev_total);
end if;
else
insert into total_ctu values
(vn_ev_date,
vn_ch_name,
vn_ev_type,
vn_ev_total);
end if;
end insert_into_total;
/

Проблема в том, что отрабатывает постоянно самый последний insert. Я думаю что ошибка в строке "select max (rowid) into v_rowid from ev_ctu where ch_name = vn_ch_name and ev_type = vn_ev_type;" как написать ch_name = ЗНАЧЕНИЕ(vn_ch_name) — ch_name = :vn_ch_name пробую, вылезает ошибка, что нет такой переменной привязки "vn_ch_name".
Re: как в oracle присвоить значение переменной
От: hagane  
Дата: 04.02.11 06:27
Оценка:
Здравствуйте, aleksataras, Вы писали:

A> есть процедура

A>create or replace procedure insert_into_total 
A>(vn_ev_date date,
A>vn_ch_name long,
A>vn_ev_type long,
A>vn_ev_total number) IS
A>v_total number;
A>v_rowid long;
A>begin

A>select max (rowid) into v_rowid from ev_ctu where ch_name = vn_ch_name and ev_type = vn_ev_type;
A>    if v_rowid <> null then
A>        select ev_total into v_total from ev_ctu where rowid = v_rowid; 
A>            if vn_ev_total >= v_total then
A>                insert into total_ctu values
A>                    (vn_ev_date,
A>                     vn_ch_name,
A>                     vn_ev_type,
A>                     (vn_ev_total - v_total));
A>            else 
A>                insert into total_ctu values
A>                    (vn_ev_date,
A>                     vn_ch_name,
A>                     vn_ev_type,
A>                     vn_ev_total);
A>            end if;
A>    else 
A>    insert into total_ctu values
A>                    (vn_ev_date,
A>                     vn_ch_name,
A>                     vn_ev_type,
A>                     vn_ev_total);
A>    end if;
A>end insert_into_total;
A>/


У тебя v_rowid <> null всегда вычислится в false и, следовательно select ev_total into v_total from ev_ctu не выполнится. А, значит, vn_ev_total >= v_total тоже вычислится в false и будет выполняться только блок else.
Как-то так.
Re[2]: как в oracle присвоить значение переменной
От: Аноним  
Дата: 04.02.11 06:45
Оценка:
Здравствуйте, hagane, Вы писали:

H>Здравствуйте, aleksataras, Вы писали:


A>> есть процедура

H>
A>>create or replace procedure insert_into_total 
A>>(vn_ev_date date,
A>>vn_ch_name long,
A>>vn_ev_type long,
A>>vn_ev_total number) IS
A>>v_total number;
A>>v_rowid long;
A>>begin

A>>select max (rowid) into v_rowid from ev_ctu where ch_name = vn_ch_name and ev_type = vn_ev_type;
A>>    if v_rowid <> null then
A>>        select ev_total into v_total from ev_ctu where rowid = v_rowid; 
A>>            if vn_ev_total >= v_total then
A>>                insert into total_ctu values
A>>                    (vn_ev_date,
A>>                     vn_ch_name,
A>>                     vn_ev_type,
A>>                     (vn_ev_total - v_total));
A>>            else 
A>>                insert into total_ctu values
A>>                    (vn_ev_date,
A>>                     vn_ch_name,
A>>                     vn_ev_type,
A>>                     vn_ev_total);
A>>            end if;
A>>    else 
A>>    insert into total_ctu values
A>>                    (vn_ev_date,
A>>                     vn_ch_name,
A>>                     vn_ev_type,
A>>                     vn_ev_total);
A>>    end if;
A>>end insert_into_total;
A>>/
H>


H>У тебя v_rowid <> null всегда вычислится в false и, следовательно select ev_total into v_total from ev_ctu не выполнится. А, значит, vn_ev_total >= v_total тоже вычислится в false и будет выполняться только блок else.


это конечно хорошо, но я как раз и спрашивал, как мне сделать так чтобы v_rowid <> null НЕ вычислялся в false ))). Проблему решил, подсказали — v_rowid is not null;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.