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

时间:2019-12-05 07:02:11

标签: stored-procedures amazon-redshift plpgsql

我的议程是存储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指向第一个参数)。 由于我对存储过程还很陌生,所以我无法找出确切的问题。

预先感谢。

1 个答案:

答案 0 :(得分: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