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

时间:2012-08-17 16:45:55

标签: php sql postgresql postgresql-9.1 plpgsql

我有自定义类型

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

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

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

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

2 个答案:

答案 0 :(得分:6)

您可以使用替代语法与string literal而不是数组构造函数,这是一个类似Postgres函数的构造,当您需要传递时可能会造成麻烦 - 例如准备好的声明:

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

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

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

这是一个演示:

CREATE TEMP 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)"}

可能需要注意的是,任何表(包括临时表)都会隐式创建一个同名的行类型。

答案 1 :(得分:0)

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部分,但仍不确定如何调用使用自定义数组参数填充的函数。