2016-11-10 78 views
0

我有一個表:從序列插入新的ID爲表列ID和插入相同的id到另一個表沒有雙表

create table osoba (osoba_id number, 
        ime_osobe varchar2(200), 
        prezime_osobe varchar2(200), 
        kartica_id number) 

create table kartica (kartica_id number, 
         dozvoljen_ulaz_id number) 

我需要做的過程,

  • 插入數據輸入表osoba
  • 檢查表karticakartica_id中是否有數據。
    • 如果有,請將該ID添加到表osoba中的列kartica_id
    • 如果沒有,則按照我創建的順序在kartica表中添加kartica_id,然後在表osoba中將新創建的kartica.kartica_id添加到kartica_id

Kartica_idkarticakartica_idosoba必須是唯一的,只有一個kartica_idosoba一個記錄,準確的記錄(添加人員)。

如果已經有一個kartica_id加入到相同的值osoba.kartica_id則拋出錯誤信息'Kartica_id already exists. No same values allowed.'並插入下一個新kartica_id價值kartica表和值傳遞給kartica_idosoba

我是新來的PL/SQL所以這是我到目前爲止:

create or replace procedure insertOsoba 
    (o_osoba_id in osoba.osoba_id%type default generate_id.nextval, 
    o_ime_osobe in osoba.ime_osobe%type, 
    o_prezime_osobe in osoba.prezime_osobe%type, 
    o_kartica_id in kartica.kartica_id%type default null --must be optional 
    ) 
is 
begin 
     insert into osoba (osoba_id,ime_osobe,prezime_osobe,kartica_id) 
     values (o_osoba_id,o_ime_osobe,o_prezime_osobe,o_kartica_id); 
end insertosoba; 
+0

對我來說是非常困難的閱讀和理解你的問題。 但首先,您必須檢查(使用光標)是否存在具有參數o_kartica_id的給定值的tabel kartica中的記錄。 如果記錄存在,則顯示該消息。 如果記錄不存在,則首先在表卡丁車中創建一條記錄;使用osoba的唯一值(sequence?)。然後使用kartica_id的值和過程的其他輸入參數將新記錄插入tabel osoba。 如果參數o_kartica_id的值爲空,該怎麼辦?什麼也沒有或在兩個表中都插入? – wieseman

+0

如果參數o_kartica_id的值爲null,則在kartica_id的表kartica中插入新值,並將該值傳遞給osoba表中的kartica_id。 – Rinma33

+0

你的意思是你想要在另一個表中插入另一個'insert'並重復使用相同的序列號?有幾種方法可以做到這一點(並且它們都不涉及「雙重」)。 –

回答

0

我張貼解決方案,我用kartica_seqkartica_id序列。請用您的序列名稱替換它或創建序列(如果它不存在)。

create sequence kartica_seq start with 1 increment by 1;

create or replace procedure insertOsoba 
    (o_osoba_id in osoba.osoba_id%type default generate_id.nextval, 
    o_ime_osobe in osoba.ime_osobe%type, 
    o_prezime_osobe in osoba.prezime_osobe%type, 
    o_kartica_id in kartica.kartica_id%type default null --must be optional 
    ) 
is 
cnt number; 
cnt2 number; 
begin 
     select count(*) into cnt from osoba where kartica_id = o_kartica_id; 
     select count(*) into cnt2 from kartica where kartica_id = o_kartica_id; 
     if(cnt = 0) then 
     --there is no person with such kartica and user passed existing kartica_id 
     if(o_kartica_id is not null and cnt2 > 0) then 
      insert into osoba (osoba_id,ime_osobe,prezime_osobe,kartica_id) 
      values (o_osoba_id,o_ime_osobe,o_prezime_osobe,o_kartica_id); 
     --there is no person with such kartica but we need to create one entry using sequence 
     else 
      insert into kartica (kartica_id) values (kartica_seq.nextval); 
      insert into osoba (osoba_id,ime_osobe,prezime_osobe,kartica_id) 
      values (o_osoba_id,o_ime_osobe,o_prezime_osobe,kartica_seq.currval); 
     end if; 
     end if; 
     --there is person with such kartica 
     if(cnt > 0) then 
     dbms_output.put_line('Kartica_id already exists. No same values allowed.'); --or raise an exception here 
     end if; 
     commit; 
end insertosoba; 
+0

第15行和第18行有INSERT語句存在錯誤 PLS-00103:遇到下列其中一項時遇到符號「INSERT」: *&= - + at in是mod餘數不rem然後 <指數( **)><>或!=或〜=> = <= <>和或類似於2 like4 likec between overlapping || multiset年份會員 Line:15 文本:插入到osoba(osoba_id,ime_osobe,prezime_osobe,kartica_id) – Rinma33

+0

需要把第二秒後如果和變量cntk重命名爲cnt2 – Rinma33

+0

@ Rinma33是的,你是對的。在我首先發布並測試過的'dbms_output'中也缺少t。應該首先測試;) – Kacper

相關問題