postgresql - postgres,如何在函数中引用插入 ID 来创建表?
问题描述
我正在尝试创建以下函数,它将角色插入表中,获取 ID 值,然后在“创建表”调用中使用该 ID 值。
CREATE FUNCTION data.addtable (sch text, tbl text) RETURNS INTEGER AS $$
begin
WITH i AS (
SELECT nextval('data.customdata_id_seq') AS id
)
INSERT INTO "data"."customtables" (id,
ownerid,name,internalname,tableinfo)
SELECT id, 15,tbl, 'tbl_' || id, ('{
"counter": "2",
"tablename": "' || sch ||'_tbl_' || id || '",
"headers": ["ID", "First Name", "Last Name"],
"columns": [
{"data": "id"},
{"data": "field_1"},
{"data": "field_2"}
]
}')::jsonb
FROM i RETURNING ID;
EXECUTE 'Create table ' || sch || '.' || 'tbl_' || id || ' (id serial
primary key, field_1 varchar(100), field_2 varchar(100))';
end;
$$ LANGUAGE plpgsql;
当我尝试运行它时,我收到错误:
ERROR: column "id" does not exist
LINE 1: ...ELECT 'Create table ' || sch || '.' || 'tbl_' || id || '
(i...
^
QUERY: SELECT 'Create table ' || sch || '.' || 'tbl_' || id || ' (id
serial primary key, field_1 varchar(100), field_2 varchar(100))'
CONTEXT: PL/pgSQL function data.addtable(text,text) line 18 at EXECUTE
SQL state: 42703
插入到 CustomTables 的查询的第一部分有效,但是如何传递/引用此 ID,以便可以在 EXECUTE 命令中使用它来创建动态表?我还希望它以整数形式返回 ID。
更新,我做了一些改变:试图弄清楚为什么这不起作用?
CREATE FUNCTION data.addtable (sch text, tbl text) RETURNS integer AS $$
DECLARE
_id data.customtables.id%TYPE;
BEGIN
SELECT nextval('data.customdata_id_seq') AS id into _id;
INSERT INTO "data"."customtables" (id,
ownerid,name,internalname,tableinfo)
SELECT _id, 15,tbl, 'tbl_' || _id, ('{
"counter": "2",
"tablename": "' || sch ||'_tbl_' || _id || '",
"headers": ["ID", "First Name", "Last Name"],
"columns": [
{"data": "id"},
{"data": "field_1"},
{"data": "field_2"}
]
}')::jsonb;
EXECUTE 'Create table ' || sch || '.' || 'tbl_' || _id ' (id serial
primary key, field_1 varchar(100), field_2 varchar(100))';
return _id;
END;
$$ LANGUAGE plpgsql;
出于某种原因,它知道顶部语句中的 _id,但在 EXECUTE 语句中将 _id 抛出为“不存在”的错误。为什么?
想通了,只是缺少一个|| 在 _id 之后。在职的。
解决方案
您可以将 ID 返回到变量中并在连接中使用它。
CREATE FUNCTION data.addtable (sch text,
tbl text)
RETURNS integer
AS
$$
DECLARE
_id data.customtables.id%TYPE;
BEGIN
WITH ...
INSERT INTO ...
SELECT ...
RETURNING id
INTO _id;
EXECUTE 'CREATE TABLE ' || sch || '.' || 'tbl_' || _id || ' (id serial primary key, field_1 varchar(100), field_2 varchar(100))';
END;
$$
LANGUAGE plpgsql;
推荐阅读
- python - 恢复使用 shuffle_batch 的张量流图永远挂起
- c# - 刷新 NavigationView 时导航到特定的 ContentFrame
- jmeter - 如何在 J-Meter 4.0 中调试“响应代码 500 内部服务器错误”?
- angular - angular 6 的 Primeng 验证码问题
- html - 图片和文字之间的差距
- git - 哪个版本的 Git 与 Maven 发布插件一起使用?
- r - 在 lm() 中编写回归公式时,“/”在 R 中是什么意思
- json - 在 PowerShell 中迭代 JSON 并删除 JSON 元素
- web-applications - 在 CodedUi 测试期间使用元素 id 而不是他的位置
- python - 运行前查找 Python 编译/运行时错误