将SQL Server存储过程转换为PostgreSQL函数

问题描述

我是Postgresql的新手,我有一个用T-sql编写的存储过程,我想将其转换为Postgresql。到目前为止,我已经做完了,但是我被困在搜索了很多地方但在互联网上找不到任何东西的地方。

下面是我需要适应PGsql的T-sql存储过程

If <someCondi>
    BEGIN
        ...
    END
ELSE
    BEGIN
        GENERATE:
            BEGIN try
                IF <someCondi>
                    BEGIN
                        ...
                    END
                ELSE
                    BEGIN
                        ...
                    END
            END try
            BEGIN catch
                IF <someCondi>
                    BEGIN
                        ...
                    END
                if @LoopCount<=2
                begin
                    goto GENERATE    
                end
            END catch
    END

我已经转换了大多数存储过程部分,但是我需要其他部分的替换部分。不知道如何转换pgsql中的try catch以及GOTO的替代方法。请帮忙

解决方法

虽然 plpgsql 是一种块结构语言,但不需要在每个if条件或else条件上都开始Begin ... End。但是,它确实需要在If条件和End if之后终止THEN关键字。
如前所述,如果没有“ Try ... Catch”结构。基本上,每个语句都是隐式的“ try语句”,因为任何语句都可能引发异常。捕获部分由块末尾的EXCEPTION部分提供。整个块中的任何错误都将在此处捕获。我建议您花一些时间来使用documentation。以下似乎是您需要的结构。

declare                       -- assumed as not present in post                                                    
   loopcount integer := 1;    -- initial value my assumption                                                       
begin                         -- procedure (outer block)                                                           
    while loopcount <= 2      -- generate                                                                          
    loop                                                                                                           
                                                                                                                   
       begin                  -- nested block                                                                      
          if <somecondi>                                                                                           
          then                                                                                                     
             ...                                                                                                   
          else                                                                                                     
              if <somecondi>                                                                                       
              then                                                                                                 
                 ...                                                                                               
               else                                                                                                
                 ...                                                                                               
              end if;                                                                                              
          end if ;                                                                                                 
                                                                                                                   
       exception              -- catch                                                                             
          when others then                                                                                         
               if <somecondi>                                                                                      
               then                                                                                                
                ...                                                                                                
               end if;                                                                                             
       end;                   -- nested block                                                                      
                                                                                                                   
    end loop;                 --  generate                                                                         
end ;                         --  procedure (outer block)