2017-04-10 40 views
0

此過程編輯或添加(取決於表)任務表功能。它有3個參數:任務ID,要添加或編輯的功能以及值。我新來pl sql,我知道我做錯了,但我不知道。這是代碼oracle-pl sql過程不會編譯

set serveroutput on 
create or replace procedure bearbeiteAufgabe4(Aufg_ID Aufgabe.Aufgaben_ID%TYPE, Eigenschaft VARCHAR2, Wert ANYDATA) 
IS 
    titel_aufg Aufgabe.Titel%TYPE; 
    typ_besch Typ.Typ_Beschreibung%TYPE; 
    eigensch ANYDATA; 
    type eigenschaften_array IS VARRAY(15) OF VARCHAR2(10); 
    eigenschaften eigenschaften_array; 
    excp exception; 
    kein_eigenschaft exception; 
    nicht_ver_eig exception; 
    nicht_ver_typ exception; 
    anzahl_werte NUMBER; 
begin 
    anzahl_werte:= 16; 
    eigenschaften:= eigenschaften_array('Titel','Beschreibung','Beginn','Beginn formel', 
    'Dauer','Dauer Einheit','Dauer formel','Ende','Ende formel','Erstellzeitpunkt', 
    'Aufgabengeber', 
    'Aufgabenverantwortlicher','Pruefer','Ansprechpartner','Ort','Status','Typ','Aufgabengrund','Vorgaenger','Version'); 
    -- check if the task exists 
    select titel into titel_aufg 
    from Aufgabe 
    where Aufg_ID = Aufgabe.Aufgaben_ID; 

    if titel_aufg is null then 
    raise excp; 
    end if; 

    -- loop in order to check if the feature actually exists 

    for i in 1 .. anzahl_werte LOOP 
    if Eigenschaft = eigenschaften(i) then 
     null; 
    else -- when the feature does not exist 
     raise kein_eigenschaft; 
    end if; 
    end loop; 



    if Eigenschaft = 'Erstellzeitpunkt' or Eigenschaft = 'Titel' or Eigenschaft ='Aufgabenvertantwortlicher' 
    or Eigenschaft ='Aufgabengeber' or Eigenschaft ='Grund' or Eigenschaft ='Typ' 
    or Eigenschaft = 'Vorgaenger' 
    then 
    raise nicht_ver_eig; 
    end if; 

    select Typ_Beschreibung into typ_besch 
    from Typ t join Aufgabe a on a.Typ_Typ_ID = t.Typ_ID 
    where Aufg_ID = Aufgaben_ID; 

    if typ_besch = 'Container' or typ_besch ='Kommentar' or typ_besch ='Bedingung' then 
    raise nicht_ver_typ; 
    end if; 

    -- edit or add features 


    select 
    case when Eigenschaft = 'Beschreibung' then Beschreibung 
    when Eigenschaft = 'Beginn' then Beginn 
    when Eigenschaft = 'Beginn formel' then Beginn_formel 
    when Eigenschaft = 'Dauer' then Dauer 
    when Eigenschaft = 'Dauer Einheit' then Dauer_Einheit 
    when Eigenschaft = 'Dauer formel' then Dauer_formel 
    when Eigenschaft = 'Ende' then Ende 
    when Eigenschaft = 'Ende formel' then Ende_formel 
    when Eigenschaft = 'Ort' then Ort 
    when Eigenschaft = 'Version' then Version 
    when Eigenschaft = 'Ansprechpartner' then "Ansprechpartner_(dessen_ID)" 
    when Eigenschaft = 'Status' then Status 
    end as Aufgabeneigenschaft into eigensch 
    from Aufgabe a 
    where a.Aufgaben_ID = Aufg_ID; 


    if eigensch is null then 
    -- add 
    insert into Aufgabe(Aufgaben_ID,Titel,Beschreibung, Erstellzeitpunkt, 
    Beginn, Beginn_formel,Dauer, Dauer_Einheit, Dauer_formel,Ende, Ende_formel, 
    "Aufgabengeber_(dessen_ID)", Aufgabenverantwortlicher,"Pruefer_(dessen_ID)", 
    "Ansprechpartner_(dessen_ID)", Ort, Status,Aufgabengrund,TYP_TYP_ID, Vorgaenger_ID, Version) 
    values (Aufg_ID, (select Titel from Aufgabe a where a.Aufgaben_ID = Aufg_ID), 
    case when Eigenschaft = 'Beschreibung' then Wert else (select Beschreibung 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID)end, 
    (select Erstellzeitpunkt from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    case when Eigenschaft = 'Beginn' then Wert else (select Beginn 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Beginn_formel' then Wert else (select Beginn_formel 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Dauer' then Wert else (select Dauer 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Dauer_Einheit' then Wert else (select Dauer_Einheit 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Dauer_formel' then Wert else (select Dauer_formel 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Ende' then Wert else (select Ende 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Ende_formel' then Wert else (select Ende_formel 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    (select "Aufgabengeber_(dessen_ID)" from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    (select Aufgabenverantwortlicher from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    (select "Pruefer_(dessen_ID)" from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    case when Eigenschaft = 'Ansprechpartner_(dessen_ID)' then Wert else (select "Ansprechpartner_(dessen_ID)" 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
     case when Eigenschaft = 'Ort' then Wert else (select Ort 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    case when Eigenschaft = 'Status' then Wert else (select Status 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end, 
    (select Aufgabengrund from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    (select Vorgaenger_ID from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    (select Typ_Typ_ID from Aufgabe a where Aufg_ID = a.Aufgaben_ID), 
    case when Eigenschaft = 'Version' then Wert else (select Version 
                  from Aufgabe a 
                  where Aufg_ID = a.Aufgaben_ID) end); 
    else 
    -- edit 
    if Eigenschaft = 'Beschreibung' then 
     update Aufgabe 
     set Beschreibung = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Beginn' then 
     update Aufgabe 
     set Beginn = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Beginn formel' then 
     update Aufgabe 
     set Beginn_formel = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Dauer' then 
     update Aufgabe 
     set Dauer = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Dauer formel' then 
     update Aufgabe 
     set Dauer_formel = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Dauer Einheit' then 
     update Aufgabe 
     set Dauer_Einheit = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Ende' then 
     update Aufgabe 
     set Ende = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Ende formel' then 
     update Aufgabe 
     set Ende_formel = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Ansprechpartner' then 
     update Aufgabe 
     set "Ansprechpartner_(dessen_ID)" = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Ort' then 
     update Aufgabe 
     set Ort = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Status' then 
     update Aufgabe 
     set Status = Wert 
     where Aufg_ID = Aufgaben_ID; 

    elsif Eigenschaft = 'Version' then 
     update Aufgabe 
     set Version = Wert 
     where Aufg_ID = Aufgaben_ID; 

    end if; 
    end if; 

    exception 
    when no_data_found then 
     dbms_output.put_line('Keine Daten'); 
    when excp then 
     dbms_output.put_line('Keine Aufgabe gefunden'); 
    when kein_eigenschaft then 
     dbms_output.put_line('Das ist keine Eigenschaft'); 
    when nicht_ver_eig then 
     dbms_output.put_line('Diese Eigenschaft kann nicht verändert werden'); 
    when nicht_ver_typ then 
     dbms_output.put_line('Eigenschaften dieses Aufgabentyps können nicht verändert werden'); 
end; 

什麼它實際上不會檢查如果輸入的值是有效的,如果這樣的話是否是特定任務的功能已經存在。如果存在,則編輯,如果不存在,則添加。

這是我的表

enter image description here

這是我得到的錯誤:

Fehlerbericht - ORA-00955: Es gibt bereits ein Objekt mit diesem Namen 00955. 00000 - "name is already used by an existing object"
*Cause:
Action:

+0

我刪除了SQL服務器的標籤,因爲我相信SQL服務器無關這個問題 – GuidoG

+0

你肯定bearbeiteAufgabe4是不是在數據庫中的現有對象?什麼「desc bearbeiteAufgabe4」返回? – rics

+0

如果無法創建過程,因爲其他名稱已經存在,那麼您不需要任何上述代碼來重現問題。該過程可能只包含'null;'並且你會得到相同的錯誤。 –

回答

1

如果你在程序的編譯此錯誤信息,那麼已經有另一個數據庫對象在數據庫模式中名稱爲bearbeiteAufgabe4。

可能是具有該名稱或可能是一個包的表。

select object_name,object_type 
from user_objects 
where object_name=upper('bearbeiteAufgabe4');