将Pl Sql函数转换为Sql

时间:2011-04-19 19:39:24

标签: sql-server oracle tsql plsql

我想将以下函数从plsql转换为tsql.But我不擅长在tsql中,而且swisssql也无法正确转换它。你能看一下吗?谢谢

CREATE OR REPLACE function yonetici_kontrol_musteri (p_ID_MUSTERI_SIRKET in number, p_ID_YONETICI in number) 
return number
is
v_unvan number;
v_yonetici number;
v_tmp_unvan number;
v_tmp_yonetici number;
v_result number;

begin

v_result:=-1;


SELECT id_unvan  INTO v_unvan  FROM lu_yonetici WHERE id_yonetici=p_ID_YONETICI;


for c in (  SELECT NVL (b.id_mufettis, 0) id_mufettis, b.id_sef
              FROM cr_rut_musteri c, lu_bayi_temsilci b
             WHERE c.id_musteri_sirket = p_id_musteri_sirket
               AND c.id_temsilci = b.id_temsilci
               AND c.valid = 1
               AND b.valid = 1
               AND c.aktif = 1
               AND b.aktif = 1
          ) 
loop

    CASE v_unvan
    WHEN 1 THEN
        if c.id_mufettis = p_ID_YONETICI then
           v_result:=1;
        else
           v_result:=0;
        end if;
    WHEN 2 THEN -- satis sefi
        if c.id_sef = p_ID_YONETICI then
           v_result:=1;
        else
           v_result:=0;
        end if;
    ELSE 
        v_yonetici:=c.id_sef;

        loop
            SELECT uy.id_unvan, uy.id_yonetici INTO v_tmp_unvan, v_tmp_yonetici  
              FROM lu_yonetici y, lu_yonetici uy 
             WHERE y.id_ust_yonetici=uy.id_yonetici
               AND y.id_yonetici=v_yonetici;

             if v_tmp_unvan=v_unvan then
                 if v_tmp_yonetici=p_ID_YONETICI then
                    v_result:=1;
                 else
                    v_result:=0;             
                 end if;
             else
                 v_yonetici:=v_tmp_yonetici;
             end if;

             exit when v_result=1 or v_tmp_unvan>=v_unvan;
        end loop;       
    END CASE;
    exit when v_result=1;

end loop;         

return v_result;
exception 
when others then 
return 0;
end;

1 个答案:

答案 0 :(得分:0)

您可能想尝试SwisSQL Online migration tool

它给出了以下结果:

--SWISSQL DROP SCRIPTS 
If Exists ( SELECT name 
            FROM sysobjects  
            WHERE name = 'yonetici_kontrol_musteri'
            AND type = 'FN')
    DROP FUNCTION yonetici_kontrol_musteri
GO 
CREATE FUNCTION yonetici_kontrol_musteri
(
    @p_ID_MUSTERI_SIRKET                      FLOAT ,
    @p_ID_YONETICI                            FLOAT 
)
RETURNS FLOAT 
AS 
    BEGIN


        DECLARE @adv_error INT

        DECLARE @v_unvan                                  FLOAT 
        DECLARE @v_yonetici                               FLOAT 
        DECLARE @v_tmp_unvan                              FLOAT 
        DECLARE @v_tmp_yonetici                           FLOAT 
        DECLARE @v_result                                 FLOAT 
        SELECT @v_result  = - 1 
        SELECT @v_unvan  =  id_unvan
        FROM  lu_yonetici 
        WHERE    id_yonetici  = @p_ID_YONETICI


        SELECT @adv_error = @@ERROR
        IF @adv_error != 0 
        BEGIN
            GOTO Exception1
        END



        DECLARE cursor_for_inline_select1 CURSOR LOCAL FOR 
        SELECT
                 ISNULL(b.id_mufettis, 0) id_mufettis,
                 b.id_sef
        FROM  cr_rut_musteri c,
             lu_bayi_temsilci b 
        WHERE    c.id_musteri_sirket  = @p_id_musteri_sirket
         AND    c.id_temsilci  = b.id_temsilci
         AND    c.valid  = 1
         AND    b.valid  = 1
         AND    c.aktif  = 1
         AND    b.aktif  = 1

        OPEN cursor_for_inline_select1 

        FETCH NEXT FROM  cursor_for_inline_select1 INTO 
                            /* SwisSQL (Oracle To SQL Server) : Table Information is not found in METADATA for the CURSOR used by the record-index */

        WHILE (@@FETCH_STATUS <> -1)

        BEGIN

            IF @v_unvan  = 1 
            BEGIN 
            IF /* SwisSQL (Oracle To SQL Server) : Manual Conversion Required */   c.id_mufettis = @p_ID_YONETICI 
            BEGIN 
                SELECT @v_result  = 1 
            END
            ELSE
            BEGIN 
                SELECT @v_result  = 0 
            END
            END 
            ELSE
            IF @v_unvan  = 2 
            BEGIN 
            -- satis sefi

            IF /* SwisSQL (Oracle To SQL Server) : Manual Conversion Required */   c.id_sef = @p_ID_YONETICI 
            BEGIN 
                SELECT @v_result  = 1 
            END
            ELSE
            BEGIN 
                SELECT @v_result  = 0 
            END
            END 
            ELSE 
            BEGIN 
            SELECT @v_yonetici  = /* SwisSQL (Oracle To SQL Server) : Manual Conversion Required */   c.id_sef 
            DECLARE @count       INT 
        SELECT @count = 1 
        WHILE (0 = 0) 
            BEGIN --( 
                SELECT
                         @v_tmp_unvan  =  uy.id_unvan,
                         @v_tmp_yonetici  =  uy.id_yonetici
                FROM  lu_yonetici y,
                     lu_yonetici uy 
                WHERE    y.id_ust_yonetici  = uy.id_yonetici
                 AND    y.id_yonetici  = @v_yonetici


                SELECT @adv_error = @@ERROR
                IF @adv_error != 0 
                BEGIN
                    GOTO Exception1
                END

                IF @v_tmp_unvan = @v_unvan 
                BEGIN 
                    IF @v_tmp_yonetici = @p_ID_YONETICI 
                    BEGIN 
                        SELECT @v_result  = 1 
                    END
                    ELSE
                    BEGIN 
                        SELECT @v_result  = 0 
                    END

                END
                ELSE
                BEGIN 
                    SELECT @v_yonetici  = @v_tmp_yonetici 
                END

                IF @v_result = 1 or @v_tmp_unvan >= @v_unvan 
                BREAK

            SELECT @count=@count +1
            END --) 

            END 
            IF @v_result = 1 
            BREAK



        FETCH NEXT FROM  cursor_for_inline_select1 INTO 
                            /* SwisSQL (Oracle To SQL Server) : Table Information is not found in METADATA for the CURSOR used by the record-index */
        END
        CLOSE cursor_for_inline_select1
        DEALLOCATE cursor_for_inline_select1


 DEALLOCATE cursor_for_inline_select1
        return @v_result
        GOTO ExitLabel1
        Exception1:

            BEGIN

 DEALLOCATE cursor_for_inline_select1
            return 0 
            /* SwisSQL (Oracle To SQL Server) : Manual Intervention to verify Exception is required */
            END
        ExitLabel1:

        return @v_result

    END


GO
 ########################################################################################################

编辑:有关详细信息,请查看this问题