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 存储过程