Avatar billede fastpoint Nybegynder
14. maj 2005 - 12:41 Der er 20 kommentarer og
1 løsning

For Update virker ikke

I vores Oraclei database kan vi ikke få vores FOR UPDATE til, at fungere. Er de forkert skruet sammen?

SELECT * FROM LAGERBEHOLDNING,MINIMUMLAGER WHERE LAGERBEHOLDNING.lagerBeholdningID = lagerBeholdning.lagerBeholdningID FOR UPDATE;
Avatar billede arne_v Ekspert
14. maj 2005 - 12:47 #1
Hvilken fejl får I ?
Avatar billede fastpoint Nybegynder
14. maj 2005 - 12:52 #2
SELECT * FROM LAGERBEHOLDNING,MINIMUMLAGER WHERE LAGERBEHOLDNING.lagerBeholdningID = lagerBeholdning.lagerBeholdningID FOR UPDATE

java.sql.SQLException: ORA-01002: hentning (FETCH) er ude af rækkefølge
Avatar billede fastpoint Nybegynder
14. maj 2005 - 12:55 #3
Den fejl kommer kun i vores application. Skrive vi sql sætningen direkte ind i oracle så kommer den ikke, men den låser heller ikke.
Avatar billede arne_v Ekspert
14. maj 2005 - 13:06 #4
googling antyder kraftigt at den fejl skyldes at I laver en COMMIT på
et forkert tidspunkt
Avatar billede fastpoint Nybegynder
14. maj 2005 - 13:36 #5
hele metoden

  public LagerBeholdning hentLagerBeholdning(int vareID)
  {
  ResultSet result;
  try
  {
  String query = "SELECT * FROM LAGERBEHOLDNING,MINIMUMLAGER WHERE LAGERBEHOLDNING.lagerBeholdningID = lagerBeholdning.lagerBeholdningID FOR UPDATE";
  System.out.println(query);
  result = connection.executeQuery(query); 
  query = "SELECT SEKTIONNAVN,ANTAL,MINIMUMLAGER,LAGERNAVN,VAREID,AARGANG FROM LAGEROVERSIGT WHERE vareid = "+vareID+" GROUP BY (SEKTIONNAVN,ANTAL,MINIMUMLAGER,LAGERNAVN,VAREID,AARGANG) ORDER BY SEKTIONNAVN";
  result = connection.executeQuery(query); 
     
  while(result.next())
  {
  if(result.getString("SEKTIONNAVN").equalsIgnoreCase("A"))
  antalPaSektion[0] = result.getInt("ANTAL");
  else if (result.getString("SEKTIONNAVN").equalsIgnoreCase("B"))
  antalPaSektion[1] = result.getInt("ANTAL");
  else if (result.getString("SEKTIONNAVN").equalsIgnoreCase("C"))
  antalPaSektion[2] = result.getInt("ANTAL");
  else if (result.getString("SEKTIONNAVN").equalsIgnoreCase("D"))
  antalPaSektion[3] = result.getInt("ANTAL");

  lagerNavn = result.getString("LAGERNAVN");
 
  }
 
  result.close();
  }catch(Exception ax)
  {
  System.out.println(ax.toString());
  }
return new LagerBeholdning(antalPaSektion[0],antalPaSektion[1],antalPaSektion[2],antalPaSektion[3],lagerNavn);
  }


men vi kom til at tænke på en ting. En vares antal bliver aldrig reduceret i databasen. Der bliver altid lagt mere til antallet! Vi udregner nemlig det antal der ikke er solgt eller reserveret udfra den SQL vi har spurgt dig om i vores andet spørgsmål:) så hvis du kan hjælpe der er problemet måske løst her!
Avatar billede fastpoint Nybegynder
14. maj 2005 - 13:44 #6
Måske lidt dårlig forklaret.

En sælger der skal se hvor meget han kan sælge af en vare får en liste frem vi genere ud fra en SQL sætning som trækker sum'en af Antal på de 4 sektioner fra sum'en af det samlede antal reserverede/solgte vare.

Du kan måske bedre forstå det når du ser det andet spørgsmål igen. Det er det vi prøvede at lave der.
Avatar billede fastpoint Nybegynder
14. maj 2005 - 13:54 #7
Du diskutere vi og vi har fundet ud af, at lageret bliver opdateret!
Så vi skal låse databasen så vi ved, at vi har de rigtige tal.

Vi vil hive dem op i java og opdatere tallene og sende de opdaterede værdier tilbage.
Avatar billede arne_v Ekspert
14. maj 2005 - 14:02 #8
jeg kan ikke se nogen update i ovenstående kode
Avatar billede fastpoint Nybegynder
14. maj 2005 - 15:21 #9
Ved du om hele tabellen låses eller er den kun den enkelte række der bliver låst?
Avatar billede arne_v Ekspert
14. maj 2005 - 15:23 #10
kun de rækker man selecter
Avatar billede fastpoint Nybegynder
14. maj 2005 - 15:27 #11
Burde denne her så ikke låse?

SELECT antal,vareid FROM LAGERBEHOLDNING,MINIMUMLAGER,SEKTION WHERE vareid = 12345678 AND minimumLager.lagerBeholdningID = lagerBeholdning.lagerBeholdningID AND lagerBeholdning.sektionID = Sektion.SektionID FOR UPDATE;

Vi har åbnet to vinduer med programmet SSH Secure Shell Client. I det ene vindue kaldte vi den linje du kan se og i den anden

SELECT antal,vareid FROM LAGERBEHOLDNING,MINIMUMLAGER,SEKTION WHERE vareid = 12345678 AND minimumLager.lagerBeholdningID = lagerBeholdning.lagerBeholdningID AND lagerBeholdning.sektionID = Sektion.SektionID;

men vi kan stadig få den frem? Den burde vel vente til den anden har kørt update?
Men vi har ellers fat i den rigtige række.
Avatar billede arne_v Ekspert
14. maj 2005 - 15:59 #12
og auto commit er slået fra ?
Avatar billede fastpoint Nybegynder
14. maj 2005 - 16:12 #13
Det skulle den gerne være pr. default i oracle, men kender ikke kommando'en til, at få det bekæftet desværre
Avatar billede arne_v Ekspert
14. maj 2005 - 20:25 #14
SHOW ALL
SET AUTOCOMMIT ON
SET AUTOCOMMIT OFF
Avatar billede arne_v Ekspert
14. maj 2005 - 20:26 #15
til at:
  checke
  slå til
  slå fra
Avatar billede fastpoint Nybegynder
14. maj 2005 - 20:39 #16
Den er slået fra:)

Kan vi på en eller anden måde lave en simpel test hvor kan finde ud af om vi overhovedet skrive vores FOR UPDATE korrekt?
Avatar billede arne_v Ekspert
14. maj 2005 - 20:42 #17
hvis syntaxen er forkert så får i fejl
Avatar billede arne_v Ekspert
14. maj 2005 - 20:43 #18
kan I fra vindue 2 lave en UPDATE af den række i har låst ?
Avatar billede fastpoint Nybegynder
14. maj 2005 - 20:48 #19
Vi prøver lige. Vi har faktisk glemt, at teste det eftersom vi troede man slet ikke kunne se rækken før UPDATE var blevet kaldt, men også fordi vi som sagt vi den fejl vi beskriver i indlæg to fra Java.
Avatar billede fastpoint Nybegynder
14. maj 2005 - 21:00 #20
den skriver 0 rows updated, men det gør den i begge vinduer, men tror ikke vi gør det rigtigt fordi vi joiner to tabeller.

Indholdet i tabel LAGERBEHOLDNING

LAGERBEHOLDNINGID      ANTAL  SEKTIONID
----------------- ---------- ----------
            10001        120          1
            10002        420          2
            10002        320          3
            10003        49          4
            10004        149          1

INDHOLDET I MINIMUMLAGER

MINIMUMLAGER  AARGANGID LAGERNAVNID    VAREID LAGERBEHOLDNINGID
------------ ---------- ----------- ---------- -----------------
          50      3333          1  12345678            10001
          50      3333          1  12345679            10002
          50      2222          2  12356789            10003
          50      1111          3  12347890            10004


hvordan opdatere man den første? sætter 50 til bare som et eksempel?

LAGERBEHOLDNINGID      ANTAL  SEKTIONID
----------------- ---------- ----------
            10001        120          1
Avatar billede fastpoint Nybegynder
24. maj 2005 - 10:11 #21
er som sagt løst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester