Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-5181
Чайник(заварной)
2003-01-18 01:30
2003.02.03
Помогите с TStringGrid


7-5302
sph
2002-11-25 06:32
2003.02.03
Windows 2k cmd


8-5070
Алешка
2002-10-15 18:38
2003.02.03
Как получить цвет точки экрана с заданными координатами?


3-4812
Sergey_El'f
2003-01-17 13:31
2003.02.03
ADOQuery - возвращает иероглифы. где менять cp (langdriver?)


3-4823
ledzzz
2003-01-17 18:15
2003.02.03
Fastreport 2.47





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский