Avatar billede grave Nybegynder
25. oktober 2002 - 13:13 Der er 13 kommentarer og
3 løsninger

integer increment i select

Findes der ikke en måde at select'e en value i en tabel
så den bliver selected med value+1 og commiter den nye value,
noget lignene

select test+1
from testtabel
where.....
hvor selecten comiter test+1
Avatar billede Slettet bruger
25. oktober 2002 - 13:15 #1
En select der committer?
En select der updater?

Hvad er der galt med

update testtabel set test = test+1;
commit;
select test from testtabel;
Avatar billede grave Nybegynder
25. oktober 2002 - 13:20 #2
hvis jeg laver en select skal det jeg får ud være value+1 denne nye value skal så være det der står i tabellen næste gang jeg select'er,
jeg syntes bare jeg har hørt at der skulle være en måde at gøre det på så ikke jeg skal lave 3 kald til basen (select, update, commit)
Avatar billede Slettet bruger
25. oktober 2002 - 13:24 #3
Kan du huske noget om konteksten? Hvorfor skulle man gøre det?

Det kunne måske være noget med at have en trigger, der fyrede på en AFTER SELECT.
Avatar billede grave Nybegynder
25. oktober 2002 - 13:27 #4
Det skal bruges som noget der ligner en counter.
hver gang jeg selecter fra den tæller den en op
Avatar billede teepee Nybegynder
25. oktober 2002 - 13:28 #5
Kan du ikke bruge en sequence, den har automatisk aldrig samme værdi hvis du bruger
select [seqnavn].nextval from dual;
Der er dog ikke garanti for ubrudte sekvenser.
Avatar billede Slettet bruger
25. oktober 2002 - 13:29 #6
Tænker du på en SEQUENCE?
create sequence my_seq;
select my_seq.nextval;
Avatar billede Slettet bruger
25. oktober 2002 - 13:33 #7
Det skulle være
select my_seq.nextval from dual;
ikke
select my_seq.nextval;

og

CREATE SEQUENCE my_seq
INCREMENT BY 1
START WITH 0 MINVALUE 0
MAXVALUE 999999999999999999999999999
NOCYCLE
ORDER
NOCACHE
/

for at garantere ordning også på tværs af sessioner
Avatar billede grave Nybegynder
25. oktober 2002 - 13:37 #8
Ja men nu er det sådan at det er en tabel der allerede existerer jeg skal bruge, dat det er en tabel mange andre programmer og scripts bruger
Avatar billede teepee Nybegynder
25. oktober 2002 - 13:40 #9
Så må du vist lave et "select for update" plus "update tal=tal+1 returning tal into vVariabel" scenario i en stored function
Avatar billede Slettet bruger
25. oktober 2002 - 13:45 #10
Hvordan sikrer du dig at der ikke er nogen, der opdaterer tabellen, fra du har committed en update?

Du er nok nødt til at lave commit som det sidste.
Avatar billede grave Nybegynder
25. oktober 2002 - 13:48 #11
ved at der bliver comitet i det du selecter vil det altid være den comitede value du bruger, men det er kun dette script jeg laver nu der skal lave denne update, de andre skal bare select'e. og hente data.
Avatar billede Slettet bruger
25. oktober 2002 - 13:52 #12
Hvis de andre bare skal selecte, har du selvfølgelig ikke noget problem.
Avatar billede teepee Nybegynder
25. oktober 2002 - 14:16 #13
det er derfor du skal lave en select for update!
Avatar billede grave Nybegynder
25. oktober 2002 - 16:19 #14
jeg har lavet denne:
DECLARE
              v_group_value integer;
              v_group_incemented integer;
BEGIN
    SELECT    gv.GROUP_VALUE
    INTO      v_group_value
    FROM      doc_master dm,
                doc_groups dg,
                group_specs gs,
                group_values gv
    WHERE      dg.pub_key = dm.pub_key
    AND        dg.GROUP_ID = gs.GROUP_ID
    AND        dg.GROUP_ID = 'POE'
    AND        dm.pub_num = 'POETEST';

                v_group_value := v_group_value+1;

    UPDATE    group_values
    SET        group_value = v_group_value
    WHERE      group_id = 'POE';

                dbms_output.put_line( 'POE_NUMBER=' || '"' || v_group_value || '"' );

    COMMIT;
END;
Avatar billede kichian Nybegynder
19. november 2002 - 12:19 #15
Brug en SEQUENCE. Så erstatter du den første select med mange joins med en simpel select. Dette er MEGET hurtigere og også mere stabilt mht. samtidige opdateringer.
DECLARE
              v_group_value integer;
BEGIN
    SELECT    seq_group.nextval
    INTO      v_group_value
    FROM      dual

    UPDATE    group_values
    SET        group_value = v_group_value
    WHERE      group_id = 'POE';

                dbms_output.put_line( 'POE_NUMBER=' || '"' || v_group_value || '"' );

    COMMIT;
END;

Start med at initiere seq_groupval med den største GROUP_VALUE + 1
Avatar billede grave Nybegynder
15. januar 2003 - 11:20 #16
Jeg har ikke lige læst det igennem men i har sikket alle ret..... har i får lidt hver...
Lukker
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
Computerworld tilbyder specialiserede kurser i database-management

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



Seneste spørgsmål Seneste aktivitet
I går 23:37 Poe strøm Af lurup i LAN/WAN
I går 14:46 GIF-EDITOR Af snestrup2000 i Billedbehandling
I går 14:03 Logge ind Af Bob i PC
I går 12:12 2 skærme - 1 virker - den anden siger No signal Af eksmojo i Skærme
I går 10:33 openvpn projekt Af dcedata1977 i Windows