问题描述
我有一个用于删除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,)
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;