Не удается создать схему в функции / процедуре в psql

#sql #postgresql #psql

#sql #postgresql #psql

Вопрос:

Всем привет, я разрабатывал приложение для управления школами, и я столкнулся с этой проблемой:

 create or replace procedure create_school_schema(title text)
as
$BODY$
    create schema title;    
$BODY$
language sql
  

Он не задает значение параметра в качестве имени схемы, вместо этого принимая ‘title’ в качестве имени схемы?
С функцией это тоже не сработало, но взамен она показывает мне значение моего параметра, которое я передаю.

Комментарии:

1. Зачем вам создавать отдельную схему для каждой школы вместо того, чтобы хранить все данные в таблицах, охватывающих все школы? Похоже, у вас более фундаментальная проблема с моделированием данных.

2. Для этого вам нужен динамический SQL

3. Похоже, я создавал панель управления для школ, хотел сохранить каждую школу в виде схемы с соответствующими таблицами в ней

4. Итак, я должен использовать EXECUTE command в своих запросах?

Ответ №1:

Пример функции, которая использует EXECUTE :

 CREATE OR REPLACE PROCEDURE public.create_school_schema(title text)
 LANGUAGE plpgsql
AS $procedure$
    BEGIN
        EXECUTE format('CREATE SCHEMA %I', title);
    END;
$procedure$
;
  

Для использования EXECUTE вам нужно будет использовать язык plpgsql. Затем используйте функцию format, чтобы добавить title переменную в качестве идентификатора к CREATE SCHEMA инструкции. Итак:

 dn
  List of schemas
  Name  |  Owner   
-------- ----------
 public | postgres
 test   | postgres

call create_school_schema('school');
CALL

dn
  List of schemas
  Name  |  Owner   
-------- ----------
 public | postgres
 school | postgres
 test   | postgres