首页 > 解决方案 > 如何将“类型”作为输入参数传递给 Postgresql 中的 func

问题描述

期待 PostgreSQL 等效代码。请帮忙。将数据库从 SQL Server 迁移到 Postgresql 时出现问题。

SQL 服务器代码:

 CREATE TYPE [InactiveOwnDetails] AS TABLE
                                        (
                                            [EntType] [nvarchar](10) NULL,
                                            [EntName] [nvarchar](400) NULL,
                                        )
    
    CREATE PROCEDURE [dbo].[SP_GenerateInactiveOwnEmail]
    AS
        DECLARE @InactiveOwnDetails InactiveOwnDetails
            
      
        INSERT INTO InactiveOwnEmailActivity (Subject_Email)
        VALUES (
SELECT **Fn_GetInactivePpMailBodyContent**(@InactiveOwnDetails)
)

    CREATE FUNCTION [dbo].[**Fn_GetInactivePpMailBodyContent**]
        (@InactiveOwnDetails InactiveOwnDetails READONLY)
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
        SET @ResultString = '<p> Dear'+CAST(12 AS NVARCHAR)+', '
        RETURN @ResultString
    END

请帮忙!

标签: sql-servertypesdatabase-migrationpostgresql-9.5

解决方案


要回答直接问题,您可以将(记录)类型传递给函数:

CREATE TYPE inactive_own_details as (ent_type varchar(10), ent_name varchar(400));

您可以创建一个接收该类型并返回某些内容的函数:

CREATE FUNCTION fn_GetInactivePpMailBodyContent(p_details inactive_own_details)
  RETURNS text
AS
$$
  select concat('<p> Dear', p_details.ent_name, '</p>');
$$
language sql;

问题中的函数对我来说没有意义,因为它根本不使用传递的类型。

在该过程中,您可以像这样使用它:

CREATE PROCEDURE sp_generateinactiveownemail()
AS
$$
declare
  l_details inactive_own_details;
begin
  l_details := ('type', 'Arthur'); -- initialize the variable

  INSERT INTO inactiveownemailactivity (subject_email)
  VALUES (SELECT fn_getinactiveppmailbodycontent(l_details));
end;
$$
language plpgsql;

注意:create procedure需要 Postgres 11 或更高版本。您已使用 Postres 9.5 标记了您的问题 - 这将在大约 6 个月后被弃用。一个新的迁移项目绝对应该在 2020 年使用该版本。您应该迁移到 Postgres 12。


推荐阅读