Postgresql PL/Proxy在存储过程调用时返回不支持的类型

Postgresql PL/Proxy在存储过程调用时返回不支持的类型,postgresql,plpgsql,Postgresql,Plpgsql,我在PL/Proxy中设置了一个存储过程来进行查询,并接收一些记录 在PL/代理中: CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint) RETURNS SETOF RECORD AS $$ CLUSTER 'autocompletecluster'; RUN ON i_id; $$ LANGUAGE plproxy; 在每个分区中: CREATE OR REPLACE FUNCTION quer

我在PL/Proxy中设置了一个存储过程来进行查询,并接收一些记录

在PL/代理中:

CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint)
RETURNS SETOF RECORD AS $$
    CLUSTER 'autocompletecluster';
    RUN ON i_id;
$$ LANGUAGE plproxy;
在每个分区中:

CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint)
RETURNS SETOF RECORD AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN EXECUTE q
    LOOP
        RETURN NEXT rec;
    END LOOP;
    RETURN;
END;
$$ LANGUAGE plpgsql;
正如您可能已经猜到的,这将影响PGSQL中定义的名为“autocompletecluster”的服务器。我正在发送的查询字符串如下所示:

$sql = "SELECT * FROM autocomplete WHERE member_id = :memberId";
$query = $this->db->prepare("SELECT query_autocomplete('{$sql}',1234");
它将返回以下内容:

SQLSTATE[XX000]: Internal error: 7 ERROR:  PL/Proxy function public.query_autocomplete(0): unsupported type
查询命中的表定义如下:

CREATE TABLE autocomplete (
    id character varying(100) NOT NULL,
    extra_data hstore,
    username character varying(254),
    member_id bigint
);

我做错了什么?

该错误强烈表明PL/Proxy不支持
记录集。请尝试定义函数以返回
自动完成%rowtype
,否则,
将返回表(…)
,并设置匹配的列。

谢谢Craig。“设置了匹配列”是指我需要定义我期望返回的字段吗?在我的用例中,我必须避免任何业务逻辑,即使是预期的字段,它们必须存在于从应用程序发送的sql语句中。@cody那么我怀疑您不会对这些语句使用PL/Proxy,或者必须在没有过程包装的情况下直接发送它们。您可能需要在pl/代理邮件列表中进一步跟进此问题,但我强烈怀疑它不支持
record
。您似乎是对的,我们在项目中使用了C,并且看起来似乎不支持record,尽管在他们的文档中表明它是。感谢您的帮助,我们已经回到探索PGPool II,我已将您的答案标记为正确。@cody请也向PL/Proxy提交错误报告或文档补丁,以避免下一个人遇到麻烦。