Как программно установить имя таблицы в PL / SQL? - PullRequest
1 голос
/ 31 марта 2012

Я создал следующий простой пример хранимой процедуры PL / SQL, чтобы задать конкретный вопрос. Эта процедура вставляет имя и идентификатор сотрудника в таблицу с именем employees_???. ??? объясняется ниже.

PROCEDURE hire_employee (emp_id IN INTEGER, name IN VARCHAR2, country IN VARCHAR2) 
AS
BEGIN
    INSERT INTO employees_??? VALUES (emp_id, name, 1000);
END hire_employee;

Мне нужно задать имя таблицы на основе переменной IN country. Например,

Если страна = 'США', я хочу, чтобы строка ВСТАВИТЬ читала:

INSERT INTO employees_usa VALUES (emp_id, name, 1000);

Если страна = 'германия', я хочу, чтобы в строке ВСТАВИТЬ было написано:

INSERT INTO employees_germany VALUES (emp_id, name, 1000);

Если страна = 'Франция', я хочу, чтобы строка ВСТАВКА читалась:

INSERT INTO employees_france VALUES (emp_id, name, 1000);

и т.д ...

Есть ли способ сделать это в PL / SQL, подставив что-то вместо employee_???, чтобы для INSERT использовалась только одна строка кода? Или лучше использовать оператор case или if/then/else?

Ответы [ 2 ]

7 голосов
/ 31 марта 2012

Чтобы ответить на ваш вопрос, вы должны использовать execute immediate и динамически создавать свое заявление.

create or replace procedure hire_employee (
        emp_id IN INTEGER
      , name IN VARCHAR2
      , country IN VARCHAR2 ) is

   -- maximum length of an object name in Oracle is 30
   l_table_name varchar2(30) := 'employees_' || country;

begin
    execute immediate 'insert into ' || l_table
                       || ' values (:1, :2, 1000)'
      using emp_id, name;
end hire_employee;

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

Было бы гораздо лучше правильно нормализовать базу данных и добавить страну в таблицу employees.

Примерно так:

create table employees (
    emp_id number(16)
  , country varchar2(3) -- ISO codes
  , name varchar2(4000) -- maximum who knows what name people might have
  , < other_columns >
  , constraint pk_employees primary key ( emp_id )
    );

Ваша процедура становится очень простым оператором вставки:

create or replace procedure hire_employee (
       emp_id in integer
     , name in varchar2
     , country in varchar2 ) is

    insert into employees
    values ( emp_id, country, name, 1000 );

end hire_employee;
1 голос
/ 31 марта 2012

Вы можете использовать динамический SQL и конструкцию EXECUTE IMMEDIATE. В этом вы создаете запрос в виде строки, а затем выполняете его. Хороший пример на http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...