2014-11-01 47 views
1

我試圖做一個PLSQL觸發器,當INSERT語句只包括NoSerieVehicule,ClientID,ModeFinCd,EmplID,DateVente,PrixVenteVehicule時,它將初始化VenteID,CoutTotalOption,TauxEscompteSaisonnier,IndicateurFidelite,TauxEscompteFidelite,TaxeProvCourante,TaxeFedCourante。表Here's an image of said table.如果在INSERT語句中沒有賦值,我是否需要在我的觸發器中包含GENERATED ALWAYS AS?

定義:

CREATE TABLE AU_Ventes (
VenteID     NUMBER(7) NOT NULL, 
NoSerieVehicule   CHAR(11) NOT NULL, 
ClientID    NUMBER(7) NOT NULL, 
ModeFinCd    CHAR(2) NOT NULL, 
EmplID     NUMBER(7) NOT NULL, 
TauxEscompteSaisonnier NUMBER(5,4), 
DateVente    DATE 
         DEFAULT SYSDATE 
         NOT NULL, 
DateFinGarantie   AS (ADD_MONTHS(DateVente,60)), 
PrixSuggere    NUMBER(8,2), 
PrixVenteVehicule  NUMBER(8,2) NOT NULL, 
EscompteSaisonnier  NUMBER(8,2), 
IndicateurFidelite  CHAR(1), 
TauxEscompteFidelite NUMBER(5,4), 
CoutVehiculeEscompte NUMBER(8,2) GENERATED ALWAYS AS (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier), 
CoutTotalOption   NUMBER(8,2) NOT NULL, 
TotalVenteTaxable  NUMBER(8,2) GENERATED ALWAYS AS (PrixVenteVehicule - (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier) + CoutTotalOption), 
TaxeFedCourante   NUMBER(8,2) GENERATED ALWAYS AS ((PrixVenteVehicule - (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier) + CoutTotalOption) * 0.05), 
TaxeProvCourante  NUMBER(8,2) GENERATED ALWAYS AS (((PrixVenteVehicule - (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier) + CoutTotalOption) * 1.05) * 0.095), 
TotalTaxes    NUMBER(8,2) GENERATED ALWAYS AS ((PrixVenteVehicule - (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier) + CoutTotalOption)*(0.05+(1.05*0.095))), 
GrandTotalVente   NUMBER(8,2) GENERATED ALWAYS AS ((PrixVenteVehicule - (PrixVenteVehicule * (TauxEscompteFidelite + TauxEscompteSaisonnier) + EscompteSaisonnier) + CoutTotalOption)*(1+0.05+(1.05*0.095))), 
CONSTRAINT PK_VenteID PRIMARY KEY (VenteID), 
CONSTRAINT FK_NoSerieVehicule FOREIGN KEY (NoSerieVehicule) REFERENCES AU_Vehicules (NoSerieVehicule), 
CONSTRAINT FK_ClientID FOREIGN KEY (ClientID) REFERENCES AU_Clients (ClientID), 
CONSTRAINT FK_ModeFinCd FOREIGN KEY (ModeFinCd) REFERENCES AU_ModesFinancements (ModeFinCd), 
CONSTRAINT CK_PrixVenteVehicule CHECK (PrixVenteVehicule >= 0), 
CONSTRAINT CK_EscompteSaisonnier CHECK (EscompteSaisonnier >= 0), 
CONSTRAINT CK_CoutTotalOption  CHECK (CoutTotalOption >= 0)); 

這裏是我的PLSQL代碼爲止。

CREATE OR REPLACE TRIGGER TR_06InsVente 
BEFORE INSERT ON AU_Ventes 
FOR EACH ROW 
WHEN (:new.VenteID IS NULL) --IS THIS NEEDED? 
DECLARE 

v_VenteID = AU_Ventes.VenteID%TYPE; 
v_TauxEscompteSaisonnier = AU_Ventes.TauxEscompteSaisonnier%TYPE; 
v_IndicateurFidelite = AU_Ventes.IndicateurFidelite%TYPE; 
v_TauxEscompteFidelite = AU_Ventes.TauxEscompteFidelite%TYPE; 
v_TaxeFedCourante = AU_Ventes.TaxeFedCourante%TYPE; 
v_TaxeProvCourante = AU_Ventes.TaxeProvCourante%TYPE; 
v_CoutTotalOption = AU_Ventes.CoutTotalOption%TYPE; 

BEGIN 

--VenteId 
SELECT SEQ_VenteId.NEXTVAL INTO v_VenteID FROM DUAL; 

:new.VenteID := v_VenteID; 

--TauxEscompteSaisonnier 
SELECT AU_Modeles.TauxEscompteSaisonnier INTO v_TauxEscompteSaisonnier 
FROM AU_Vehicules INNER JOIN AU_Modeles 
ON (AU_Vehicules.ModeCd = au_modeles.modecd) 
WHERE ((AU_Vehicules.NoSerieVehicule = :new.NoSerieVehicule) AND 
(datefinescomptesaisonnier >= sysdate)) 

:new.TauxEscompteSaisonnier := v_TauxEscompteSaisonnier; 

--IndicateurFidelite 
SELECT AU_Clients.IndicateurFidelite INTO v_IndicateurFidelite 
FROM AU_Clients 
WHERE (AU_Clients.ClientID = :new.ClientID) 

:new.IndicateurFidelite := v_IndicateurFidelite; 

--TauxEscompteFidelite 
SELECT AU_Modeles.TauxEscompteFidelite INTO v_TauxEscompteFidelite 
FROM AU_Modeles INNER JOIN AU_Vehicules 
ON AU_Modeles.ModeCd = AU_Vehicules.ModeCd 
WHERE ((AU_Vehicules.NoSerieVehicule = :new.NoSerieVehicule) AND 
('1' = (SELECT AU_Clients.IndicateurFidelite FROM AU_Clients 
WHERE AU_Clients.ClientID = :new.ClientID))) 

:new.v_TauxEscompteFidelite := v_TauxEscompteFidelite; 

--v_TaxeFedCourante what do I do with this since it is "GENERATED ALWAYS AS" 
--v_TaxeProvCourante what do I do with this since it is "GENERATED ALWAYS AS" 
--v_CoutTotalOption not sure about this either HARDCODED in inserts from teacher 


EXCEPTION 
WHEN OTHERS THEN 
enregistrer_erreur(); 
RAISE; 
END; 
/

基本上我不明白的是,如果我需要在PLSQL,如果是我怎麼做,給init colums價值?既然是虛擬專欄?

很抱歉,如果變量名稱是法文,希望您仍然能夠理解我的問題。

在此先感謝。

回答

2

我不完全確定我理解你問的問題。

您無法將值分配給表中的虛擬列。 Oracle自動生成值。你可以忽略觸發器中的那些列。

我希望這是一個家庭作業問題,因爲你有一個引用「老師」的評論。如果不是這樣,那麼你的數據模型看起來相當可疑 - 看起來你的表是非常規範化的,因爲你從許多不同的表中複製數據。這實際上從來不是一個好主意,因爲保持所有數據同步非常非常困難。

相關問題