Преобразование курсора из PLSQL в TSQL - PullRequest
0 голосов
/ 10 мая 2011

Я перенес свою следующую функцию plsql из oracle в mssql 2008, но не знаю, как преобразовать курсор в цикле while. Не могли бы вы помочь?

CREATE OR REPLACE function f_genel_iskonto (p_ID_MUSTERI_SIRKET in number, p_BILGI_TIP in NUMBER) 
return number
is
v_iskonto number;
begin
v_iskonto:=null;
for c in (
  SELECT an.mt_iskonto_oran, an.aktif, an.id_anlasma
    FROM lu_anlasma an
   WHERE an.id_musteri_sirket = p_ID_MUSTERI_SIRKET AND an.id_durum = 9
     AND (TRUNC (SYSDATE) BETWEEN an.baslangic AND an.bitis)
ORDER BY an.baslangic DESC
) loop
    if p_BILGI_TIP=1 then
        v_iskonto:=c.mt_iskonto_oran;
    end if;
    if p_BILGI_TIP=2 then
        v_iskonto:=c.aktif;
    end if;
    if p_BILGI_TIP=3 then
        v_iskonto:=c.id_anlasma;
    end if; 
    exit;
end loop;
return v_iskonto;
exception 
when others then 
return null;
end;

1 Ответ

2 голосов
/ 10 мая 2011

В этом случае вам не нужно конвертировать курсор / цикл, поскольку он просматривает только первую запись.

create function f_genel_iskonto (@p_ID_MUSTERI_SIRKET int, @p_BILGI_TIP int)
returns int
as
begin
    declare @result int

    SELECT top 1 
         @result = case @p_BILGI_TIP 
          when 1 then an.mt_iskonto_oran
          when 2 then an.aktif
          when 3 then an.id_anlasma
       end
      FROM lu_anlasma an    
     WHERE an.id_musteri_sirket = @p_ID_MUSTERI_SIRKET AND an.id_durum = 9
       AND (current_timestamp BETWEEN an.baslangic AND an.bitis) 
     ORDER BY an.baslangic DESC 
    return @result
end

И вам, вероятно, потребуется настроить сравнение дат, чтобы сделать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...