2016-03-04 509 views
0

我做了一个简单的自定义类型:如何在PostgreSQL中将自定义类型的多维数组作为函数参数传递?

CREATE TYPE public."FriendDetails" AS 
    ("Email" character varying, 
    "Name" character varying); 
ALTER TYPE public."FriendDetails" 
    OWNER TO postgres; 

要在下面的函数被使用(它只是返回一个字符串 - contact!):

CREATE OR REPLACE FUNCTION public."addFriend"(
    "GroupName" character varying, 
    friends "FriendDetails"[]) 
    RETURNS character varying AS 
$BODY$BEGIN 
    RETURN "contact!"; 
END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION public."addFriend"(character varying, "FriendDetails"[]) 
    OWNER TO postgres; 

使用pgAdminIII生成上面的代码。

我试过如下进行查询:

select addFriend('Champs',ARRAY[['qwe','asd'],['zxc','rty']]::public."FriendDetails"[]); 

而且得到了一个错误:

ERROR: malformed record literal: "qwe" 
LINE 1: select addFriend('Champs',ARRAY[['qwe','asd'],['zxc','rty']]... 
             ^
DETAIL: Missing left parenthesis. 
********** Error ********** 

ERROR: malformed record literal: "qwe" 
SQL state: 22P02 
Detail: Missing left parenthesis. 
Character: 34 

我试图取代花括号({}),并且失去了ARRAY,但似乎没有任何工作 - 他们会导致语法错误。

有人可以通过使用(1)大括号和(2)通过使用ARRAY构造函数,来示范应该如何调用此方法的语法。

+1

[综合Value Input](http://www.postgresql.org/docs/9.5/static/rowtypes.html#AEN8006) – Abelisto

回答

1

有代码中的错误:

Use round brackets for row/record types constants

ARRAY[('qwe','asd'),('zxc','rty')] 

添加双引号的功能名称:

select "addFriend"('Champs',ARRAY[('qwe','asd'),('zxc','rty')]::public."FriendDetails"[]); 

字符串常量使用singlequotes:

RETURN 'contact!'; 
+0

谢谢。这是一个真正的帮助。我也明白,我们可以在不使用'ARRAY'语法的情况下编写相同的代码。只使用'{}'。你能告诉我如何? – Vineet

+1

@Vineet'select“addFriend”('Champs','{“(qwe,asd)”,“(zxc,rty)”}');' - 最简单的方法。 – Abelisto

+0

再次感谢您。 :) – Vineet

相关问题