没有参数的redshift过程和参数中的动态表名

Posted

技术标签:

【中文标题】没有参数的redshift过程和参数中的动态表名【英文标题】:redshift procedure with out parameter and dynamic table name as in parameter 【发布时间】:2021-03-16 20:02:48 【问题描述】:

我正在尝试制作一个红移程序,该程序将在任何表上提供输出,例如行数。但我不知道你应该如何动态地传递表名并获得输出。我正在尝试做这样的事情:

CREATE OR REPLACE PROCEDURE my_schea.test(t in varchar, o out varchar)

LANGUAGE plpgsql

AS $$

BEGIN
 execute 'SELECT count(*) into ' || o || ' FROM ' || t || ';';
               -- or something more complicated

END
 
$$
;

然后我这样调用:

call my_schema.test('myschema.mytable');

我似乎无法获得正确的语法,任何帮助将不胜感激。 上面这个特定的语法给了我一个错误:

 cannot EXECUTE a null query string;

【问题讨论】:

【参考方案1】:

有一些事情需要改变。

out o varchar 无效;过程中不允许out参数,只能inoutinto o 在动态 sql 中不起作用,因为它不会“看到”局部变量。见execute。

所以程序样本变成了-

CREATE OR REPLACE PROCEDURE my_schema.test(in t text, inout o bigint default null)
 as
$$
begin
   execute ('SELECT count(*) FROM '||t) into o; -- NB *** SQLi prone ***
   -- or something more complicated
end;
$$ language plpgsql;

那你就可以了

call my_schema.test('myschema.mytable');

它会产生类似于select 语句的结果。 我假设您有充分的理由编写过程而不是函数,因为该示例看起来非常相似。作为一个函数,示例如下所示:

create or replace function my_schema.testf(t text) returns bigint
 as
$$
declare 
   retval bigint;
begin
   execute ('SELECT count(*) FROM '||t) into retval; -- NB *** SQLi prone ***
   -- or something more complicated
   return retval;
end;
$$ language plpgsql;

然后

select my_schema.testf('myschema.mytable');

【讨论】:

您好,感谢您回答这个问题。我已经试过了,还有两件事。首先,我认为您不能在 plpgsql 中编写 Redshift 函数,请参阅:docs.aws.amazon.com/redshift/latest/dg/r_CREATE_FUNCTION.html。其次,我也无法让存储过程创建查询运行。我收到“默认”错误,但即使我删除了default null,我仍然得到syntax error at or near 。所以有些东西没有被正确引用 嗯,这些是工作过程和功能,但在 Postgresql 中。恐怕我对 Redshift 方言帮不上什么忙。但请尝试o out bigint 或整数,无默认值。我看到语法有点不同。

以上是关于没有参数的redshift过程和参数中的动态表名的主要内容,如果未能解决你的问题,请参考以下文章

表名的 Redshift UDF?

mysql 存储过程 动态表名

如何在 Redshift 过程中写入动态创建的表

存储过程中为空时处理动态参数

无法在redshift中的存储过程中传递参数

redshift/postgresql 中的 regexp_count 不支持设置模式值的动态参数