-
man Yury (15.12.09 18:24) [0]Добрый день, All!
Использую V2.1.1.17910 Firebird 2.1. При выполнении следующей хранимой процедуру получаю странный результатCREATE PROCEDURE PR_CHECK
RETURNS (
IDTEST1 INTEGER,
STRTEST1 VARCHAR(11),
IDTEST2 INTEGER,
STRTEST2 VARCHAR(11))
AS
begin
for select T1, T_STR1
from TBL1
into :idTEST1, :STRTEST1
do
begin
select T2, T_STR2 from TBL2
where T_STR2=:STRTEST1
into :idTEST2, :STRTEST2;
suspend;
end
end
Значения таблицы TBL1
123 FORTEST
124 FORTEST2
Значения таблицы TBL2
123 FORTEST
345 FOR12345
Результат
123 FORTEST 123 FORTEST
124 FORTEST2 123 FORTEST
По идее последняя строка результата запроса должна быть
124 FORTEST2 null null
Заранее благодарен за ответ -
zorik © (15.12.09 21:19) [1]Ничего странного. Внешний цикл состоит проходит 2 раза. При первом прохождении в :idTEST2, :STRTEST2 записываются значения и на suspend хранимая процедура возвращает набор, при втором прохождении из второй таблици никакие значения не отбираются, а :idTEST2, :STRTEST2 остаются прежние, suspend возвращает набор.
Попробую несколько извращенно на примере показать
CREATE PROCEDURE PR_CHECK
RETURNS (
IDTEST1 INTEGER,
STRTEST1 VARCHAR(11),
IDTEST2 INTEGER,
STRTEST2 VARCHAR(11))
AS
declate variable c integer;
begin
for select T1, T_STR1
from TBL1
into :idTEST1, :STRTEST1
do
begin
select
count(T2), T2, T_STR2
from TBL2
where T_STR2=:STRTEST1
into :c, :idTEST2, :STRTEST2;
if (:c > 0) then suspend; <<-- возвращаем запись если что-то выбрали
end
end;
Здесь можно обойтись одним запросом без хранимки! -
zorik © (15.12.09 21:22) [2]сори, неправильно прочитал. тогда так:
for select T1, T_STR1
from TBL1
into :idTEST1, :STRTEST1
do
begin
idTEST2=null;
STRTEST=null;
select T2, T_STR2 from TBL2
where T_STR2=:STRTEST1
into :idTEST2, :STRTEST2;
suspend;
end -
man Yury (16.12.09 11:48) [3]Спасибо за ответ ... "Принцип" работы я понял ... -))) но вроде бы логичнее было бы что бы если запрос возвращает null то результат бы присваиваивался и переменным...