如何创建可传入表作为参数的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
相关产品推荐
相关产品推荐

