构造数组文字作为 PL/pgSQL 函数的输入
Constructing array literal as input for PL/pgSQL function
函数调用中应如何包含具有复合类型元素的数组?
在查阅了在线资源并尝试了不同的变体之后,我仍然遇到解析器错误。下面我包括了类型、表、函数和执行尝试。
类型
CREATE TYPE jobs_v0.insertable_program AS (
handle text,
zip bytea
);
表格
CREATE TABLE jobs_v0.jobs (
id bigserial PRIMARY KEY NOT NULL,
manifest_cid text NOT NULL,
created_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE jobs_v0.programs (
id bigserial PRIMARY KEY NOT NULL,
job bigserial REFERENCES jobs_v0.jobs(id) NOT NULL,
handle text NOT NULL,
package bytea NOT NULL
);
函数:
CREATE OR REPLACE FUNCTION jobs_v0.insert_job(
manifest_cid text,
programs jobs_v0.insertable_program[]
) RETURNS void AS
$$
DECLARE
job_id jobs_v0.jobs.id%TYPE;
program jobs_v0.insertable_program;
inserted_programs jobs_v0.programs[];
BEGIN
-- Insert job
INSERT INTO jobs_v0.jobs(manifest_cid) VALUES (manifest_cid)
RETURNING id INTO job_id;
-- Insert programs
INSERT INTO jobs_v0.programs(job, handle, package)
SELECT job_id, * FROM unnest(programs)
RETURNING * INTO inserted_programs;
END;
$$ LANGUAGE plpgsql;
执行尝试和错误:
select jobs_v0.insert_job('QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9', '{"(main, 0xdeadbeef)"}'::jobs_v0.insertable_program[]);
ERROR: malformed array literal: "12"
DETAIL: Array value must start with "{" or dimension information.
CONTEXT: PL/pgSQL function jobs_v0.insert_job(text,jobs_v0.insertable_program[]) line 12 at SQL statement
---
select jobs_v0.insert_job('QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9', array[row('main', E'\xdeadbeef')]::jobs_v0.insertable_program[]);
ERROR: malformed array literal: "13"
DETAIL: Array value must start with "{" or dimension information.
数组文字应如下所示:
select jobs_v0.insert_job(
'QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9',
'{"(main,\"\\xdeadbeef\")"}'
);
但是错误在函数代码中:
INSERT INTO jobs_v0.programs(job, handle, package)
SELECT job_id, * FROM unnest(programs)
RETURNING * INTO inserted_programs;
RETRUNING *
中的 *
确实引用了 jobs_v0.programs
的所有列, 而不是 引用了 jobs_v0.insertable_program
的所有列,正如你所期望的那样。
此外,inserted_programs
不能是数组类型,它必须是jobs_v0.insertable_program
类型并且只能包含一个结果。如果 INSERT
插入多行,则只返回第一行。
函数调用中应如何包含具有复合类型元素的数组?
在查阅了在线资源并尝试了不同的变体之后,我仍然遇到解析器错误。下面我包括了类型、表、函数和执行尝试。
类型
CREATE TYPE jobs_v0.insertable_program AS (
handle text,
zip bytea
);
表格
CREATE TABLE jobs_v0.jobs (
id bigserial PRIMARY KEY NOT NULL,
manifest_cid text NOT NULL,
created_at timestamp NOT NULL DEFAULT now()
);
CREATE TABLE jobs_v0.programs (
id bigserial PRIMARY KEY NOT NULL,
job bigserial REFERENCES jobs_v0.jobs(id) NOT NULL,
handle text NOT NULL,
package bytea NOT NULL
);
函数:
CREATE OR REPLACE FUNCTION jobs_v0.insert_job(
manifest_cid text,
programs jobs_v0.insertable_program[]
) RETURNS void AS
$$
DECLARE
job_id jobs_v0.jobs.id%TYPE;
program jobs_v0.insertable_program;
inserted_programs jobs_v0.programs[];
BEGIN
-- Insert job
INSERT INTO jobs_v0.jobs(manifest_cid) VALUES (manifest_cid)
RETURNING id INTO job_id;
-- Insert programs
INSERT INTO jobs_v0.programs(job, handle, package)
SELECT job_id, * FROM unnest(programs)
RETURNING * INTO inserted_programs;
END;
$$ LANGUAGE plpgsql;
执行尝试和错误:
select jobs_v0.insert_job('QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9', '{"(main, 0xdeadbeef)"}'::jobs_v0.insertable_program[]);
ERROR: malformed array literal: "12"
DETAIL: Array value must start with "{" or dimension information.
CONTEXT: PL/pgSQL function jobs_v0.insert_job(text,jobs_v0.insertable_program[]) line 12 at SQL statement
---
select jobs_v0.insert_job('QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9', array[row('main', E'\xdeadbeef')]::jobs_v0.insertable_program[]);
ERROR: malformed array literal: "13"
DETAIL: Array value must start with "{" or dimension information.
数组文字应如下所示:
select jobs_v0.insert_job(
'QmTXzATwNfgGVukV1fX2T6xw9f6LAYRVWpsdXyRWzUR2H9',
'{"(main,\"\\xdeadbeef\")"}'
);
但是错误在函数代码中:
INSERT INTO jobs_v0.programs(job, handle, package)
SELECT job_id, * FROM unnest(programs)
RETURNING * INTO inserted_programs;
RETRUNING *
中的 *
确实引用了 jobs_v0.programs
的所有列, 而不是 引用了 jobs_v0.insertable_program
的所有列,正如你所期望的那样。
此外,inserted_programs
不能是数组类型,它必须是jobs_v0.insertable_program
类型并且只能包含一个结果。如果 INSERT
插入多行,则只返回第一行。