Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como definir programaticamente o nome da tabela em PL/SQL?


Para responder à sua pergunta, você deve usar execute immediate e crie sua declaração dinamicamente.
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_name
                       || ' values (:1, :2, 1000)'
      using emp_id, name;
end hire_employee;

No entanto, essa é uma maneira extremamente complicada de armazenar os dados. Se você deseja selecionar todos dados você tem que unir um grande número de tabelas.

Seria muito melhor normalizar o banco de dados corretamente e adicionar país a um employees tabela.

Algo como o seguinte:
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 )
    );

Seu procedimento se torna uma instrução de inserção muito simples:
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;