You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:40:36