2017-06-02 20 views
1

想象一下,表中有兩列;天氣和工具如何根據另一列值設置列值觸發器語句?

WEATHER TOOL 
sun 
autumn 
rain 

如果天氣=太陽,那麼工具應該有值「沒傘」也如天氣=秋,那麼工具應該有值「沒傘」 但是如果天氣=下雨,那麼工具應具有值「傘」

應該使用觸發器或在插入語句期間生成結束表。

CREATE OR REPLACE EDITIONABLE TRIGGER "UPDATE_TOOL" 
before insert on "UPDATING_TOOL_TABLE" 
for each row 
begin 
IF WEATHER = 'sun' THEN 
    SET TOOL = 'no umbrella'; 
ELSE IF WEATHER = 'autumn' THEN 
    SET TOOL = 'no umbrella'; 
ELSE IF WEATHER = 'rain' THEN 
    SET TOOL = 'umbrella'; 
END IF; 

end; 
/
ALTER TRIGGER "UPDATE_TOOL" ENABLE; 

請看看我創建的觸發器語句,這是行不通的。我在ORACLE SQL中工作。

謝謝。

回答

1

在Oracle 11g +中,您不需要實際存儲該值。您可以生成它在飛行:

alter table UPDATING_TOOL_TABLE 
    add tool generated always as (case when weather in ('sun', 'autumn') then 'no umbrella' when weather in ('rain') then 'umbrella' end); 

編輯:

至於你的扳機,我希望是這樣的:

begin 
    select (case when :new.weather in ('sun', 'autumn') then 'no umbrella' 
       when :new.weather in ('rain') then 'umbrella' 
      end) into :new.tool 
    from dual; 
end; 

或:

begin 
    :new.tool := (case when :new.weather in ('sun', 'autumn') then 'no umbrella' 
         when :new.weather in ('rain') then 'umbrella' 
        end); 
end; 
+0

可以將此代碼在開始和結束之間進入Trigger語句; –

+0

@GordonLinoff爲什麼不必要地將sql添加到pl/sql中(因此引入了上下文切換)?這可以作爲案例或if語句來完成;無需從雙重選擇。甚至是一個表達式,例如':new.tool:= case when ... end;' – Boneist

+1

@Boneist。 。 。我的一個壞習慣。 –

相關問題