我有2个表type
和name
。我试图通过一个函数插入json_populate_record()。收到以下错误:
first argument of json_populate_record must be a row type
使用以下代码创建表type
CREATE TABLE IF NOT EXISTS "type" (
"id" TEXT NOT NULL,
"value" TEXT NOT NULL,
PRIMARY KEY ("id"),
CHECK ("id"<>'' AND "value"<>'')
);
CREATE INDEX IF NOT EXISTS "idx_type_value"
ON "type" ("value");
CREATE OR REPLACE FUNCTION "type_insertone" (
IN _a JSON
) RETURNS VOID AS $$
BEGIN
INSERT INTO "type" SELECT * FROM json_populate_record(NULL::"type", _a);
END;
$$ LANGUAGE plpgsql;
使用以下代码创建表name
CREATE TABLE IF NOT EXISTS "name" (
"id" TEXT NOT NULL,
"value" TEXT NOT NULL,
PRIMARY KEY ("id"),
CHECK ("id"<>'' AND "value"<>'')
);
CREATE INDEX IF NOT EXISTS "idx_name_value"
ON "name" ("value");
CREATE OR REPLACE FUNCTION "name_insertone" (
IN _a JSON
) RETURNS VOID AS $$
BEGIN
INSERT INTO "name" SELECT * FROM json_populate_record(NULL::"name", _a);
END;
$$ LANGUAGE plpgsql;
何时使用type_insertone()
致电{id: 'x', 'value': 'x'}
,它就有效。
但是当我对name_insertone()
做同样的事情时它不起作用!
我在想是否有可能在创建表之前创建该函数,这可能导致它不知道表name
,但我认为情况并非如此。
我不知道我应该在这里尝试什么。我还检查过name
不是保留关键字,因此type
。
答案 0 :(得分:3)
“name”是文本类型and a key word:
https://www.postgresql.org/docs/current/static/datatype-character.html查看底部,因此当您转换为“name”时,您将转换为名称数据类型,而不是您的表格行类型...
例如:
t=# alter table name rename to name1;
ALTER TABLE
t=# CREATE OR REPLACE FUNCTION "name_insertone" (
IN _a JSON
) RETURNS VOID AS $$
BEGIN
INSERT INTO "name1" SELECT * FROM json_populate_record(NULL::"name1", _a);
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
t=# select name_insertone('{"id": "x", "value": "x"}');
name_insertone
----------------
(1 row)
然而:
t=# create table text(i int);
CREATE TABLE
t=# SELECT * FROM json_populate_record(NULL::"text", '{}')
t-# ;
ERROR: first argument of json_populate_record must be a row type
t=# create table char(i int);
CREATE TABLE
t=# SELECT * FROM json_populate_record(NULL::"char", '{}');
ERROR: first argument of json_populate_record must be a row type