如何在BigQuery存储过程中向ARRAY<STRING>列插入数据
修复BigQuery存储过程中数组参数拼接错误
错误核心原因:直接使用||运算符拼接字符串与数组类型,BigQuery仅支持同类型(字符串/字节/数组)间的拼接操作,跨类型拼接会触发签名不匹配错误。同时原代码的手动字符串拼接方式存在SQL注入风险,且未正确处理filename为NULL的场景。
修复后的存储过程代码:
CREATE OR REPLACE PROCEDURE `##.history`(Job_ID STRING, filename ARRAY<STRING>, Status STRING) BEGIN EXECUTE IMMEDIATE FORMAT(""" INSERT INTO `##.tablename` (JOB_ID, FILENAME, STATUS) VALUES ('%s', %t, '%s') """, Job_ID, filename, Status); END;
关键说明:
%s:处理字符串类型参数,自动添加单引号并转义特殊字符,规避SQL注入风险。%t:处理数组类型参数,自动将数组格式化为BigQuery可识别的数组字面量(如['f1.txt','f2.txt']);当filename为NULL时,会直接生成NULL值,无需额外处理。- 彻底移除手动字符串拼接逻辑,避免跨类型拼接的错误。
测试验证:
调用存储过程时,传递数组或NULL值均可正常执行:
-- 传递数组参数 CALL `###.history`('text1', ['f1.txt','f2.txt'], 'start'); -- 传递NULL参数 CALL `###.history`('text2', NULL, 'end');
内容的提问来源于stack exchange,提问作者Mudgal
相关产品推荐
相关产品推荐

