Zapytania do baz danych SQL

0

Witam.
Mama problem z zapytaniami kierowanymi do SQL Oracla 11g.
Poniżej fragment metody(tak wiem wiele dziwnych zmiennych mniejsza o to):

private void ObslugaZapytaj(){
   try{
      String sql;
      String sqlpytanie;
      System.out.println("Laczenie z baza danych ");
      Connection conn = DriverManager.getConnection(DB,USER,PASS);
      Statement stmt = conn.createStatement(
      ResultSet.TYPE_SCROLL_SENSITIVE,
      ResultSet.CONCUR_UPDATABLE);//Statement stmt = conn.createStatement();
      conn.setAutoCommit(false);

      temporary = opisProd.getSelectedItem().toString()+"";
      //sqlpytanie = "Select * from produkty natural join cena where opis_produktu='Kajzerka'";//+ temporary+"'";
      sqlpytanie="Select dostepnosc, produkt_id from produkty  where opis_produktu='"+temporary+"'";

      System.out.println(sqlpytanie);

      ResultSet rs = stmt.executeQuery(sqlpytanie);
      System.out.println(rs);
      while(rs.next()!=false){
         System.out.println("jestem w while");
         //tmp = rs.getString("Cena_Sklepowa");  
         tmp1 = rs.getString("Dostepnosc");  
         tmp = rs.getString("produkt_id"); 
         System.out.println(tmp);
      } 

      sql="SELECT Cena_Sklepowa From Cena where produkt_id =";
      sql+=tmp;
      System.out.println(sql);
      ResultSet res = stmt.executeQuery(sql);
      System.out.println(res);

      while(res.next()){
         System.out.println("jestem w while TYM DRUGIM !!!!");
         //tmp = rs.getString("Cena_Sklepowa");
         cena = rs.getString("Cena_Sklepowa");
         stawka = rs.getString("Jednostka");
         System.out.println(tmp);
      }

      JOptionPane.showMessageDialog(new JFrame()," ILOSC PRODUKTOW "+ tmp1 + " Cena  " + stawka);

      conn.commit();
      stmt.close();
      //stm.close();
      conn.close();
   }catch (Exception e){
      System.err.println(e.getMessage());
}

}

Problem jest tej materii, iż zapytanie

Select dostepnosc, produkt_id from produkty  where opis_produktu

jest wykonywane bez problemu. Gdy potem przychodzi do zadania pytania poniżej

SELECT Cena_Sklepowa From Cena where produkt_id = 

już do pętli while nie wchodzi nie wiem dlaczego. Jak probuje wszystko wczytać na raz

Select * from produkty natural join cena where opis_produktu='Kajzerka

to oczywiście nie wchodzi do pierwszego while i nic nie wczytuje.

Ktoś wie czemu tak się dzieje ?
Pytania w SQL developer dają poprawne wyniki. Nie są to żadne nulle tylko wartości jakich się spodziewam.
Baza nie jest w żaden sposób pusta

zmniejszenie wcięć w kodzie - fp

0

bo pewnie id w tabeli cena się nie nazywa produkt_id tylko jakoś inaczej
nie wiem, bo nie podałeś schematu tabel

0

Problem leży po stronie javy.
Pytanie zadanie w SQL Developer daje oczekiwaną odpowiedź.
Pytanie wykonane za pomocą ResultSet res = stmt.executeQuery( ); jest wykonywane ale jakby w odpowiedzi nie uzyskiwał nic. Nie wchodzi do drugiej pętli while w ogóle.
Wszystkie zapytania po wyżej działają dobrze w SQL Developer ale w platformie Java już nie uzyskuje tych wyników.
Próbowałem wielu możliwości ale efekt jest ŻADEN :(
Nie wiem czy w metodzie można zadać tylko jedno zapytanie i to krótkie ?

0

Niczym sito.
Nie ma żadnych warnings a zapytanie drugie dalej nie wchodzi do pętli while

0

Wyświetl jeszcze wartość zmiennej tmp. Czy na pewno jest taka jak oczekujesz?

0

"Laczenie z baza danych
Select dostepnosc, produkt_id from produkty where opis_produktu='Kajzerka'
oracle.jdbc.driver.UpdatableResultSet@480e23
jestem w while
2
SELECT cena_sklepowa From cena where produkt_id = '2'
oracle.jdbc.driver.UpdatableResultSet@1106021 "

To otrzymuje z konsoli. Wartość produkt_id = 2 jest wartością oczekiwaną

 SELECT cena_sklepowa From cena where produkt_id ='2' 

wpisane do SQL Dev Daje oczewkiany wynik cena_sklepowa 3
Teraz wyświetliłem sobie po drugim zapytaniu

 System.out.println(res.next()); 

I dostałem niestety false dlatego nie wchodzi w while.
Tylko pytanie dlaczego dostaje false ? W jednej metodzie tylko jedno zapytanie ?

0

produkt_id = 2 jest wartością oczekiwana

A Ty porównujesz z '2'.

0

Naprawdę możliwości już dokonałem wielu
porównanie z '2' czy z 2 czy z jedną spacją przed = bez spacji; wszystko sklejone czyli produkt_id=2
Łączy je jedno: FALSE dla zapytania nr dwa

0

Drogi duchu
Sprawdzałem z zapytaniem na sztywno w javie (z palca wpisane całe zapytanie) i efekt żaden (kontekst oczywiście zapytania nr dwa).
Ostatnio próbuję z takim oto zapytaniem

 Select dostepnosc, cena_sklepowa from produkty natural join cena  where opis_produktu='Kajzerka' 

Wpisuję go na sztywno do javy i

  System.out.println(rs.next()); 

daje wynik false. Biorę i copy paste zapytanie do SQL Developer i run i uzyskuje taki wynik jakiego się spodziewam.
Jak napisałem we wstępie każde zapytanie jakie kieruje z javy kopiuje bezpośrednio do SQL developera i mam dwa rozbieżne wyniki.
Nie wiem dlaczego jest tak więc pisze tutaj licząc na pomoc.

0

wariant numer jeden :

sqlpytanie="Select dostepnosc, produkt_id from produkty  where opis_produktu='"+temporary+"'"; 

Odpowiedź na to zapytanie

Select dostepnosc, produkt_id from produkty  where opis_produktu='Kajzerka'
oracle.jdbc.driver.UpdatableResultSet@480e23
jestem w while
2

potem jest drugie zapytanie

sSELECT cena_sklepowa From cena where produkt_id=2;

odpowiedź

SELECT cena_sklepowa From cena where produkt_id=2
oracle.jdbc.driver.UpdatableResultSet@1106021
false

Ostanie false tyczy się tego czy jest res.next().

wariant nr dwa

sqlpytanie = "Select dostepnosc, cena_sklepowa from produkty natural join cena  where opis_produktu='"+temporary+"'"; 

odpowiedź z konsoli
Laczenie z baza danych
Select dostepnosc, cena_sklepowa from produkty natural join cena where opis_produktu='Kajzerka'
oracle.jdbc.driver.ScrollableResultSet@1a6a354
false
False tyczy się tego czy jest rs.next().

Oczywiscie to co wyrzuca konsola kopiuje do SQL Developer i tam nie ma problemu ze znalezieniem

0

według mnie brak sterownika do oracle db odpowiedniego połączenia do db co można stwierdzić po oracle.jdbc.driver.UpdatableResultSet@1106021 Na twoim miejscu napisał bym klase typu Conn do łączenia z DB coś typu Conn(user,pass,ip,port,baza) potem już w bloku try dajesz driver, statment i co tam jeszcze ci potrzeba do podstawowego połączenia. metody poza. Nie mówie że może być tak jak pisze, ale jak z jdbc to robisz to jest to prawie pewne, url powinien zawierać "jdbc:oracle"

0

Grzebałem dalej i grzebałem polecono zrobić

 	try{
			
			String where ="";
			String ustaw, sqlpomoc;	
			int pomocnicza ;
			System.out.println("Laczenie z baza danych ");
			Connection conn = DriverManager.getConnection(DB,USER,PASS);
			 conn.setAutoCommit(false);
			Statement stmt = conn.createStatement(
		            ResultSet.TYPE_SCROLL_SENSITIVE,
		            ResultSet.CONCUR_UPDATABLE);       
			Statement nowy = conn.createStatement(
					 ResultSet.TYPE_SCROLL_SENSITIVE,
			            ResultSet.CONCUR_UPDATABLE); 
		
			temporary = opisProd.getSelectedItem().toString()+"";
			if(!Dostepnosc.getText().equals("")){where +=" Dostepnosc="+"'"+Dostepnosc.getText()+"'AND";};
			sqlpytanie="Select dostepnosc, produkt_id from produkty where opis_produktu=?";
			PreparedStatement stm1 = conn.prepareStatement(sqlpytanie);
			stm1.setString(1, temporary);
			ResultSet rs = stm1.executeQuery();
			while(rs.next()){
	        	System.out.println("jestem w ifie");
	        	tmp1 = rs.getString("Dostepnosc");  	
	        	tmp = rs.getString("produkt_id"); 
	        	       	  
	       }  
			pomocnicza= Integer.parseInt(tmp1) - Integer.parseInt(Dostepnosc.getText());
			ustaw = "Update Produkty set dostepnosc="+pomocnicza+""+"where produkt_id="+tmp;
			System.out.println(pomocnicza);
			System.out.println(ustaw);
			System.out.println(tmp);
			nowy.executeUpdate(ustaw);
			sqlpomoc="Select cena_dostawa from cena where produkt_id= ?";
			
			PreparedStatement stm2 = conn.prepareStatement(sqlpomoc);
			stm2.setInt(1, Integer.parseInt(tmp));
			System.out.println(sqlpomoc);
			 ResultSet res = stm2.executeQuery();
			 System.out.println(res);
			 if(res.next()){
		        	System.out.println("jestem w po drugim pytaniu");
		        	cena = res.getString("cena_dostawa");  	
			 }
			 JOptionPane.showMessageDialog(new JFrame()," ILOSC PRODUKTOW "+ tmp1 + " Cena  " + cena);
			 
		     //   updateTotal = conn.prepareStatement(updateStatement);
			 stmt.close();  
			conn.commit();
			stmt.close();
			nowy.close();
			conn.close(); 

Tylko teraz problem jest w drugim PreparedStatement stm2 bo nie zastępuję ? żądanym Stringiem. Co powinienem zmienić?

Kolejna rzecz dziwna tworze z palca w SQL Developer dane do dwóch encji -> produkt oraz cena (tabele są całkowicie uzupełnione nie ma żadnego błędu).
Następnie z poziomu Javy wysyłam polecenie update pola dostępność (metoda jest widoczna we fragmencie kodu) i jest ono wykonywane.

Teraz sytuacja inna bo tworze dane do dwóch encji -> produkt oraz cena z *poziomu Javy * i też są tworzone bez problemu.
Następnie z poziomu Javy wysyłam polecenie update pola dostępność(metoda jest widoczna we fragmencie kodu) i TERAZ ona nie jest wykonywana (sprawdzam w SQL developer i nie ma żadnych zmian choć być powinna).

Dlaczego tak się dzieje? Jak się tego pozbyć ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1