在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 中的 select 语句中使用存储过程