我試圖做一個PLSQL觸發器,當INSERT語句只包括NoSerieVehicule,ClientID,ModeFinCd,EmplID,DateVente,PrixVenteVehicule時,它將初始化VenteID,CoutTotalOption,TauxEscompteSaisonnier,IndicateurFidelite,TauxEscompteFidelite,TaxeProvCourante,TaxeFedCourante。表如果在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價值?既然是虛擬專欄?
很抱歉,如果變量名稱是法文,希望您仍然能夠理解我的問題。
在此先感謝。