För att svara på din fråga måste du använda kör omedelbart och skapa ditt uttalande dynamiskt.
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;
Detta är dock ett enormt överkomplicerat sätt att lagra data. Om du vill välja alla data du har för att förena ett stort antal tabeller.
Det skulle vara mycket bättre att normalisera databasen ordentligt och lägga till land till en anställd
bord.
Något i stil med följande:
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 )
);
Din procedur blir då en mycket enkel infogningssats:
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;