2010-05-24 8 views
4

테이블의 레코드를 업데이트하고 싶지만 조건에 따라 하나의 열 또는 다른 것을 업데이트하지만 두 개의 별도 명령문을 갖고 싶지 않습니다. 매우 길고 상세한.오라클 - 조건에 따라 하나의 열 또는 다른 업데이트하기

여기에 간략히 설명하면 기본 개념입니다.

PROCEDURE Animal_something(p_updater VARCHAR2) 

begin 

    if p_updater = 'person' then 
    -- I want to update the modified_by 
    else 
    -- if p_updater = 'a process' I want to update modified_by_process 

Update table_creatures 
    set animal_type = 'Dog , 

**modified_by** = 'Bob' 
**or do this** 
**modified_by_process =** 'creature_package' 

where animal_legs = '4' 

나는을 원하지 않는 :

if p_updater = 'person' then 
    Update table_creatures 
    set animal_type = 'Dog , 
     modified_by = 'Bob' 
    where animal_legs = '4'; 
else 

    Update table_creatures 
    set animal_type = 'Dog , 
     modified_by_process = 'creature_package' 
    where animal_legs = '4'; 

end; 

답변

6
UPDATE table_creatures 
SET  animal_type = 'Dog', 
     modified_by = CASE p_updater WHEN 'person' THEN 'Bob' ELSE modified_by END, 
     modified_by_process = CASE p_updater WHEN 'process' THEN 'creature_package' ELSE modified_by_process END 
WHERE animal_legs = 4 
+0

+1, 저를 때려주십시오. –

0

당신은 동적 SQL을 사용할 수 있습니다, 예를 들면 :

PROCEDURE Animal_something(p_updater VARCHAR2) 

    sql_string_pt1 VARCHAR2(2000) := 'UPDATE table_creatures SET animal_type = :1'; 
    sql_string_pt2 VARCHAR2(2000) := NULL; 
    sql_string_pt3 VARCHAR2(2000) := ' WHERE animal_legs = :3'; 

begin 

    if p_updater = 'person' then 
    sql_string_pt2 := ', modified_by = :2'; 
    else 
    sql_string_pt2 := ', modified_by_process = :2'; 
    end if; 

    EXECUTE IMMEDIATE sql_string_pt1 || sql_string_pt2 || sql_string_pt3 
    USING 'Dog', 'Bob', '4'; 

end; 

이 Quassnoi의 대답을 통해 두 가지 장점이 있습니다 사용 변수를 바인드하고 매 실행마다 두 열을 모두 업데이트 할 필요가 없기 때문에 리두 짝수가 생성됩니다. 실제 값은 변경되지 않습니다.

단점은 컴파일 타임에 문이 유효성 검사가되지 않는다는 것입니다.

+0

응? 리터럴은 리터럴이므로 "겹치지"않아도됩니다. 본질적으로 그들은 실행에서 실행으로 바뀌지 않을 것입니다. 그리고 나는 그가 z-dan의 코드에서 변수로 바뀌기 위해 바뀔만한 것을 의미한다고 확신합니다. 그리고 그것은 검증 될 것입니다. –

+0

나는 이런 식으로 사용한 적이 없으며, 매우 시원한 접근법이다. 비록 그것이 유지 보수 관점에서 코드를 작성하는 최선의 방법이라면, 나는 긴 갱신 문장으로 궁금해하고있다. –

+0

@Page : 아마도 맞을 것입니다. 그러나 질문자가 이와 같은 질문을한다면, 리터럴과 바인드 변수를 사용하는 것의 차이를 알지 못할 가능성이 있습니다. 좋은 생각입니다. 모범 사례를 설명합니다. '개', '밥'및 '4'는 변수에 대한 좋은 후보자처럼 보입니다[email protected] z-dan : 동적 SQL은 유연성을 유지하면서 유지 관리 할 수있는 방법입니다 (SQL의 여러 부분을 비트 단위로 연결하는 대신 토큰 교체가있는 패턴 사용). –

-1
UPDATE table_creatures 
SET  animal_type = 'Dog', 
     modified_by = DECODE(p_updater , 'person' , 'BOB' , 
             'proces' , 'creature_package' , 
             'GIVE DEFAULT VALUE')   
WHERE animal_legs = 4; 

시도해 볼 수 있습니다.

+1

다른 값을 가진'modified_by'를 갱신하는 것이 아니라'p_updater'의 값에 따라 다른 * 컬럼을 업데이트하려고합니다. –

+0

p_updater가 table_creatures의 열인 경우 위의 쿼리가 작동합니다. 이 쿼리는 p_updater 값을 기반으로 modified_by를 업데이트했습니다. – Bharat

관련 문제