Oracle - Exception "DUP_VAL_ON_INDEX" Probleme

F.o.O.v.S.

Cadet 3rd Year
Registriert
Mai 2005
Beiträge
42
Hallo,

Ich habe eine Tabelle (AVS_XNAME) mit drei Spalten
ID____ int _____Not Null
Vorname_ varchar2__ Not Null
Nachname_ varchar2__Not Null

Die Constraints:
ID ist Primary Key
Vorname und Nachname Unique Key

So jetzt gibts eine einfache Procedure:
CREATE OR REPLACE PROCEDURE AVS_XNAME_INSERT
(
ID in int,
Vorname in varchar2,
Nachname in varchar2,
errorMsg out varchar2
)
AS
BEGIN
INSERT INTO AVS_XNAME (ID,Vorname,Nachname)
values (SEQ_AVS_XNAME.NEXTVAl,Vorname,Nachname);
//SEQ_AVS_XNAME = Sequenz die von 1 in einer SChritten nach oben zählt

EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
errorMsg := SQLERRM;
RAISE;
WHEN OTHERS THEN
RAISE;


END AVS_XNAME_INSERT;

Ich möchte einfach überprüfen ob schon ein Vor- oder Nachname in der Tabelle vorhanden ist. Das ganze möchte ich in VB auswerten und je nach dem eine ErrorMsg werfen. Somit bekommt dann der User die passende Msg(ob nun der Vorname oder schon der Nachname vorhanden ist //oder beides).

Das Problem dabei ist das ich anhand der zurück gegeben ErrorMsg nicht weiß ob nun der Vorname oder der Nachname schon vorhanden ist.

Meine Frage: Wie bekommt man raus welcher der Indexe gemeint ist. Gibt es noch andere Möglichkeiten in Oracle.
 
Erzeugst du für Vor- und Nachname jeweils einen Unique Key? Das halte ich für den Zweck für ungeeignet.
Denk mal dran, wie oft manche Namen vorkommen. Da sowohl Vor- als auch Nachname vorkommen, halte ich es für sinnvoller einen Unique Key auf ID, Vorname und Nachname zu verwenden.
 
das ist nur eine Test Tabelle ... dazu kommen noch Birthdate und Addresse. Das dürfte jede dopplung ausschliesen.
Das ist aber nicht das problem(erstmal beseite lassen)
 
Das Problem ist, daß die Exception nur sagt "es ist etwas schief gegangen", aber nicht mitteilt was. Ein Weg das zu umgehen, wäre eine Prüfung im Exception-Block, ob der als Parameter übergebene Nachname schcon in der Tabelle existiert:
Code:
exception
  when dup_val_on_index then
    select count(nachname) into nachname_count from avs_xname where avs_xname.nachname = nachname;
    if  nachname_count > 0 then
      errmsg = 1;
    else
      errmsg = 2;
    end if;
  end;
Ist jetzt mal ungetestet, aber so oder so ähnlich müsste es funktionieren. Die Variable nachname_count muss natürlich deklariert werden.
 
mmh ... mir ist noch ne andere methode eingefallen das ganze über die sys Tabellen zumachen...
Ich werd deinen vorschlag mal ausprobieren, nur wollte ich zuviele IF's //Prüfungen// eigentlich aus dem weg gehen da die Systemleistung doch ab ner gewissen menge daten leiden dürfte

aber ertsmal danke :);)
 
Zurück
Oben