将complexe TSQL过程转换为Postgresql

时间:2017-07-17 14:06:38

标签: postgresql function stored-procedures plpgsql

我必须将我的数据库从TSQL移到PostgreSQL,我对postgres很新,我没有找到如何将这个存储过程转换为postgres中的函数

这是我的TSQL存储过程(我尽可能地简化)

具有2列类型(decimal,varchar)的行的预期返回列表

CREATE PROCEDURE dbo.procSelectOpenDocument(
@ItemType_id decimal(38)
)
AS
IF @ItemType_id = 1
BEGIN
 SELECT d.ID, d.OrderNumber
 FROM dbo.Table1 d
END

IF @ItemType_id = 2
BEGIN
 SELECT d.ID, d.OrderNumber2
 FROM dbo.Table2 d
END

我的问题?

如果您在TSQL中执行此操作

execute dbo.procSelectOpenDocument(1)

结果

ID | OrderNumber
1  | Some String value

execute dbo.procSelectOpenDocument(2)

结果

ID | OrderNumber2
1  | Some String value

至于您可以看到,列名称列表根据参数而变化。

但这不起作用!!!!

CREATE OR REPLACE FUNCTION dbo.procSelectOpenDocument(IN p_ItemType_id bigint)
 RETURNS TABLE
(
   ID bigint
  ,Name varchar(150)
)
LANGUAGE 'plpgsql' 
AS $function$ 
begin

 if p_ItemType_id = 1 then

     RETURN QUERY SELECT d.ID, d.OrderNumber    FROM dbo.Table1 d;


  end if;


  if p_ItemType_id = 2 then
       RETURN QUERY SELECT d.ID, d.OrderNumber2 FROM dbo.Table2 d;
  end if;

  end
  $function$; 

1 个答案:

答案 0 :(得分:0)

与你不同意第二个查询的列名?

IF @ItemType_id = 2    
    BEGIN
     SELECT d.ID, d.OrderNumber2 as OrderNumber
     FROM dbo.Table2 d
    END

评论后编辑

IF @ItemType_id = 1
BEGIN
 SELECT d.ID, d.OrderNumber, null as OrderNumber2
 FROM dbo.Table1 d
END

IF @ItemType_id = 2
BEGIN
 SELECT d.ID, null as OrderNumber, d.OrderNumber2
 FROM dbo.Table2 d
END