Как можно условно построить имя таблицы для оператора SQL CREATE TABLE? - PullRequest
1 голос
/ 08 ноября 2010

В хранимой процедуре SQL мне бы хотелось иметь возможность создать имя таблицы и создать ее.

Пример: я только что вошел в свою базу данных с именем компании 03, а таблица клиентов не существует, поэтому я хотел бы, чтобы процесс занял CREATE TABLE CUSTOMER03.

Есть ли способ append company_id char(2) до CUSTOMER и передать его в оператор CREATE TABLE? может быть, как

CREATE TABLE $tablename or $tablename+company_id?

Ответы [ 3 ]

9 голосов
/ 08 ноября 2010

В Oracle синтаксис будет выглядеть примерно так:

BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE CUSTOMER_'||v_company_id||' (..)';
END;

Однако это, вероятно, очень плохая идея.Через шесть месяцев вы захотите добавить столбец в таблицу, и вам нужно будет решить, к каким таблицам нужно добавить его.

Кроме того, хранимым процедурам в Oracle требуется фиксированное имя таблицы(существующей таблицы), или вам придется ссылаться на все через динамический SQL, что является проблемой.

Лучше иметь одну таблицу клиентов с атрибутом company_id.Затем используйте Fine Grained Access Control для безопасной фильтрации по company_id, чтобы контролировать, кто видит данные какой компании.

2 голосов
/ 08 ноября 2010

Вам необходимо использовать динамический SQL, например:

DECLARE @company_id char(2)
SET @company_id = '02'
EXEC('CREATE TABLE CUSTOMER' + @company_id + ' (id int PRIMARY KEY)')

(проверено)

2 голосов
/ 08 ноября 2010

Используйте модификатор IF NOT EXISTS для оператора CREATE TABLE.Это приведет к созданию таблицы, только если она еще не существует.

...