PL /代理返回存储过程调用中不支持的类型

Cod*_*ody 7 postgresql plpgsql

我在PL/Proxy中设置了一个存储过程来进行查询,然后收回一些RECORD.

在PL /代理中:

CREATE OR REPLACE FUNCTION query_autocomplete(q text, i_id bigint)
RETURNS SETOF RECORD AS $$
    CLUSTER 'autocompletecluster';
    RUN ON i_id;
$$ LANGUAGE plproxy;
Run Code Online (Sandbox Code Playgroud)

在每个分区中:

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;
Run Code Online (Sandbox Code Playgroud)

正如您可能猜到的那样,这是在PGSQL中命名为'autocompletecluster'的定义的SERVER.我发送的查询字符串如下:

$sql = "SELECT * FROM autocomplete WHERE member_id = :memberId";
$query = $this->db->prepare("SELECT query_autocomplete('{$sql}',1234");
Run Code Online (Sandbox Code Playgroud)

它返回以下内容:

SQLSTATE[XX000]: Internal error: 7 ERROR:  PL/Proxy function public.query_autocomplete(0): unsupported type
Run Code Online (Sandbox Code Playgroud)

查询正在命中的表定义如下:

CREATE TABLE autocomplete (
    id character varying(100) NOT NULL,
    extra_data hstore,
    username character varying(254),
    member_id bigint
);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Cra*_*ger 1

该错误强烈表明 PL/Proxy 不支持SETOF RECORD. 尝试定义您的函数来返回autocomplete%rowtype,或者,如果失败,RETURNS TABLE (...)则使用匹配的列集。