Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Вниз

Странный результат при выполнении хранимой процедуры   Найти похожие ветки 

 
man Yury   (2009-12-15 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 ©   (2009-12-15 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 ©   (2009-12-15 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   (2009-12-16 11:48) [3]

Спасибо за ответ ... "Принцип" работы я понял ... -)))  но вроде бы логичнее было бы что бы если запрос возвращает null то результат бы присваиваивался и переменным...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.005 c
2-1299748767
laby
2011-03-10 12:19
2011.06.19
При вызове sp часики убрать


2-1300046266
Fassy
2011-03-13 22:57
2011.06.19
Уравнение 0.1+ln(1+x)-sin(1+x)


15-1299141839
pasha_golub
2011-03-03 11:43
2011.06.19
Расшифровка математических выражений


6-1238266942
mreg
2009-03-28 22:02
2011.06.19
Пример отправки post запроса + ответ на Winapi


2-1299862251
Artemgood
2011-03-11 19:50
2011.06.19
Создать Автоматизированный информационный стенд колледжа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский