Конференция "Базы" » Странный результат при выполнении хранимой процедуры [D7, fb2.1]
 
  • 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 то результат бы присваиваивался и переменным...
 
Конференция "Базы" » Странный результат при выполнении хранимой процедуры [D7, fb2.1]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]