如何将自定义类型数组传递给 Postgres 函数

Posted

技术标签:

【中文标题】如何将自定义类型数组传递给 Postgres 函数【英文标题】:How to pass custom type array to Postgres function 【发布时间】:2012-08-14 03:21:40 【问题描述】:

我有一个自定义类型

CREATE TYPE mytype as (id uuid, amount numeric(13,4));

我想将它传递给具有以下签名的函数:

CREATE FUNCTION myschema.myfunction(id uuid, mytypes mytype[])
  RETURNS BOOLEAN AS...

如何在 postgres 查询中调用它,并且不可避免地从 php 中调用它?

【问题讨论】:

选择 myschema.myfunc('0d6311cc-0d74-4a32-8cf9-87835651e1ee' , ARRAY[('ac747f0e-93d4-43a9-bc5b-09df06593239', '25.00') , (e'6449fb3b-4 -440e-8973-31eb6bbefc81', '10.00')]::mytype[] );不过还是需要php! 【参考方案1】:

您可以使用带有array literal 的替代语法来代替数组构造函数,这是一个类似 Postgres 函数的构造,当您需要传递 时可能会导致麻烦 - 就像在准备好的声明:

SELECT myschema.myfunc('0d6311cc-0d74-4a32-8cf9-87835651e1ee'
                  , '"(0d6311cc-0d74-4a32-8cf9-87835651e1ee, 25)"
                    , "(6449fb3b-844e-440e-8973-31eb6bbefc81, 10)"'::mytype[]);

我在数组中的两种行类型之间添加了一个换行符以进行显示。这是合法的。

如何为 any 文字找到正确的语法?

问问 Postgres。这是一个演示:

CREATE TABLE mytype (id uuid, amount numeric(13,4));

INSERT INTO mytype VALUES
  ('0d6311cc-0d74-4a32-8cf9-87835651e1ee', 25)
 ,('6449fb3b-844e-440e-8973-31eb6bbefc81', 10);

SELECT ARRAY(SELECT m FROM mytype m);

返回:

"(0d6311cc-0d74-4a32-8cf9-87835651e1ee,25.0000)","(6449fb3b-844e-440e-8973-31eb6bbefc81,10.0000)"

db小提琴here

任何表(包括临时表)都会隐式创建同名的行类型。

【讨论】:

这真是天才。非常有帮助。非常感谢!【参考方案2】:
select myschema.myfunc('0d6311cc-0d74-4a32-8cf9-87835651e1ee'
                , ARRAY[('ac747f0e-93d4-43a9-bc5b-09df06593239', '25.00')
                              , ('6449fb3b-844e-440e-8973-31eb6bbefc81', '10.00')]::mytype[]
    );

仍然需要解决这个问题的 PHP 部分,仍然不确定如何调用填充自定义数组参数的函数。

【讨论】:

以上是关于如何将自定义类型数组传递给 Postgres 函数的主要内容,如果未能解决你的问题,请参考以下文章

尝试将自定义 C++ 矩阵传递给 numpy 数组

如何将自定义道具传递给 QueryRenderer 渲染函数?

如何将自定义验证消息传递给 laravel 中的 cviebrock/image-validator?

将自定义类型传递给 Oracle 过程

如何在postgres的函数中传递数组并修改它

将数组从 node-postgres 传递给 plpgsql 函数