# SQL INSERT



## chipmount (5. Dez 2004)

habe 2 tabellen
bestellung und bestellposition

ich möchte ein insert machen 


```
........
try{ 
          
             String sql; 
             Connection c= null ; 
    sql ="INSERT INTO Bestellung(bestnr,name,bestelldatum)VALUES(?,?,?)"; 
        
    
      Class.forName ("oracle.jdbc.driver.OracleDriver"); 
      c = DriverManager.getConnection("jdbc:oracle:thin:@:1521:"", "", ""); 
      
        
      
      PreparedStatement p = c.prepareStatement(sql) ;             
      p.setString(1,"bestellung.bestnr"); 
      p.setString(2,"bestellung.name"); 
      p.setString(3,"bestellung.bestelldatum"); 
      p.executeUpdate(); 
      c.commit(); 
       p.close(); 
       c.close(); 
      
      
  } //end try 
    
    catch (Exception e) 
    { 
      e.printStackTrace(); 
    } //end catch 
.......
```

ich kann zwar werte einfügen aber kriege eine fehlermeldung "verstos gegen eindeutigkeit" weil bestnr ein pk_schlüssel in bestellposition ist

also wie kann ich die bestnr auch in bestellposition einfügen( in einer sql abfrage);
danke


----------



## Guest (5. Dez 2004)

Schau Dir den ersten gespeicherten Wert in der Datenbank an, dann siehst Du, was falsch ist.


----------



## chipmount (5. Dez 2004)

was meinst du damit der wert ist richtig oder ???:L 
meine überlegung ist die bestnr soll integer sein


----------



## Guest (5. Dez 2004)

Das hier ist der Fehler.

p.setString(1,*"bestellung.bestnr"*); 
p.setString(2,*"bestellung.name"*); 
p.setString(3,*"bestellung.bestelldatum"*);

Schau Dir die Werte der Spalten in der Datenbank an.


----------



## chipmount (5. Dez 2004)

ne hab schon rausgenommen
der selbe fehler Verstoss gegen eindeutigkeit!!


----------



## Guest (5. Dez 2004)

Bestellnr ist sicherlich ein Primärschlüsselfeld. 
Du versuchst mehrfach den gleichen Wert in die Datenbanktabelle einzufügen.


----------



## chipmount (5. Dez 2004)

nein
ich habe constrains angelegt und zwar
Bestellung(bestnr,...)
Bestellposition(bestnr,posnr...)

das heist wenn ich bestnr in bestellung ablegen möchte muss er in bestellposition auch vorhanden sein


----------



## Guest (5. Dez 2004)

chipmount hat gesagt.:
			
		

> das heist wenn ich bestnr in bestellung ablegen möchte muss er in bestellposition auch vorhanden sein


Eher umgekehrt.


----------



## chipmount (5. Dez 2004)

???:L 
oder so
also baruche ich eine sql anweisung die in bestnr in beide tabellen einfügt 

oder??


----------



## chipmount (5. Dez 2004)

wenn ich

```
insert into bestellposition(bestnr,posnr) value('6000','6');
commit;
```

fehlermeldung:
verstoß gegen Constrain übergeordn. schlüssel nicht gefunden


----------



## Guest (5. Dez 2004)

Ich sehe es so.
Eine Bestellung kann ohne Bestellpositionen angelegt werden, umgekehrt aber nicht.
Klartext: Du speicherst die Bestellung, dann die Bestellpositionen oder Du überträgst
alles auf einmal und machst es dann (die bessere Lösung; siehe sequence in IDL)

Vergiss für's erste Corba und mache es ohne die Corba-Schicht als reine Java Implementierung
wie ich Dir in dem Connector-Beispiel vorgeschlagen habe.
Wenn alles mit dem Anlegen, Ändern, Löschen etc. funktioniert, dann baust Du die Corba
Schicht dazu.

Also statt
<CLIENT> <--> <CONNECTOR> <-- Netzwerk --> <CORBA-Servant> <--> <DB-Klasse>

zuerst mal so:
<CLIENT> <--> <CONNECTOR> <--> <DB-Klasse>


----------



## chipmount (5. Dez 2004)

ich brauche nichts mehr auser diese scheis schlüssel rauszunehmen oder die abhänigkeiten zu änder am sonsten funk. alles


----------



## chipmount (5. Dez 2004)

habe jetzt die constraints deaktiviert
nur aus irgendeinem grung erscein in er tabelle bestellung 
2 mal
6000,test,12.12.2004
was soll das jetz??


----------



## abollm (6. Dez 2004)

chipmount hat gesagt.:
			
		

> habe jetzt die constraints deaktiviert
> nur aus irgendeinem grung erscein in er tabelle bestellung
> 2 mal
> 6000,test,12.12.2004
> was soll das jetz??



Ich nehme aufgrund aller deiner bisherigen Angaben einmal folgende Randbedingungen an:

Deine Tabelle "Bestellung" enthält mindestens die folgenden Spalten:

BESTNR
NAME
BESTELLDATUM

Für diese Tabelle hast du einen Primary Key (Primärschlüssel) angelegt, d.h. am 
besten für die Spalte BESTNR, die damit eindeutig sein _muss_.

Weiterhin nehme ich an, deine Tabelle "Bestellposition" enthält _mindestens_ die folgenden Spalten:

POSNR
BESTNR -> das entspricht dem Fremdverweis auf die Tabelle "Bestellung" und dort 
          der eindeutigen Spalte BESTNR
(MENGE
PREIS) -> nicht unbedingt notwendig, hatte ich mir nur gemerkt aus einem anderen Fall von dir

Dann hast du auch der Tabelle "Bestellposition" einen Primary Key hinzugefügt, der sich aus den Spalten

BESTNR
POSNR

zusammensetzt. Diese beiden Spalten müssen in der Kombination also eindeutig 
sein, ansonsten meldet dir Oracle halt eine "Unique Constraint Violation".

Wenn das alles so ist, beide PKs aktiviert sind. dann muss folgende SQL-
Einfügeoperation (Datentypen jeweils VARCHAR2 bzw. DATE) in z.B. _"SQL*Plus"_
erfolgreich, d.h. ohne Fehlermeldung durchlaufen, sofern nicht bereits 
entsprechende Daten vorhanden sind:


```
INSERT INTO bestellung
(BESTNR,BESTSUM,NAME,BESTELLDATUM)
VALUES
('5',NULL,'Meier',to_date('01.12.2004','DD.MM.YYYY'))
/
```

Zusätzlich zu den sehr nützlichen Hinweisen von Gast noch folgender Tipp:

Sich immer erst die Datenstruktur(en) vollständig verdeutlichen. Dann auf der 
Datenbankebene mit den Oracle- (SQL*PLus, Enterprise-Manager etc.) oder mit 
anderen Tools (Toad, SQL-Navigator etc.) testen und erst dann in Java umsetzen. 
Du ersparst dir im Regefalll mit dieser Vorgehensweise Arbeit, sofern du nicht ein 
Voll-Profi im Bereich SQL bzw. PL/SQL bist (was ich aber aus den bisherigen 
Postings einmal ausschließen möchte).

Übrigens: Wenn du die PKs deaktivierst, dann ist es kein Wunder, wenn du doppelte 
Datensätze erhältst.

Hoffe dir geholfen zu haben.


----------



## Bleiglanz (6. Dez 2004)

> habe jetzt die constraints deaktiviert
> nur aus irgendeinem grung erscein in er tabelle bestellung
> 2 mal
> 6000,test,12.12.2004
> was soll das jetz??


aus irgend einem schrägen grund (der NICHTS mit JDBC und SQL zu tun hat) wird der Insert zweimal aufgerufen, überprüf mal die Logik deines Programms...

wenn du das zweimalige Einfügen des gleichen Datensatzes verhindert hast, dann kannst du auch den Primärschlüssel-Constraint wieder aufnehmen!


----------



## chipmount (6. Dez 2004)

schön und gut aber ich sehe den fehler NICHT  :cry:


----------



## abollm (6. Dez 2004)

chipmount hat gesagt.:
			
		

> schön und gut aber ich sehe den fehler NICHT  :cry:



Sende doch einmal deinen Code, mit dem du die doppelten Datensätze erzeugt hast, dann können wir dir besser helfen.


----------



## Guest (6. Dez 2004)

Das Testprogramm zwei Mal ausgeführt und schon ist das Drama da.

Was Du falsch machst?

Du gehst verdammt unsystematisch und total planlos an die Sache ran.
Du versuchst alles auf einmal zu machen, statt zuerst einen Teil vom
ganzen fertig zu kriegen.
Schreib' einfach zuerst paar Klassen/Methode für den Zugriff auf die Datenbank 
und teste es ordentlich aus. Danach kannst Du den Rest angehen. Systematisch
eins nach dem anderen. Und das Corba-Woodoo ganz zum Schluß.


----------



## chipmount (7. Dez 2004)

problem gelöst fehler war in sql 

danke


----------

