Einfaches Progrämchen

Status
Nicht offen für weitere Antworten.

chipmount

Aktives Mitglied
Hi Leute,
habe folgendes problemm:

habe 2 tabellen Bestellung(bestnr,...BESTSUM) und Bestellposition(bestnr,posnr,menge,preis)
möchte jetz folgendestun:
für die einzelnen Bestellungen die Bestelsumme (abhänig von dazugehörigen bestellpositionen ) berechnen und unter kolumne BESTSUM der Bestellung ablegen

bestnr,posnr preis sind nom type NUMBER rest ist VARCHAR2

oracle und jdbc funktionieren

code dazu :


Code:
import java.sql.*;
public class Bestellung {
	public static void main (String [] args) throws SQLException
	{
		try {
			Class.forName ("oracle.jdbc.driver.OracleDriver");
			Connection c = DriverManager.getConnection(
			"jdbc:oracle:thin:@..:1521:..", "", "");
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(
				"SELECT menge,preis,posnr FROM Bestellposition");
			Statement a = c.createStatement();
			ResultSet ra = a.executeQuery(
				"SELECT bestnr, bestsum FROM Bestellung");
						
		while (rs.next())
				{
				   int[] bnr = new int [10000];
				   int i=0, j=0;					
				  double [] summe = new double[10000];
				   String erg;
				   bnr [i] =rs.getInt(1);
				   summe [i]= (rs.getInt("menge")* rs.getDouble("preis"));
				    
				    erg= "" + summe[i];
				    	for (j=0; j<i; j++)
				    		{
				    		    if (bnr[i]== bnr[j])
				    			{
				    				summe[i]+= summe[j];
				    				
				    			}
			String sl ="UPDATE Bestellung SET bestsum=?, bestnr=?";
			PreparedStatement p = c.prepareStatement(sl);				    		
			p.setString(1, "erg");
			p.setString(2, "bestnr");
			p.executeUpdate();				
				    			
				    		}			
				
				 System.out.println
			(rs.getString ("bestnr")+ "\t" + 
			rs.getString ("menge")+ "\t" +									 
			rs.getString ("preis")+"\t" +				
			rs.getString ("posnr"));}//end while
								
											 
			    c.close();}//end try
			  catch (Exception e) {
			  	e.printStackTrace(); }
			  }//end main
	}//end Bestellung

meine fehlermeldung:

java.sql.SQLException: Ungültiger Spaltenname
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:5971)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1527)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1482)
at Bestellung.main(Bestellung.java:41)

zeile 41 ist das hier: "System.out.println"

ich weiss nicht mehr weiter

da ich ein anfänger binn würde ich mich über jeden tipp/verbesserungsvorschlag freuen

dancke
 
G

Guest

Gast
Versuch's mal damit
Code:
UPDATE Bestellung
SET BESTSUM = (
  SELECT SUM(p.preis*p.menge)
  FROM Bestellposition p
  WHERE p.bestnr = bestnr
)
 

chipmount

Aktives Mitglied
danke für den tipp aber kannst du mir bitte sagen wo ich die abfrage einbauen soll (in den try oder while körper)
danke
 
G

Guest

Gast
Nöö, nix Schleife. Lass SQL den Job tun ;)
Code:
 public static void main (String [] args)
  {
    Connection c = null;
    PreparedStatement p = null;
    try
    {
      Class.forName ("oracle.jdbc.driver.OracleDriver");
      c = DriverManager.getConnection("jdbc:oracle:thin:@..:1521:..", "", "");
      p = c.prepareStatement(
        "UPDATE Bestellung "
       +"SET BESTSUM = ("
       +"  SELECT SUM(p.preis*p.menge)"
       +"  FROM Bestellposition p"
       +"  WHERE p.bestnr = bestnr"
       +")"
      );
      p.executeUpdate();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      if(p!=null) { try { p.close(); } catch(Exception e){}}
      if(c!=null) { try { c.close(); } catch(Exception e){}}
    }
  }
 

abollm

Top Contributor
Anonymous hat gesagt.:
Nöö, nix Schleife. Lass SQL den Job tun ;)
Code:
...

Grundsätzlich ok, aber die richtige Ausführung des hier gesendeten Codes ist vom Tabellenaufbau abhängig. Du kannst dir in Abhängigkeit davon ohne weiteres mit dem geposteten Code falsche Einträge in deiner Tabelle "Bestellung" erzeugen lassen.

Grundsätzlich ist es aber immer besser über SQL oder PL/SQL zu gehen, als sich eigene Schleifen im Java-Programm zu bauen.
 
G

Guest

Gast
abollm hat gesagt.:
Grundsätzlich ok, ...
In anderen Fällen auch. :roll:
abollm hat gesagt.:
Du kannst dir in Abhängigkeit davon ohne weiteres mit dem geposteten Code falsche Einträge in deiner Tabelle "Bestellung" erzeugen lassen.
Ich hab's doch anhand der Angaben in der Fragestellung gemacht. Wo liegt das Problem?
Siehe: "2 tabellen Bestellung(bestnr,...BESTSUM) und Bestellposition(bestnr,posnr,menge,preis)"

abollm hat gesagt.:
Grundsätzlich ist es aber immer besser über SQL oder PL/SQL zu gehen, als sich eigene Schleifen im Java-Programm zu bauen.
Zumindest in einer Sache (fast) einer Meinung.
Dieses 'Grundsätzlich' lässt auf Zweifel schliessen. Du musst an Deinem Ego arbeiten ;)
 

abollm

Top Contributor
Anonymous hat gesagt.:
abollm hat gesagt.:
Grundsätzlich ok, ...
In anderen Fällen auch. :roll:
abollm hat gesagt.:
Du kannst dir in Abhängigkeit davon ohne weiteres mit dem geposteten Code falsche Einträge in deiner Tabelle "Bestellung" erzeugen lassen.
Ich hab's doch anhand der Angaben in der Fragestellung gemacht. Wo liegt das Problem?
Siehe: "2 tabellen Bestellung(bestnr,...BESTSUM) und Bestellposition(bestnr,posnr,menge,preis)"

abollm hat gesagt.:
Grundsätzlich ist es aber immer besser über SQL oder PL/SQL zu gehen, als sich eigene Schleifen im Java-Programm zu bauen.
Zumindest in einer Sache (fast) einer Meinung.
Dieses 'Grundsätzlich' lässt auf Zweifel schliessen. Du musst an Deinem Ego arbeiten ;)

Deinen leicht unsachlichen Ego-Quark (trotz Fröhlichkeitsanzeiger) einmal außer Acht gelassen, kann ich dir beruhigt mitteilen, dass ich problemlos falsche Einträge mit deinem Update-Code mit einer möglichen Tabellenstruktur (s.o.) erzeugt habe.

Als kleine Aufgabe für dich, der sich ja interessanterweise nur als "Gast" zu erkennen gibt, bleibt es jetzt herauszufinden, wie man deinen SQL-Code so verbessern kann, um das falsche Aktualisieren zu umgehen.
 
G

Guest

Gast
habe dise abfrage in sql eingegeben

Code:
UPDATE Bestellung 
SET BESTSUM = ( 
  SELECT SUM(p.preis*p.menge) 
  FROM Bestellposition p 
  WHERE p.bestnr = bestnr 
)

krige aber falsche werte raus
 
G

Guest

Gast
@abollm
OK, Du hast Recht, es hat einen Fehler. Kein Grund sich gleich künstlich aufzuregen.
Ist nicht meine Absicht jemanden zu beleidigen aber statt hier Rätsel und allgemeines
Zeug zu schreiben, hättest Du den Fehler nennen können. So ist erst ein Tag vergangen,
bis 'chipmount' eine funktionierende Lösung hat. (wenn er es inzwischen nicht anders gelöst hat)

Hier die korrekte Lösung:

UPDATE Bestellung
SET BESTSUM = (
SELECT SUM(p.preis*p.menge)
FROM Bestellposition p
WHERE p.bestnr = Bestellung.bestnr
)
 

abollm

Top Contributor
Anonymous hat gesagt.:
@abollm
OK, Du hast Recht, es hat einen Fehler. Kein Grund sich gleich künstlich aufzuregen.
Ist nicht meine Absicht jemanden zu beleidigen aber statt hier Rätsel und allgemeines
Zeug zu schreiben, hättest Du den Fehler nennen können. So ist erst ein Tag vergangen,
bis 'chipmount' eine funktionierende Lösung hat. (wenn er es inzwischen nicht anders gelöst hat)

Hier die korrekte Lösung:

UPDATE Bestellung
SET BESTSUM = (
SELECT SUM(p.preis*p.menge)
FROM Bestellposition p
WHERE p.bestnr = Bestellung.bestnr
)

@gast:

Es ist auch nicht meine Art, Rätsel aufzugeben. Aber nun ist es ja zur hoffentlichen Zufriedenheit aller zu Ende gebracht. Außerdem frage ich mich: künstliche Aufregung... :?:

Besten Gruß

Armin
 
G

Guest

Gast
Heißt es wir haben uns wieder lieb ;)

Künstlich Aufregen = Grundlos Aufregen, ohne es wirklich so zu meinen, oder so ähnlich...
 

abollm

Top Contributor
Anonymous hat gesagt.:
Heißt es wir haben uns wieder lieb ;)

Aber klar doch.

Künstlich Aufregen = Grundlos Aufregen, ohne es wirklich so zu meinen, oder so ähnlich...

Ich würde sagen: gar kein Aufregen.

Außerdem hatte ich doch gleich gemerkt, dass einer wie du das Thema richtig in den Griff bekommt, denn der Ansatz war super. :toll:
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben