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

Posted

技术标签:

【中文标题】无法在redshift中的存储过程中传递参数【英文标题】:Cannot pass parameter inside stored procedure in redshift 【发布时间】:2019-08-12 13:44:05 【问题描述】:

我已经编写了在选择查询中调用参数的过程,但它不起作用。当我打印该参数时,它工作正常,但使用选择查询时,它不起作用。

我已经使用 Aginity 工作台 for redshift 来执行存储过程。

CREATE or replace PROCEDURE get_tbl_name(IN tablename varchar, IN columnname VARCHAR, IN mindate varchar) AS $$
Declare
evalmindate varchar;
BEGIN
Raise info 'tablename = %, columnname = %, mindate = %', tablename,columnname,mindate;
if mindate is null then
select min(columnname) into evalmindate from tablename;
else
evalmindate=mindate;
end if;
END;
$$ LANGUAGE plpgsql;

Calling Proc:
call get_tbl_name('test_bq', 'date',NULL);

Output:
tablename = test_bq, columnname = date, mindate = <NULL>
Error Message
42601: syntax error at or near "$2"

从输出中,我们可以在打印时看到过程中的参数,但我无法将参数传递给选择查询,它会引发错误。请帮我解决这个问题。

【问题讨论】:

select min(columnname) into evalmindate from tablename; 开头是不正确的,您没有使用变量,实际上您是在尝试在名为tablename 的表中查询columnname @mdem7 即使我将参数传递给变量并将变量传递给选择查询,它也不起作用。得到同样的错误。 【参考方案1】:

您不能在存储过程查询中直接将变量用作列名或表名。相反,您需要编写一个查询字符串并执行它。

此外,INTO var 语法需要在普通查询中排在第一位,在EXECUTE最后

你有:

select min(columnname) into evalmindate from tablename;

试试这个:

EXECUTE 'select min('|| columnname ||') from '|| tablename ||';' INTO evalmindate;

【讨论】:

以上是关于无法在redshift中的存储过程中传递参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redshift 中的 select 语句中使用存储过程

在Redshift返回错误的存储过程中传递变量

VBA的有参过程定义,形参用啥说明

将文本框从“表单”传递到存储过程会导致错误

使用 map 函数将数组中的值传递给 redshift 参数化查询

Lambda - 存储/传递 Redshift 连接