【问题标题】:VARIADIC parameter must be the last input parameterVARIADIC 参数必须是最后一个输入参数
【发布时间】:2013-10-16 23:59:18
【问题描述】:

如何创建两个 VARIADIC 参数。查看我的代码并纠正我。

CREATE OR REPLACE FUNCTION ip_source_test(text,text,date,date,VARIADIC int[],VARIADIC text[])
RETURNS TABLE (no_documents int, "Report By" text, "Report_By" text) AS 
$$
BEGIN
IF 'Source Member' = $1 THEN
RETURN QUERY SELECT.....
ELSEIF 'company' = $1 THEN
RETURN QUERY SELECT.....
ELSE
RAISE NOTICE 'Not Worked';
END IF;
RETURN;
END;
$$ LANGUAGE plpgsql;

Error: VARIADIC parameter must be the last input parameter.

在 SQL 代码中,我应该使用 6 个参数。请用示例代码更新我。

【问题讨论】:

  • 您希望如何调用此函数?能举个例子吗?
  • @RichardHuxton 我不确定,但我的例外是这样的select * from ip_source_test('Source Member','week','2012-09-01','2013-09-01',VARIADIC '{128,270}'::int[],VARIADIC '{AJ,alexandra}'::text[])
  • 从逻辑上讲,只能有一个可变参数,因为它引用了未知数量的附加参数。您可以以ip_source_test(a,b,c,d,e,f,g,h,i,j) 的形式调用该函数,其中ad 是前四个参数,其余的都集中在最后一个可变参数中。期望函数知道如何分配剩余的六个参数超出了它的心理能力。

标签: sql postgresql stored-procedures plpgsql


【解决方案1】:

每个函数只能有一个VARIADIC,因为可变参数包含所有调用者传递的其他参数。

如果你的意思是让调用者使用数组,那么无论如何使用可变参数是没有意义的,函数签名可能如下所示:

CREATE FUNCTION ip_source_test(text,text,date,date,int[], text[])

【讨论】:

  • VARIADIC 不包含所有个其他参数。在此之前可以有其他参数。
  • other 参数是指超出函数声明中指定参数的参数。我的理解是,我们的两个答案都在说同样的事情。
【解决方案2】:

正如错误信息告诉你的那样:

VARIADIC 参数必须是最后一个输入参数。

从逻辑上讲,函数只能将单个VARIADIC 参数作为最后一个参数之前可以有其他(非VARIADIC)参数。 Quoting the manual here:

实际上,所有实际参数等于或超出VARIADIC 位置被收集到一个一维数组中

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多