没有参数的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
参数,只能inout
;
into 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过程和参数中的动态表名的主要内容,如果未能解决你的问题,请参考以下文章