我们应该在 Redshift 的存储过程中使用 udf

Posted

技术标签:

【中文标题】我们应该在 Redshift 的存储过程中使用 udf【英文标题】:Shall we use udf in stored procedure in Redshift 【发布时间】:2021-02-13 23:02:46 【问题描述】:

我需要在存储过程中使用 udf。由于 Redshift 需要临时表或游标才能在存储过程中使用 select 语句,所以我选择使用临时表。在存储过程中,调用 udf 的代码如下所示:

EXECUTE '如果存在则删除表' || tmp_name; EXECUTE '创建临时表' || tmp_name || ' as select f_MSG_log(' || i_trn_id,i_trm_msg_type_cd,i_trm_key_cd,i_trm_obj_cd,i_trm_msg_txt,i_log_level_opt,i_trm_file_nm_opt || ');';

当我调用存储过程时,它会抛出一个错误说: 亚马逊无效操作:查询“SELECT 'create temp table ' || $1 || ' as select f_MSG_log(' || $2 , $3 , $4 , $5 , $6 , $7 , $8 || ');'”返回 7 列; 1 条语句失败。

【问题讨论】:

【参考方案1】:

我找到了答案:

EXECUTE '如果存在则删除表' || tmp_name; EXECUTE '创建临时表' || tmp_name || ' as select toolbox.f_MSG_log(' || i_trn_id || ',' || quote_literal(i_trm_msg_type_cd) || ',' || quote_literal(var_trm_key_cd) || ',' ||报价文字(var_trm_obj_cd)|| ',' ||报价文字(var_trm_msg_txt)|| ',' || i_log_level_opt || ',' ||报价文字(var_trm_file_nm_opt)|| ');';

【讨论】:

以上是关于我们应该在 Redshift 的存储过程中使用 udf的主要内容,如果未能解决你的问题,请参考以下文章

没有函数或存储过程的 Amazon RedShift 中的 Upsert

如何使用自动化或命令行工具管理 AWS Redshift 中的存储过程?

如何在 Redshift 中的 select 语句中使用存储过程

无法在redshift中的存储过程中传递参数

如何使用存储过程在 redshift 上创建 10000 个表?

Amazon redshift 存储过程,CONTINUE 不能在循环外使用;