将序列中的新id插入表列id,并将相同的id插入到没有双表的另一个表中

时间:2016-11-10 09:37:24

标签: plsql

我有一张桌子:

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添加到表kartica_id中的列osoba
    • 如果没有,则按照我创建的序列在kartica_id表中添加kartica,然后将新创建的kartica.kartica_id添加到表{{1}中的kartica_id }}。
osoba中的{p> Kartica_idkartica中的kartica_id必须是唯一的,osoba中的一条记录只有一个kartica_id才能获得该记录(人补充说)。

如果已将osoba添加到相同值的kartica_id,则抛出错误消息osoba.kartica_id并将下一个新'Kartica_id already exists. No same values allowed.'值插入kartica_id表并将该值传递给表kartica中的kartica_id

我是pl / sql的新手,所以这是我到目前为止的地方:

osoba

1 个答案:

答案 0 :(得分:0)

我正在发布解决方案,我使用kartica_seq作为kartica_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;