Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;

Posted

技术标签:

【中文标题】Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;【英文标题】:Redshift Stored Procedure - [Amazon](500310) Invalid operation: syntax error at or near "$1"; 【发布时间】:2019-12-05 07:02:11 【问题描述】:

我的议程是存储 2 个表的计数(在参数中传递),然后在比较两者时执行更多操作。

问题 -

存储过程抛出错误:

CREATE OR REPLACE PROCEDURE dev.gp_count_matching_20191204(actual_tablename character varying(256), bkp_tablename character varying(256))
 LANGUAGE plpgsql
AS $$
DECLARE
actual_table_name varchar(256);
backup_table_name varchar(256);
actual_count_query varchar(1024);
actual_count int;
backup_count_query varchar(1024);
backup_count int;
BEGIN
call dev.gp_test_error_handling_tablename_format(actual_tablename);
call dev.gp_test_error_handling_tablename_format(bkp_tablename);

actual_count:=(select count(*) as counts from actual_tablename);
--raise info 'Actual Table Name - %, Actual Table Count - %',actual_tablename,actual_count;
end;
$$

这会在创建存储过程时引发以下错误-

An error occurred when executing the SQL command:
CREATE OR REPLACE PROCEDURE dev.gp_count_matching_20191204(actual_tablename character varying(256), bkp_tablename character varying(256))
 LANGUAGE pl...

[Amazon](500310) Invalid operation: syntax error at or near "$1";
1 statement failed.

Execution time: 0.99s

如果我注释掉 actual_count:=(select count(*) as counts from actual_tablename); 然后存储过程成功创建。

我想这与我在查询中使用参数(因为 $1 指向第一个参数)有关。 由于我对存储过程很陌生,所以我无法找出确切的问题。

提前致谢。

【问题讨论】:

感谢@a_horse_with_no_name,Previous -> actual_count:=(select count() into actual_count from actual_tablename); post_change -> select count() into actual_count from actual_tablename;虽然创建了程序,但是当我调用程序时出现了同样的错误。 您不能将表名作为参数传递。您需要动态 SQL 嗯,有趣,上次我检查 redshift 不允许动态 Sql 查询。 @a_horse_with_no_name,然后将其存储在变量中,例如 - actual_table_name:=actual_tablename;然后在那个查询中用这个变量替换这个值也没有帮助。所以,我的问题是,从 plpgsql 更改语言对我有帮助吗?如果是这样,那么是否会有任何问题(兼容性),如果我在另一个用 plpgsql 编写的存储过程中使用这个用其他语言编写的存储过程。 【参考方案1】:

运行动态 SQL 时需要使用EXECUTE。在您的示例中,查询在括号中,但没有使其执行。要对变量执行查询,请使用 INTO 语法

sql := 'SELECT …'
EXECUTE sql_var INTO result_var;

请参阅我们的 GitHub 存储库“Amazon Redshift Utils”中的示例存储过程。 https://github.com/awslabs/amazon-redshift-utils/tree/master/src/StoredProcedures

有几个使用动态SQL的例子,比如https://github.com/awslabs/amazon-redshift-utils/blob/master/src/StoredProcedures/sp_split_table_by_range.sql

【讨论】:

【参考方案2】:

您也可以使用下面给出的语法:

SELECT INTO Count count(*) from table_name;

通过这样做,您将count(*) 的值插入到变量Count 中。它有效。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 请在您的答案中添加一些解释,以便其他人可以从中学习

以上是关于Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;的主要内容,如果未能解决你的问题,请参考以下文章

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

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

无法使用 refcursor 调用 Redshift 存储过程

Amazon Redshift 是不是有自己的存储后端

Amazon Redshift 框架(Oracle 数据仓库迁移)

无法在 Redshift Aginity 和 aginity pro 中创建存储过程