2014-03-30 24 views
0

当我在SQLPLUS中执行这个脚本时,我有一个错误,告诉我要声明“ENSI”(第11行)并声明“ENIT”(第12行),但我只需要初始化我的变量为那些字符串任何想法为什么?Oracle触发器,初始化一个变量

create or replace trigger ETUDIANT_TRIGGUER 
Before update on ETUDIANT 
for each row 
declare 
    c number; 
    id_edu ETUDIANT.id_etu%TYPE := :new.id_etu; 
    NOM ETUDIANT.NOM%TYPE := :new.NOM; 
    adresse ETUDIANT.adresse%TYPE := :new.adresse; 
    cursus ETUDIANT.cursus%TYPE := :new.cursus; 
    UNIVERSITE ETUDIANT.UNIVERSITE%TYPE := :new.UNIVERSITE; 
    SITE_ENSI ETUDIANT.UNIVERSITE%TYPE := "ENSI"; 
    SITE_ENIT ETUDIANT.UNIVERSITE%TYPE := "ENIT"; 
begin 
if :new.ID_ETU is null then 
raise_application_error(-20001,'ID_ETU est null');  
end if; 
select count(*) into c from [email protected]_ensi_link where ID_ETU= :new.ID_ETU; 
if c > 0 then 
raise_application_error(-20002, 'ID_ETU existe déjà dans le site _ensi'); 
end if; 
select count(*) into c from [email protected]_enit_link where ID_ETU= :new.ID_ETU; 
if c > 0 then 
raise_application_error(-20002, 'ID_ETU existe déjà dans le site _enit'); 
end if; 
if UPPER(UNIVERSITE)=SITE_ENSI then 
insert into [email protected]_ensi_link values(id_edu,NOM,adresse,cursus,NB_EMPRUNTS,UNIVERSITE); 
end if;  
if UPPER(UNIVERSITE)=SITE_ENIT then 
insert into [email protected]_enit_link values(id_edu,NOM,adresse,cursus,NB_EMPRUNTS,UNIVERSITE); 
end if; 
end; 
/

回答

3

[pl]中的字符串文字用单引号括起来,而不是双引号。 所以,你应该替换以下两行:

SITE_ENSI ETUDIANT.UNIVERSITE%TYPE := "ENSI"; 
SITE_ENIT ETUDIANT.UNIVERSITE%TYPE := "ENIT"; 

有了这两个:

SITE_ENSI ETUDIANT.UNIVERSITE%TYPE := 'ENSI'; 
SITE_ENIT ETUDIANT.UNIVERSITE%TYPE := 'ENIT'; 
+0

我测试,但它返回:ORA-00984:列不允许 –

+0

@MohammedAliKachbouri - 不是来自同一个线(s)虽然,从'插入',对不对?所以这真是一个新问题。但这是因为你有一个范围问题。当你在'values'子句中引用'id_edu'等时,它们被解释为表中的列,而不是变量 - 这很令人困惑,因为它们具有相同的名称。要么改变你的局部变量名称,要么 - 因为我不知道为什么你有它们 - 只需在那里引用':new.id_edu'。 –