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