2016-11-10 3 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へのデータ。
  • テーブルkarticaの列kartica_idにデータがあるかどうかを確認します。
    • ある場合は、テーブルosobaの列kartica_idにそのIDを追加します。ない場合には、私が作成したシーケンスによってkartica表にkartica_idを追加し、テーブルosobakartica_idにその新しく作成されたkartica.kartica_idを追加
    • osobakartica

    Kartica_id

kartica_idは一意である必要があり、一つだけ kartica_idその正確なレコードの osoba内の1つのレコードの(人が追加しました)。

既に存在する場合kartica_idは、エラーメッセージ'Kartica_id already exists. No same values allowed.'を投げるとkarticaテーブルの隣に新しいkartica_id値を挿入し、テーブルosobakartica_idにその値を渡す同じ値のosoba.kartica_idに加えます。私はkartica_idためのシーケンスとしてkartica_seqを使用する解決策を掲載してい

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のレコードが存在するかどうかを確認する必要があります(カーソルで)。 レコードが存在する場合は、メッセージを表示します。 レコードが存在しない場合は、最初にテーブルkarticaにレコードを作成します。 osobaのユニークな値(シーケンス??)を使用します。そして、kartica_idの値とプロシージャの他の入力パラメータを使って、tabel osobaに新しいレコードを挿入します。 パラメータo_kartica_idの値がnullの場合はどうなりますか?両方のテーブルには何も挿入されていませんか? – wieseman

+0

パラメータo_kartica_idの値がnullの場合、kartica_idの表karticaに新しい値を挿入し、その値をosoba表のkartica_idに渡します。 – Rinma33

+0

別の 'insert'を2番目のテーブルに作り、同じシーケンス番号を再利用したいのですか?これを行うにはいくつかの方法があります(どちらも '二重'を含む)。 –

答えて

0

:これは私がこれまでに得たところであるので

私はPL/SQLに新たなんです。シーケンス名で置き換えるか、存在しない場合はシーケンスを作成してください。私にとって

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内のエラーとINSERTステートメント PLS-00103と18がある:記号「挿入」が発生しました次のいずれかを期待するとき: *&= - 中で+はMOD残りはその後 <指数(REMありません**)><>または!=または〜=> = <= <>などのようなもの2 like4 likec overlap between overlaps ||行:15 テキスト:osoba(osoba_id、ime_osobe、prezime_osobe、kartica_id)に挿入 – Rinma33

+0

2番目のifと変数cntkの名前をcnt2に変更する必要があります – Rinma33

+0

@ Rinma33はい、そうです。最初に投稿した 'dbms_output'にはtがありませんでした。おそらく最初にテストすべきです;) – Kacper

関連する問題