在Redshift返回错误的存储过程中传递变量

Posted

技术标签:

【中文标题】在Redshift返回错误的存储过程中传递变量【英文标题】:Passing variable inside stored procedure in Redshift returning error 【发布时间】:2021-11-02 20:28:38 【问题描述】:

我有这个可以成功编译的存储过程,但是在调用该过程时,我得到一个错误:

亚马逊无效操作:“$1”或附近的语法错误

你能帮我理解什么是错的吗?提前谢谢你。

 CREATE OR REPLACE PROCEDURE SchemaName.Testing_Passing_Parameter_in_SP ()
 LANGUAGE plpgsql 
 AS   
 $$ 
  
  DECLARE 
  FirstDayofWeek VARCHAR(50); 
  Unload_Query VARCHAR(65000); 

  BEGIN 

WITH CTE_FirstDayOfWeek AS (SELECT TO_CHAR(DATE_TRUNC('WEEK', GETDATE()), 'MMDDYYYY') AS FirstDayOfWeek) 
SELECT FirstDayOfWeek INTO FirstDayofWeek FROM CTE_FirstDayOfWeek; 

  Unload_Query := ' UNLOAD (''' || 'SELECT  *
                                   FROM SchemaName.TableName '
                                ||             
                           ''') 
                   TO  '''||'s3://BucketName/FolderName/Sample_File_'||FirstDayofWeek||'.csv'||''' 
                   CREDENTIALS ''' ||'aws_access_key_id=xxx'||';'||'aws_secret_access_key=xxx'||  '''
                   Header
                   ALLOWOVERWRITE
                   delimiter '''||','||'''
                   addquotes
                   PARALLEL OFF          
                          ';
  EXECUTE Unload_Query;

 END; 
 $$;

CALL SchemaName.Testing_Passing_Parameter_in_SP ();

【问题讨论】:

【参考方案1】:

Redshift 基于非常古老的 Postgres,其中不检测 PL/pgSQL 变量和 SQL 标识符之间的冲突。变量FirstDayofWeek 与列FirstDayofWeek 同名。一般的解决方案是为 PL/pgSQL 变量使用前缀 _

DECLARE 
  _FirstDayofWeek VARCHAR(50); 
  _Unload_Query VARCHAR(65000); 

【讨论】:

非常感谢帕维尔。有效!!我是 Postgres 的新手,所以这很有帮助。

以上是关于在Redshift返回错误的存储过程中传递变量的主要内容,如果未能解决你的问题,请参考以下文章

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

我可以在redshift的存储过程中有表变量吗?

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

将函数返回值传递给存储过程参数

我可以在 Redshift 上的存储过程中将两个查询连接在一起吗?

Redshift中的存储过程将数据加载到表中