为什么json_populate_record()没有识别行类型?

问题描述 投票:2回答:1

我有2张桌子typename。我试图通过一个函数插入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也是如此。

sql postgresql plpgsql postgresql-9.6 node-postgres
1个回答
2
投票

“name”是文本类型and a key word

https://www.postgresql.org/docs/current/static/datatype-character.html查看底部,所以当你转换为“name”时,你会转换为name数据类型,而不是你的表rowtype ...

例如:

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
© www.soinside.com 2019 - 2024. All rights reserved.