为什么 json_populate_record() 无法识别行类型?
Why is json_populate_record() not recognizing row type?
我有 2 tables type
和 name
。我试图通过一个函数用 json_populate_record() 插入这些。收到以下错误:
first argument of json_populate_record must be a row type
Table 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;
Table 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;
当用 {id: 'x', 'value': 'x'}
调用 type_insertone()
时,它起作用了。
但是当我用 name_insertone()
做同样的事情时,它不起作用!
我在想是否有可能在创建 table 之前创建函数,这可能导致它不知道 table name
,但是我认为不是这样。
我不知道我应该在这里尝试什么。我还检查过 name
不是保留关键字, type
.
也是
"name"是文本类型and a key word:
https://www.postgresql.org/docs/current/static/datatype-character.html 看底部,所以当您转换为 "name" 时,您转换为名称数据类型,而不是您的 table 行类型...
例如:
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
我有 2 tables type
和 name
。我试图通过一个函数用 json_populate_record() 插入这些。收到以下错误:
first argument of json_populate_record must be a row type
Table 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;
Table 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;
当用 {id: 'x', 'value': 'x'}
调用 type_insertone()
时,它起作用了。
但是当我用 name_insertone()
做同样的事情时,它不起作用!
我在想是否有可能在创建 table 之前创建函数,这可能导致它不知道 table name
,但是我认为不是这样。
我不知道我应该在这里尝试什么。我还检查过 name
不是保留关键字, type
.
"name"是文本类型and a key word:
https://www.postgresql.org/docs/current/static/datatype-character.html 看底部,所以当您转换为 "name" 时,您转换为名称数据类型,而不是您的 table 行类型...
例如:
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