sql-server - 如何将“类型”作为输入参数传递给 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
请帮忙!
解决方案
要回答直接问题,您可以将(记录)类型传递给函数:
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。
推荐阅读
- nginx - nginx 代理通行证不适用于 docker 容器
- css - 如何使最后一行占据容器的剩余高度?
- uwp - 如何将调试选项设置为“Step into Specific”?
- java - 版本或其他内容的 Java/Gradle 错误
- javascript - 即使设置了项目,调用时反应 useState 项目似乎是空的
- javascript - Map 函数不返回 React JSX 中的项目
- javascript - 如何在 MongoDB 中过滤子文档?
- sql-server - 从不同的服务器查询地理数据类型
- c# - 我在 c#/UWP 中需要我的域控制器的唯一标识符
- c++ - 尝试使用 clang++ v12 将两个 C++20 模块一起构建为一个模块