2016-11-10 107 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

相关问题