postgres, как ссылаться на идентификатор вставки в функции для создания таблицы? - PullRequest
0 голосов
/ 12 ноября 2019

Я пытаюсь создать следующую функцию, которая вставляет роль в таблицу, получает значение идентификатора, а затем использует это значение идентификатора при вызове «создания таблицы».

 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. Почему?

Разобрался, просто пропустил ||после _ид. Работа.

1 Ответ

0 голосов
/ 12 ноября 2019

Вы можете вернуть идентификатор в переменную и использовать его в конкатенации.

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;
...