Форум: "Базы";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
Внизfor select Найти похожие ветки
← →
ufff (2003-01-13 17:14) [0]Вопрос возник о применимости for select в процедурах:
в процедуре такая вещь допустима?:
for
select col1
from table1
where col2 > 0
into :var1
do begin
if (expr=1) then begin
insert into table1 -- это ведь не попадет в выборку?
(col1, col2, col3, col4)
values
(......) ;
end
end
Можно в цикле добавлять изменять данные, из таблицы (таблиц) , по которым идет выборка? Какие побочные эффекты? И можно ли их избежать?
← →
Big_Rom (2003-01-13 18:03) [1]А документацию уже лень читать ?
← →
ufff (2003-01-14 10:10) [2]:)) пальцем покажи...
кроме синтаксиса и простейшего использования там вроде ничего больше нету - LANGREF.PDF, DataDef.pdf
← →
Big_Rom (2003-01-14 10:22) [3]на смотри
(а тотже метод научного тыка нельзя использовать :))) )
CREATE PROCEDURE MESDOHOD_S
RETURNS (
SUMNA NUMERIC(15,2),
LZ INTEGER,
AVANS NUMERIC(15,2),
DOLG NUMERIC(15,2),
KTG INTEGER)
AS
BEGIN
FOR SELECT SUMNA,
LZ,
AVANS,
KTG
FROM MESDOHOD
INTO :SUMNA,:LZ,:AVANS,:KTG
DO
BEGIN
if (ktg=1) then UPDATE MESDOHOD set lz=23;
END
END
← →
Alexandr (2003-01-14 10:30) [4]2Big_Rom © где вы такую траву берете?
2ufff: Особенность в данном случае такая?
Попадет или нет все зависит от того, какой план получился у запроса по которому идет цикл.
Если запрос формировался через сортировку на диске (т.е. sort)(и выборка таким образом выбралать один раз на момент начала цикла), то не попадет, если же выборка формируется постепенно (т.е. когда сортировка на диске не производилась), то попадет.
Я понятно написал?
← →
Big_Rom (2003-01-14 10:53) [5]to Alexandr
это ответ на этот вопрос
Можно в цикле добавлять изменять данные, из таблицы (таблиц) , по которым идет выборка?
от приведн выше;
2 из вопроса а вернее из скриншота цыкла я лично не понял не чего
кто такая expr
for
select col1
from table1
where col2 > 0
into :var1
do begin
if (expr=1) then begin
з.ы. где вы такую траву берете?
а вот и даже и не скажу :))
← →
Alexandr (2003-01-14 10:56) [6]ты что, думаешь твоя процедура работать нормально будет?
← →
Big_Rom (2003-01-14 12:39) [7]ага ну все lz тока на 23 поменяются ну еще ........
насчет нормальности она и работает тока в некотором другом виде :))
← →
Alexandr (2003-01-14 12:42) [8]:)
← →
ufff (2003-01-14 12:58) [9]дык как определить - выборка по которой цикл будет менячться или нет???
Методом тыка - жуть....где гарантия что на какомто наборе записей не сглюкнет?
Просто вещи такие иногда происходят: в выборку попадают записи, совсем не удовлетворяющие условию отбора...
Вот часть ...из списание товара из остатков на складе (наверное зря я сюда это кидаю...) сейчас это работает (глючило пока не поставил where вместо and:
....
F = 1;
for select OIG.ID, BALANCE
from OVERHEAD_IN_GOODS OIG left join OVERHEAD_IN OI
on (OI.ID = OIG.OV_IN_ID)
where (OI.BASE_ID = :BASE_FROM_ID)
and (OIG.GOODS_ID = :GOODS_ID) and (OIG.BALANCE > 0)
order by OIG.POS
into :FROM_OIG_ID, :BALANCE
do begin
if (BALANCE < GOODS_COUNT) then
DIFF = BALANCE;
else
DIFF = GOODS_COUNT;
if (F = 1) then begin
update OVERHEAD_IN_GOODS
set OV_IN_GOODS_ID = :FROM_OIG_ID,
GOODS_COUNT = :DIFF
where ID = :OIG_ID;
F = 0;
end else begin
execute procedure GET_GEN_GID returning_values :NEW_ID;
insert into OVERHEAD_IN_GOODS
(ID, OV_IN_ID, OV_IN_GOODS_ID, GOODS_COUNT, GOODS_ID, POS)
values
(:NEW_ID, :OI_ID, :OIG_ID, :DIFF, :GOODS_ID, :POS);
end
update OVERHEAD_IN_GOODS
set BALANCE = BALANCE - :DIFF
where ID = :FROM_OIG_ID;
GOODS_COUNT = GOODS_COUNT - DIFF;
POS = POS + 1;
if (GOODS_COUNT = 0) then exit;
end /* FOR */
if (F = 0) then begin
execute procedure GET_GEN_GID returning_values :NEW_ID;
insert into OVERHEAD_IN_GOODS
(ID, OV_IN_ID, GOODS_COUNT, GOODS_ID, POS)
values
(:NEW_ID, :OI_ID, :GOODS_COUNT, :GOODS_ID, :POS);
end
...
эхх а вдруг еще какие шутки появятся:((
← →
Alexandr (2003-01-14 13:17) [10]сам черт ногу сломит в твоем коде.
Блин, ну объяснил же я тебе.
А хочешь по-другому застраховаться ну поле с флагом добавь в свою таблицу, и его проверяй в for_select.
Да валом способов.
← →
ufff (2003-01-14 13:31) [11]Alexandr: какой план получился я как узнаю?
← →
Alexandr (2003-01-14 13:36) [12]ты про IBExpert слышал?
А вообще-то достаточно в задать order by не по индексу. И 100% получится то, что надо. Правда тормозить будет на очень большой выборке.
← →
ufff (2003-01-15 17:16) [13]в общем, если выборка делается не по индексу (в частности когда сортировка не по проиндексированныхм полям) то в начале создается... гдето на сервере отсортированная выборка, а затем FOR уже идет по ней... так?
эх... чтоб не заморачиваться буду "временнуюю" таблицу использовать:(
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c