【问题标题】:Convert SQL Server stored procedure to PostgreSQL function将 SQL Server 存储过程转换为 PostgreSQL 函数
【发布时间】:2020-09-02 14:52:40
【问题描述】:

我是 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 的替代方法。请帮忙

【问题讨论】:

  • "不知道如何在 pgsq 中转换 try catch" - PostgreSQL 手册中的Trapping Errors
  • @a_horse_with_no_name 我看到了 Trapping 错误,但问题是在这种情况下不知道如何使用它
  • 如果您不了解两种语言或方言,则无法将代码从一种语言或方言转换为另一种。在这种情况下,语法非常相似 - 不是 BEGIN TRY,而是 BEGIN。而不是BEGIN CATCH,例外

标签: sql-server postgresql stored-procedures plpgsql


【解决方案1】:

虽然 plpgsql 是一种块结构语言,但它不需要 Begin...End 在每个 if 条件或 else 上。但是,它确实需要在 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)

                                                        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2013-10-10
    • 1970-01-01
    • 2020-06-06
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多