Я пытаюсь создать следующую функцию, которая вставляет роль в таблицу, получает значение идентификатора, а затем использует это значение идентификатора при вызове «создания таблицы».
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 работает, но как передать / ссылаться на этот идентификатор, чтобы я мог использовать его в команде EXECUTE для созданиядинамическая таблица? Я также хочу, чтобы он возвращал идентификатор в виде целого числа.
ОБНОВЛЕНИЕ, я внес некоторые изменения: пытаясь выяснить, почему это не работает?
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 в верхнем выражении, но выдает ошибку для _id, так как "не существует" в выражении EXECUTE. Почему?
Разобрался, просто пропустил ||после _ид. Работа.