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

如何创建可传入表作为参数的BigQuery存储过程?解决PostgreSQL函数迁移的类型错误问题

解决BigQuery存储过程传入表行类型参数的问题

BigQuery和PostgreSQL在处理自定义行/表类型参数的方式上有明显差异——BigQuery不支持直接将表的行类型(比如你代码里的mt)作为存储过程的参数类型,这就是你遇到「Type not found: mt」错误的核心原因。下面给你两种可行的解决方案:

方案1:传入单独字段参数(最直接高效)

既然你的存储过程只用到了原表的p、q_l、q、m_c、d_f这几个字段,最简单的方式就是把这些字段作为独立参数传入,不需要传递整行数据。

修改后的存储过程代码如下:

CREATE PROCEDURE my_schema.my_function(
  IN p numeric,
  IN q_l numeric,
  IN q numeric,
  IN m_c numeric,
  IN d_f numeric,
  OUT e_p_l numeric,
  OUT e_p numeric
)
BEGIN
  SET e_p_l = e_p_procedure(p, q_l, m_c, d_f);
  SET e_p = e_p_procedure(p, q, m_c, d_f);
END;

调用的时候,直接从目标表中取出对应字段传入即可,示例如下:

CALL my_schema.my_function(
  (SELECT p FROM your_target_table WHERE id = 1),
  (SELECT q_l FROM your_target_table WHERE id = 1),
  (SELECT q FROM your_target_table WHERE id = 1),
  (SELECT m_c FROM your_target_table WHERE id = 1),
  (SELECT d_f FROM your_target_table WHERE id = 1),
  @e_p_l,
  @e_p
);

方案2:使用STRUCT类型传递整行数据

如果你后续可能需要用到表中更多字段,或者更倾向于传递整行数据的结构,可以用BigQuery的STRUCT类型来模拟行类型。

步骤1:定义匹配表结构的STRUCT类型

假设你的my_table结构为p numeric, q_l numeric, q numeric, m_c numeric, d_f numeric,先创建对应的STRUCT类型:

CREATE TYPE my_schema.my_table_struct AS STRUCT(
  p numeric,
  q_l numeric,
  q numeric,
  m_c numeric,
  d_f numeric
);

步骤2:创建接收STRUCT参数的存储过程

CREATE PROCEDURE my_schema.my_function(
  IN mt my_schema.my_table_struct,
  OUT e_p_l numeric,
  OUT e_p numeric
)
BEGIN
  SET e_p_l = e_p_procedure(mt.p, mt.q_l, mt.m_c, mt.d_f);
  SET e_p = e_p_procedure(mt.p, mt.q, mt.m_c, mt.d_f);
END;

步骤3:调用存储过程时传入STRUCT

可以直接从表中构造STRUCT传入:

DECLARE row_struct my_schema.my_table_struct;
SET row_struct = (SELECT AS STRUCT p, q_l, q, m_c, d_f FROM your_target_table WHERE id = 1);
CALL my_schema.my_function(row_struct, @e_p_l, @e_p);

两种方案里,方案1更轻量,完全适配你当前的需求;方案2更灵活,适合需要处理整行数据的扩展场景,你可以根据自己的实际情况选择。

内容的提问来源于stack exchange,提问作者Mark McGown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:17:28