【问题标题】:Pass multidimensional array as parameter to Postgresql function将多维数组作为参数传递给 Postgresql 函数
【发布时间】:2013-09-13 11:40:28
【问题描述】:

我正在尝试使用 PostgreSQL 数据库维护一个 Php 应用程序。在某一时刻,一个存储过程被调用,比如说function_x,在function_x内部,function_y被调用; function_y被传递了一个名为parameter_1的变量,parameter_1的定义为:

parameter_1 numeric[][3] := {};

我正在尝试直接在命令行(或 pgadmin)上执行 select function_y,但在将空数组传递给函数时遇到问题。根据docs,您必须使用variadic,但我尝试了:

select function_y(581, 'CPN-00000000001-0000', 'TPN-00000000001-0001', 100, 2013, variadic arr := array[]);

但是我收到了这个错误:

ERROR:  cannot determine type of empty array

我尝试了不同的方法,但没有任何效果。如何在查询中将多维数组作为参数传递?

【问题讨论】:

  • 添加php标签是明智的。
  • 我不知道...问题上没有 php...

标签: arrays postgresql plpgsql variadic-functions


【解决方案1】:

1) 您可以,但您不必VARIADIC parameters 用于数组变量。不过,您必须在函数声明中使用它,而不是在调用中。

2) Postgres 数组变量忽略定义中的维度。我引用the manual here

当前的实现不强制声明的数量 尺寸。特定元素类型的数组都是 被认为是同一类型,无论大小或数量 方面。因此,在中声明数组大小或维数 CREATE TABLE 只是文档;它不会影响运行时行为。

3) 这是无效的语法:

<strike>parameter_1 numeric[][3] := {};</strike>

需要单引号:

parameter_1 numeric[][3] := '{}';

实际上是一样的

parameter_1 numeric[] := '{}';

更多细节、代码示例和链接在这个密切相关的答案中:
Return rows matching elements of input array in plpgsql function

【讨论】:

  • 使用array[...] 避免字符串版本('{...}')可能导致的所有引用废话通常不是更好吗?
  • @muistooshort:这取决于。如果单引号可以是文字的一部分,则可以改用美元引号。或使用quote_literal()。在 had 的情况下,对于空数组,我给出的答案应该是最简单的。
猜你喜欢
  • 1970-01-01
  • 2012-01-22
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多