2012-09-10 2 views
1

직원이 배관공 인 경우 batch_id를 "P-1000"으로 설정하도록 직원 데이터베이스를 업데이트하고 싶습니다.PL/SQL에서 배열을 사용하여 여러 테이블 업데이트

대신 (5) 별도의 (느린) 쿼리를 만드는, 내가 원하는 :

  1. 배열의 각 인덱스는 테이블 이름을 설정
  2. 배열
  3. 업데이트를 사용하여 테이블을 통해
  4. 루프 문자열 인덱스의 문자열 값

내가 제안한 개념과 같이 멀리 떨어져 있어도 내가 틀린 나무를 완전히 짖고 있다고 생각하게 만듭니다.

아무 것도 적지 만, 여기에 내가하려고하는 허위 코드가 있습니다.

declare 
    type array_type is table of varchar2(100) index by binary_integer; 
    dmt_tables array_type; 
begin 
--fill dm_employeeTables array 
    dm_employeeTables(0) := 'dm_address'; 
    dm_employeeTables(1) := 'dm_communications'; 
    dm_employeeTables(2) := 'dm_identifier'; 
    dm_employeeTables(3) := 'dm_name'; 
    dm_employeeTables(4) := 'dm_qualifications'; 

-- loop through tables 
for i in dm_employeeTables.FIRST .. dmt_tables.LAST 
    loop 
    update dm_employeeTables(i) a 
    set employee_batch_id = 'P-1000' 
    where a.employee_type = 'PLUMBER'; 
    i=i+1; 
    end loop; 

end; 

답변

2

동적 SQL을 사용해야합니다.

FOR i IN dm_employeeTables.FIRST .. dmt_tables.LAST 
LOOP 
    EXECUTE IMMEDIATE 'UPDATE ' || dm_employeeTables(i) || 
        ' SET employee_batch_id = :1 ' || 
        ' WHERE employee_type = :2' 
    USING 'P-1000', 'PLUMBER'; 
END LOOP; 

같은 뭔가 지금, 좋은 코딩 관점에서, 당신은 아마 당신이 실행 한 후 EXECUTE IMMEDIATE에 전달하고자하는 SQL 문으로 채울 새로운 지역 변수 (즉 l_sql_stmt)를 선언합니다. 그렇게하면 SQL 문을 실행하기 전에 SQL 문을 기록하거나 인쇄하는 것과 같은 작업을 수행 할 수 있습니다. 일반적으로 디버깅이 훨씬 쉬워집니다.

+0

배열을 통해 루핑하는 것이이 경우 5 개의 개별 쿼리에 대한 이점을주지 않는다고 생각합니다 (물론 컴파일 타임에 테이블을 알지 못한다면). 그렇습니까? –

+0

@beherenow - 아마도 5 개의 테이블 만 있으면 실행하려는 UPDATE 문은 비교적 간단합니다. 이 경우, 코드를 반복하지 않는 이점은 동적 SQL 사용의 추가 복잡성보다 더 중요합니다. –

+0

고마워요. 나는 동적 SQL에 대해 들어 본 적없는 동적 SQL에 반대하는 idividual 문을 고수 할 것입니다. 그것은 비록 편리 할 수있는 것처럼 들린다. – Nimbocrux

관련 문제