【发布时间】: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 编写的存储过程中使用这个用其他语言编写的存储过程。
标签: stored-procedures amazon-redshift plpgsql