2012-03-31 3 views
1

다음과 같은 간단한 PL/SQL 저장 프로 시저 예제를 작성하여 특정 질문을했습니다. 이 절차는 직원 이름과 ID 번호를 employees_???이라는 테이블에 삽입합니다. ??? 아래에 설명되어 있습니다. 내가 필요로 무엇PL/SQL에서 프로그래밍 방식으로 테이블 이름을 설정하는 방법은 무엇입니까?

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 라인을 원하는 경우 : 예를 들어,

은 국가 = '미국은'나는 INSERT 라인을 읽고 싶다면

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

국가 = '프랑스는'나는 읽을 INSERT 라인을 원하는 경우 :

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

등 ...

employee_??? 대신 무언가를 사용하여 PL/SQL에서이를 수행하는 방법이 있습니까? 그래서 INSERT에 대한 코드는 한 줄만 사용됩니까? 또는 case 또는 if/then/else 문을 사용하는 것이 가장 좋습니다.

+2

귀하의 DB 모델이 완전히 끊어집니다. 'country'라는 이름의 컬럼을 가진'employee' 테이블 하나만 있으면됩니다. 이 잘못된 모델로 인해 발생하는 문제를 해결하는 대신 즉시 다시 설계해야합니다. –

+1

예, 동의합니다 - 이것은 pl/sql의 변수 이름에 IN 매개 변수를 가져 오는 방법을 파악하기 위해 작성된 예제 일뿐입니다. – ggkmath

+3

다음은 ** 매우 나쁜 예입니다. –

답변

7

질문에 대답하려면 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; 
관련 문제