从SQL Server迁移至PostgreSQL:如何实现继承已有类型的表变量?
PostgreSQL中实现SQL Server表值参数的方案
SQL Server里的表值参数(Table-Valued Parameter)在PostgreSQL中可以通过两种方式实现,结合你的场景给出具体操作:
1. 自定义复合类型 + 数组参数(推荐)
先创建对应SQL Server表类型的复合类型,再通过数组传递批量数据,在存储过程中展开为表结构使用。
步骤1:创建复合类型
对应你定义的[dbo].[TipoPlanilla1],在PostgreSQL中创建复合类型:
CREATE TYPE public.tipo_planilla1 AS ( cuenta_deposito bigint, codigo_oyd numeric(18,0), especie varchar(150), isin varchar(50), emision numeric(18,0), valor_trasladar numeric(18,0) );
步骤2:创建接受数组参数的存储过程
将原SQL Server存储过程改为接受复合类型数组,用unnest()函数将数组展开为表:
CREATE OR REPLACE PROCEDURE public.cambiodedepositante_tidis_certs( p_client varchar(50), p_email varchar(50), p_planilla1 tipo_planilla1[] ) LANGUAGE plpgsql AS $$ BEGIN -- 示例:展开数组并查询数据 SELECT * FROM unnest(p_planilla1) AS planilla; -- 后续业务逻辑示例:将数据插入目标表 -- INSERT INTO target_table (cuenta_deposito, codigo_oyd, ...) -- SELECT cuenta_deposito, codigo_oyd, ... FROM unnest(p_planilla1); END; $$;
步骤3:调用存储过程
构造复合类型数组作为参数传入:
CALL public.cambiodedepositante_tidis_certs( '示例客户', 'client@example.com', ARRAY[ (123456, 789, '示例品种', 'ISIN001', 100, 5000)::tipo_planilla1, (654321, 987, '另一品种', 'ISIN002', 200, 10000)::tipo_planilla1 ] );
2. 使用临时表(贴近SQL Server使用习惯)
如果更习惯SQL Server中直接传递表的方式,可以通过临时表传递批量数据:
步骤1:调用前创建并填充临时表
CREATE TEMP TABLE temp_planilla1 ( cuenta_deposito bigint, codigo_oyd numeric(18,0), especie varchar(150), isin varchar(50), emision numeric(18,0), valor_trasladar numeric(18,0) ); INSERT INTO temp_planilla1 VALUES (123456, 789, '示例品种', 'ISIN001', 100, 5000), (654321, 987, '另一品种', 'ISIN002', 200, 10000);
步骤2:创建读取临时表的存储过程
存储过程中直接读取临时表数据,无需额外表参数:
CREATE OR REPLACE PROCEDURE public.cambiodedepositante_tidis_certs( p_client varchar(50), p_email varchar(50) ) LANGUAGE plpgsql AS $$ BEGIN -- 直接读取临时表数据 SELECT * FROM temp_planilla1; -- 业务逻辑处理 END; $$;
步骤3:调用存储过程
CALL public.cambiodedepositante_tidis_certs('示例客户', 'client@example.com');
两种方案对比
- 复合类型数组:适合数据量不大的场景,参数传递更直接,无需提前创建临时表。
- 临时表:适合大数据量场景,使用方式更贴近SQL Server的表值参数,避免数组长度限制。
内容的提问来源于stack exchange,提问作者Noobmaster
相关产品推荐
相关产品推荐

