/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[oracle] next og last
Fra : def


Dato : 15-05-01 22:29

Hej, jeg skal lave et program i Java (JDBC) og en database (Oracle). Nu er
jeg lidt "ny" hvad DB angår og derfor disse spørgsmål:
Jeg har 3 tabeller (faktur, kunde,vare); Faktur- tabel har en primær nøgle
(fakturnr) og en fremmed nøgle (kundenr). Kunde-tabel har en primær nøgle
(kundenr). Vare-tabel har en primær nøgle (varenr). Endvidere har jeg
oprettet en relation (id) hvis primære nøgle er (fakturnr, varenr), og disse
2 attributer er samtidigt fremmednøgler (hver for sig) som hermed
"forbinder" faktur-tabel og vare-tabel. Dvs. faktur-tabel og kunde-tabel er
forbundet via en fremmednøgle, kundenr, ("usynlig" relation), og
faktur-tabel og vare-tabel er forbundet via en id-tabel (relation) som
består af to fremmednøgler (fakturnr, varenr).
I forbindelse med disse tabeller har jeg oprettet 3
Sequencer(fakturnr,kundenr,varenr) idet alle primære nøgler i alle 3
tabeller skal kunne autonummereres. Og det fungerer fint. Men nu har jeg
flere problemer:
1. når jeg starter programmet så skal det gerne vise "faktur nr." i et felt.
Men for at kunne se de rigtige oplysninger så skal jeg spørge databasen om
en bestemt kollones næste værdi. Hvordan gør jeg det. Er der noget der
hedder "Select fakturnr.NEXT from faktur"?

2. Faktur-tabel og kunde-tabel: når jeg indsætter værdierne i kunde-tabel så
bruger jeg:
INSERT INTO kunde VALUES (kundenr.NEXTVAL,'mitnavn', 'mitefternavn'...);
men når jeg så skal indsætte værdierne i faktur-tabel så skal jeg "kende"
NEXTVAL i kunde-tabel idet denne er fremmednøgle i faktur-tabel. Hvordan
finder jeg ud af hvad sidste værdi i en kollone er (vist noget med LAST)?
Kan man skrive noget i stillen med:
INSERT INTO faktur VALUES(fakturnr.NEXTVAL, LAST-VALUE-FROM-KUNDE, .....)?

eller kan det bare gøres via JDBC?

på forhånd tak

mvh Dejan






 
 
def (16-05-2001)
Kommentar
Fra : def


Dato : 16-05-01 00:54

Ok, nu fandt jeg ud af noget:
Hvis jeg vil se den aktuelle værdi så er komandoen:
SELECT kundenr.CURRVAL FROM DUAL;
(man kan også skrive:
select * from (select kundenr from kunde)
where kundenr > ( select (max(kundenr)-1) from kunde);)

og næste værdi fås med:
SELECT kundenr.NEXTVAL FROM DUAL;

Simpelt nok, meeen, det er vel ikke meningen at alt skal fungere fint.
Når jeg "inserter" værdierne (samt kundenr.nextval) så er alt fint nok.
værdierne bliver indsat fint (første,anden.tredje, fjerde). Når jeg afprøver
er alt fint:
SELECT kundenr,kundenavn FROM kunde;

kundenr kundenavn
--------- -----------
2 anden
3 tredje
4 fjerde
1 første

og både nextval og currval viser det rigtige. Men når jeg så efter "SELECT
kundenr.NEXTVAL FROM DUAL" indsætter nye værdier
f.eks femte og sjette kunde, og så kører:
SELECT kundenr, kundenavn FROM kunde;
får jeg:

kundenr kundenavn
---------- ------------
2 anden
3 tredje
4 fjerde
6 femte (??????????)
7 sjette
1 første

Dvs efter jeg har kørt NEXTVAL FROM DUAL så sker der noget.
Jeg har prøvet at bruge:
ALTER SEQUENCE kundenr NOCACHE;
SELECT kundenr.NEXTVAL FROM DUAL;
ALTER SEQUENCE kundenr CACHE;

men det giver samme resultat.

Jeg skal nævne at alt fungerer fint hvis jeg "spørger"
SELECT kundenr.CURRVAL FROM DUAL;
Det er kun i tilfælde af "nextval" at den "hopper over"

Er der nogen der ved hvorfor og hvordan kan det ordnes?

mvh Dejan


"def" <spades@worldonline.dk> skrev i en meddelelse
news:I9hM6.12109$zv2.1600714@news010.worldonline.dk...
> Hej, jeg skal lave et program i Java (JDBC) og en database (Oracle). Nu er
> jeg lidt "ny" hvad DB angår og derfor disse spørgsmål:
> Jeg har 3 tabeller (faktur, kunde,vare); Faktur- tabel har en primær nøgle
> (fakturnr) og en fremmed nøgle (kundenr). Kunde-tabel har en primær nøgle
> (kundenr). Vare-tabel har en primær nøgle (varenr). Endvidere har jeg
> oprettet en relation (id) hvis primære nøgle er (fakturnr, varenr), og
disse
> 2 attributer er samtidigt fremmednøgler (hver for sig) som hermed
> "forbinder" faktur-tabel og vare-tabel. Dvs. faktur-tabel og kunde-tabel
er
> forbundet via en fremmednøgle, kundenr, ("usynlig" relation), og
> faktur-tabel og vare-tabel er forbundet via en id-tabel (relation) som
> består af to fremmednøgler (fakturnr, varenr).
> I forbindelse med disse tabeller har jeg oprettet 3
> Sequencer(fakturnr,kundenr,varenr) idet alle primære nøgler i alle 3
> tabeller skal kunne autonummereres. Og det fungerer fint. Men nu har jeg
> flere problemer:
> 1. når jeg starter programmet så skal det gerne vise "faktur nr." i et
felt.
> Men for at kunne se de rigtige oplysninger så skal jeg spørge databasen om
> en bestemt kollones næste værdi. Hvordan gør jeg det. Er der noget der
> hedder "Select fakturnr.NEXT from faktur"?
>
> 2. Faktur-tabel og kunde-tabel: når jeg indsætter værdierne i kunde-tabel

> bruger jeg:
> INSERT INTO kunde VALUES (kundenr.NEXTVAL,'mitnavn', 'mitefternavn'...);
> men når jeg så skal indsætte værdierne i faktur-tabel så skal jeg "kende"
> NEXTVAL i kunde-tabel idet denne er fremmednøgle i faktur-tabel. Hvordan
> finder jeg ud af hvad sidste værdi i en kollone er (vist noget med LAST)?
> Kan man skrive noget i stillen med:
> INSERT INTO faktur VALUES(fakturnr.NEXTVAL, LAST-VALUE-FROM-KUNDE, .....)?
>
> eller kan det bare gøres via JDBC?
>
> på forhånd tak
>
> mvh Dejan
>
>
>
>
>



0405rl (16-05-2001)
Kommentar
Fra : 0405rl


Dato : 16-05-01 09:19

Hej Dejan

Vedr. Sequencer.
CURRVAL = sidste brugte værdi fx. i.f. autonummerer.
NEXTVAL = næste ledige værdi fx. i.f. autonummerer.

Dvs. at du kan ikke benytte dig af 'NEXTVAL' til at få det næste nr. i en liste med mindre at det altså er det du ønsker 'næste ledige værdi'.

En måde hvorpå du kan spole frem og tilbage i det RecordSet du får efter et kald til en DB via JDBC, er:

ResultSet rs = stmt.execute ("SELE.......");

rs.first(); // første element i RecordSet'et
rs.previous(); forrige element i RecordSet'et
rs.next(); næste element i RecordSet'et
rs.last(); sidste element i RecordSet'et

/René

"def" skrev d. 16-05-01 00:54 dette indlæg :
> Ok, nu fandt jeg ud af noget:
> Hvis jeg vil se den aktuelle værdi så er komandoen:
> SELECT kundenr.CURRVAL FROM DUAL;
> (man kan også skrive:
> select * from (select kundenr from kunde)
> where kundenr > ( select (max(kundenr)-1) from kunde);)
>
> og næste værdi fås med:
> SELECT kundenr.NEXTVAL FROM DUAL;
>
> Simpelt nok, meeen, det er vel ikke meningen at alt skal fungere fint.
> Når jeg "inserter" værdierne (samt kundenr.nextval) så er alt fint nok.
> værdierne bliver indsat fint (første,anden.tredje, fjerde). Når jeg afprøver
> er alt fint:
> SELECT kundenr,kundenavn FROM kunde;
>
> kundenr kundenavn
> --------- -----------
> 2 anden
> 3 tredje
> 4 fjerde
> 1 første
>
> og både nextval og currval viser det rigtige. Men når jeg så efter "SELECT
> kundenr.NEXTVAL FROM DUAL" indsætter nye værdier
> f.eks femte og sjette kunde, og så kører:
> SELECT kundenr, kundenavn FROM kunde;
> får jeg:
>
> kundenr kundenavn
> ---------- ------------
> 2 anden
> 3 tredje
> 4 fjerde
> 6 femte (??????????)
> 7 sjette
> 1 første
>
> Dvs efter jeg har kørt NEXTVAL FROM DUAL så sker der noget.
> Jeg har prøvet at bruge:
> ALTER SEQUENCE kundenr NOCACHE;
> SELECT kundenr.NEXTVAL FROM DUAL;
> ALTER SEQUENCE kundenr CACHE;
>
> men det giver samme resultat.
>
> Jeg skal nævne at alt fungerer fint hvis jeg "spørger"
> SELECT kundenr.CURRVAL FROM DUAL;
> Det er kun i tilfælde af "nextval" at den "hopper over"
>
> Er der nogen der ved hvorfor og hvordan kan det ordnes?
>
> mvh Dejan
>
>
> "def" <spades@worldonline.dk> skrev i en meddelelse
> news:I9hM6.12109$zv2.1600714@news010.worldonline.dk...
> > Hej, jeg skal lave et program i Java (JDBC) og en database (Oracle). Nu er
> > jeg lidt "ny" hvad DB angår og derfor disse spørgsmål:
> > Jeg har 3 tabeller (faktur, kunde,vare); Faktur- tabel har en primær nøgle
> > (fakturnr) og en fremmed nøgle (kundenr). Kunde-tabel har en primær nøgle
> > (kundenr). Vare-tabel har en primær nøgle (varenr). Endvidere har jeg
> > oprettet en relation (id) hvis primære nøgle er (fakturnr, varenr), og
> disse
> > 2 attributer er samtidigt fremmednøgler (hver for sig) som hermed
> > "forbinder" faktur-tabel og vare-tabel. Dvs. faktur-tabel og kunde-tabel
> er
> > forbundet via en fremmednøgle, kundenr, ("usynlig" relation), og
> > faktur-tabel og vare-tabel er forbundet via en id-tabel (relation) som
> > består af to fremmednøgler (fakturnr, varenr).
> > I forbindelse med disse tabeller har jeg oprettet 3
> > Sequencer(fakturnr,kundenr,varenr) idet alle primære nøgler i alle 3
> > tabeller skal kunne autonummereres. Og det fungerer fint. Men nu har jeg
> > flere problemer:
> > 1. når jeg starter programmet så skal det gerne vise "faktur nr." i et
> felt.
> > Men for at kunne se de rigtige oplysninger så skal jeg spørge databasen om
> > en bestemt kollones næste værdi. Hvordan gør jeg det. Er der noget der
> > hedder "Select fakturnr.NEXT from faktur"?
> >
> > 2. Faktur-tabel og kunde-tabel: når jeg indsætter værdierne i kunde-tabel
> så
> > bruger jeg:
> > INSERT INTO kunde VALUES (kundenr.NEXTVAL,'mitnavn', 'mitefternavn'...);
> > men når jeg så skal indsætte værdierne i faktur-tabel så skal jeg "kende"
> > NEXTVAL i kunde-tabel idet denne er fremmednøgle i faktur-tabel. Hvordan
> > finder jeg ud af hvad sidste værdi i en kollone er (vist noget med LAST)?
> > Kan man skrive noget i stillen med:
> > INSERT INTO faktur VALUES(fakturnr.NEXTVAL, LAST-VALUE-FROM-KUNDE, .....)?
> >
> > eller kan det bare gøres via JDBC?
> >
> > på forhånd tak
> >
> > mvh Dejan
> >
> >
> >
> >
> >
>
>

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


spades (16-05-2001)
Kommentar
Fra : spades


Dato : 16-05-01 18:01


"0405rl" <0405rl.news@kandu.dk> skrev i en meddelelse
news:DKqM6.12597$zv2.1690821@news010.worldonline.dk...
> Hej Dejan
>
> Vedr. Sequencer.
> CURRVAL = sidste brugte værdi fx. i.f. autonummerer.
> NEXTVAL = næste ledige værdi fx. i.f. autonummerer.
>
> Dvs. at du kan ikke benytte dig af 'NEXTVAL' til at få det næste nr. i en
liste med mindre at det altså er det du ønsker 'næste ledige værdi'.
>
> En måde hvorpå du kan spole frem og tilbage i det RecordSet du får efter
et kald til en DB via JDBC, er:
>
> ResultSet rs = stmt.execute ("SELE.......");
>
> rs.first(); // første element i RecordSet'et
> rs.previous(); forrige element i RecordSet'et
> rs.next(); næste element i RecordSet'et
> rs.last(); sidste element i RecordSet'et

Takker, det skal jeg nok prøve

mvh Dejan

> /René
>




Lars Kongshøj (16-05-2001)
Kommentar
Fra : Lars Kongshøj


Dato : 16-05-01 08:43

def wrote:
> 1. når jeg starter programmet så skal det gerne vise "faktur nr." i et felt.
> Men for at kunne se de rigtige oplysninger så skal jeg spørge databasen om
> en bestemt kollones næste værdi. Hvordan gør jeg det. Er der noget der
> hedder "Select fakturnr.NEXT from faktur"?

Husk at fakturanumre skal være fortløbende. Med den løsning, du
skitserer ovenfor, risikerer du at få huller i nummerfølgen. Det sker,
hvis man går ind i din formular, uden at oprette en faktura. Så udtages
et fakturanr. uden at det anvendes.

--
Lars Kongshøj

spades (16-05-2001)
Kommentar
Fra : spades


Dato : 16-05-01 17:58


"Lars Kongshøj" <kongshoj@my-deja.com> skrev i en meddelelse
news:3B022F8E.6844BC08@my-deja.com...

> Husk at fakturanumre skal være fortløbende. Med den løsning, du
> skitserer ovenfor, risikerer du at få huller i nummerfølgen. Det sker,
> hvis man går ind i din formular, uden at oprette en faktura. Så udtages
> et fakturanr. uden at det anvendes.

Det var også problemmet. Jeg vil gerne have når brugeren åbner "ny faktur",
at der så vises "fakturnr" i et felt. Jeg skal simpelthen bare spørge
databasen "hvis fakturen skal oprettes hvilket nr. får den så". SELECT
kundenr.NEXTVAL FROM DUAL; ville være en god ide, men så får jeg et hul som
du beskriver.
Jeg overvejer derfor bare at bruge SELECT kundenr.CURVAL FROM DUAL, gemme
resultat som int n og så bare gøre det, at feltet viser n+1. Så selvom
brugeren fortryder og ikke ønsker at skrive en faktur, så sker der ikke
noget. Men det virker lidt "sjusket"

mvh Dejan

> Lars Kongshøj



Lars Kongshøj (16-05-2001)
Kommentar
Fra : Lars Kongshøj


Dato : 16-05-01 19:10

spades wrote:
> Det var også problemmet. Jeg vil gerne have når brugeren åbner "ny faktur",
> at der så vises "fakturnr" i et felt. Jeg skal simpelthen bare spørge
> databasen "hvis fakturen skal oprettes hvilket nr. får den så". SELECT
> kundenr.NEXTVAL FROM DUAL; ville være en god ide, men så får jeg et hul som
> du beskriver.
> Jeg overvejer derfor bare at bruge SELECT kundenr.CURVAL FROM DUAL, gemme
> resultat som int n og så bare gøre det, at feltet viser n+1. Så selvom
> brugeren fortryder og ikke ønsker at skrive en faktur, så sker der ikke
> noget. Men det virker lidt "sjusket"

Det er det også. Det vil jo ikke virke, hvis systemet er (eller bliver)
et flerbrugersystem.

Det rigtige tidspunkt at udtage nummeret på er, efter min mening, når
fakturaen bekræftes.

--
Lars Kongshøj

def (17-05-2001)
Kommentar
Fra : def


Dato : 17-05-01 20:59


"Lars Kongshøj" <kongshoj@my-deja.com> skrev i en meddelelse
news:3B02C287.3F26A02E@my-deja.com...

> Det er det også. Det vil jo ikke virke, hvis systemet er (eller bliver)
> et flerbrugersystem.
>
> Det rigtige tidspunkt at udtage nummeret på er, efter min mening, når
> fakturaen bekræftes.

Du har ret, og det bliver som du beskrev. Takker.

mvh Dejan

> Lars Kongshøj



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408941
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste