Stored procedures 红移存储过程-[Amazon](500310)无效操作:在“$1”处或附近出现语法错误;

Stored procedures 红移存储过程-[Amazon](500310)无效操作:在“$1”处或附近出现语法错误;,stored-procedures,amazon-redshift,plpgsql,Stored Procedures,Amazon Redshift,Plpgsql,我的任务是存储在参数中传递的两个表的计数,然后在比较这两个表之后再执行一些操作 问题- 存储过程抛出错误: 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(

我的任务是存储在参数中传递的两个表的计数,然后在比较这两个表之后再执行一些操作

问题-

存储过程抛出错误:

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
如果我注释掉实际_计数:=从实际_tablename中选择count*作为计数; 然后成功创建存储过程

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

提前谢谢

运行动态SQL时需要使用EXECUTE。在您的示例中,查询在括号中,但没有任何东西使其执行。要将查询执行到变量中,请使用into语法

请参阅GitHub repo Amazon Redshift Utils中的示例存储过程


有几个使用动态SQL的示例,例如

Thank@a_horse_with_no_name,Previous->actual_count:=从actual_tablename中选择count to actual_count;post_change->从实际_tablename中选择count to actual_count;虽然创建了该过程,但调用该过程时会出现相同的错误。不能将表名作为参数传递。您需要动态Sql嗯,有趣的是,上次我检查redshift不允许动态Sql查询@带有\u no\u名称的\u horse\u,然后将其存储在一个变量中,如-actual\u table\u name:=actual\u tablename;然后在该查询中替换这个值和这个变量也没有帮助。所以,我的问题是,改变plpgsql的语言在这方面对我有帮助吗?如果会,那么会有任何问题兼容性,如果我在另一个用plpgsql编写的存储过程中使用用其他语言编写的存储过程。
sql := 'SELECT …'
EXECUTE sql_var INTO result_var;