#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