表格类型的删除操作的PostgreSQL代码

问题描述

我有一个用于删除MSsql中的表类型的代码。必须转换为PGsql才会出错。 期待从用户定义的表类型中删除的PGsql代码: 下面的MSsql代码

declare @Entity TRef_StructureTree readonly //input parameter from procedure
DELETE Tef_StructureTree 
FROM Tef_StructureTree
inner join (select * from @Entity) as source
on Tef_StructureTree.ChildCodeBDR=source.ChildCodeBDR AND 
Tef_StructureTree.ChildScheme=source.ChildScheme;

下面是USer定义的表类型的定义:

CREATE TYPE [dbo].[Tef_StructureTree] AS TABLE(
    [ChildCodeBDR] [numeric](10,0) NOT NULL,[ChildScheme] [nvarchar](100) NOT NULL,)

在PGsql代码以下:

CREATE OR REPLACE FUNCTION Updatestructree(v_entity Tef_StructureTree[])
 as 
begin
    DELETE FROM v_entity   
        where v_entity."ChildCodeBDR" in(select "source"."ChildCodeBDR" from  unnest(v_entity)  as "source" )
        and v_entity."ChildScheme" in (select "source"."ChildScheme"  from  unnest(v_entity)  as "source" );
 end;

错误:关系“ v_entity”不存在 请提供等效的内容来帮助您!

解决方法

您的参数称为v_entitydata而不是v_entity,因此您需要更改参数名称或对其的引用。您可能要从表Tef_StructureTree中删除,而不要从传递的数组中删除。

您的函数结构对于Postgres也不有效,因为函数主体需要以字符串形式提供,例如使用dollar quoting

您也可以只使用一个子查询来简化条件。

因此,将所有内容放在一起,函数应如下所示:

CREATE OR REPLACE FUNCTION UpdateStrucTree(v_entity "Tef_StructureTree"[])
as 
$$
  DELETE FROM "Tef_StructureTree"
  where ("ChildCodeBDR","ChildScheme") in (select "ChildCodeBDR","ChildScheme"
                                            from unnest(v_entity) )
$$
language sql;