Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MS SQL procedura kursor

[es] :: MS SQL :: MS SQL procedura kursor

[ Pregleda: 2762 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sdejans

Član broj: 139091
Poruke: 9
91.148.89.*



Profil

icon MS SQL procedura kursor24.10.2008. u 12:09 - pre 128 meseci
Imam dve tabele.

select TDRGROP01 from TPOMIND
i
select * from TDRGROP order by Drzava, Mesto, Opstina

Prva sluzi da se ispita da li je doslo do promena i ako je u drugoj treba da se azuriraju podaci u dve kolone. Prva kolona dobija broj koji se za svaki slog uvecava za jedan a druga kolona prvo ispituje sta pise u koloni Nive i u zavisnosti od toga azurira drugu kolonu.

Da li je ovako nesto moguce uraditi kroz SQL upit i ako moze koliko.

Po starinski sam uradio to (kod dole) ali je dosta sporo pogotovo preko OBDC-a (ADO).

Code:

procedure TFDRGROP.FormActivate(Sender: TObject);
   var
       intkey, intpred01, intpred02: integer;
       strnivo: string;
begin
    FMKAEVDB.TDRGROP.Open;
    FMKAEVDB.TPOMIND.Open;
    // ako je u prvoj tabeli uslov nije zadovoljen
    If FMKAEVDB.TPOMIND.FieldByName('TDRGROP01').AsBoolean = False then
    begin
        intkey := 1;
        strnivo:= '1';
        intpred01:= 1;
        FMKAEVDB.TDRGROP.DisableControls;

        // promena vrednosti u dve kolone u drugoj tabeli
        while not FMKAEVDB.TDRGROP.Eof do
        begin
            FMKAEVDB.TDRGROP.Edit;

            // prva kolona uvecava sa za 1
            FMKAEVDB.TDRGROP.FieldByName('SortKey').AsInteger:= intkey;

            //azuriranje druge kolone u zavisnosti od trece
            If strnivo= '1' then begin
                 FMKAEVDB.TDRGROP.FieldByName('SortPred').AsInteger:= 0;
                 intpred01:= intkey;
            end else
                 if strnivo = '2' then begin
                      FMKAEVDB.TDRGROP.FieldByName('SortPred').AsInteger:= intpred01;
                      intpred02:= intkey;
                 end else begin
                       FMKAEVDB.TDRGROP.FieldByName('SortPred').AsInteger:= intpred02;
                 end;

            intkey:= intkey + 1;
            FMKAEVDB.TDRGROP.Next;
            strnivo:= FMKAEVDB.TDRGROP.FieldByName('Nivo').AsString;
        end;

        FMKAEVDB.TPOMIND.Edit;
        FMKAEVDB.TPOMIND.FieldByName('TDRGROP01').AsBoolean := True;
        FMKAEVDB.TPOMIND.Post;
    end;
    FMKAEVDB.TDRGROP.First;
    FMKAEVDB.TDRGROP.EnableControls;
end;


[Ovu poruku je menjao chachka dana 25.10.2008. u 11:18 GMT+1]
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3082
*.100.46-69.q9.net.



+78 Profil

icon Re: MS SQL procedura kursor24.10.2008. u 17:07 - pre 128 meseci
Mogao bih ti pomoci, ali sam zuazet resavajuci moj problem. Sta msilis da se dogovorimo, pomognes ti meni za moj problem, a onda ja tebi za tvoj?

Moj problem glasi ovako: "Iz tabele dma_G6SASMC_Aug8 terba azurirati tabelu LD2_BS_MarksLevelC tako sto se kolona MIRTStatus iz tabele dma_G6SASMC_Aug8 dobija kao zbir samo onih rekorda iz tabele LD2_BS_MarksLevelC za koje je datum promene veci nego za kolonu ItemExcludeStatus koja se nalazi u dma_ItemExcludes_PJ_Jul31 kada je Suppressed=1 u G36_PBS_3 za sve kolone koje se nalze u LD2_BS_MarksLevelC "

Evo kod koji sam napisao, ali mi daje gresku, pa ako ti meni nadjes gresku, ja cu verovatno moci da resim tvoj problem:
Code:

ALTER function [dbo].[funcSetScoreORSW_E] (
  @markORSWLW int
  , @override smallint
) returns varchar(10)
as begin

  declare @Return varchar(10)
  
  set @Return=case 
  when @markORSWLW=-8 then 'I'
  when @markORSWLW in(-9,-1) then 'B'
  when @override=1 or @markORSWLW in(-97,-96) then 'N/A'
  else convert(varchar,@markORSWLW*10) end

  return @Return
end


Zbunjen? I ja sam zbunjen tvojim pitanjem, veruj mi. Pokusaj da objasnis sta je sta i sta u stvari pokusavs da uradis.

:-)
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Moderator
Član broj: 53780
Poruke: 575
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: MS SQL procedura kursor25.10.2008. u 10:23 - pre 128 meseci
@sdejans: Da bi se na ovakvo pitanje moglo odgovoriti trebalo bi da daš strukturu tabela i bolji opis problema. Isto ovo ti je na zanimljiv način rekao i Zidar.
"The best code is no code at all." - Zidar (ES član)
"Biggest obstacle to learning SQL is unlearning procedural programming." - Joe
Celko
"Minimize code, maximize data." - A. Neil Pappalardo
 
Odgovor na temu

miksi

Član broj: 5874
Poruke: 102
*.dynamic.sbb.rs.



+24 Profil

icon Re: MS SQL procedura kursor25.10.2008. u 15:09 - pre 128 meseci
Hajde da ja pretpostavim da mi je jasno sta je kolega hteo. Iz koda se vidi da koristi TTable kontrole sto mu prevlaci citave tabele sa servera. To Uvek usporava maksimalno pricu. Postavlja se i pitanje sa kojom verzijom ADOa radi, pa bi morao da se raspita i na nekim drugim forumima. Sve u svemu, ubrzanje bi dobio prelaskom na TQuery ili izborom nekih third party kontrola za ADO.
 
Odgovor na temu

sdejans

Član broj: 139091
Poruke: 9
91.148.89.*



Profil

icon Re: MS SQL procedura kursor27.10.2008. u 07:38 - pre 128 meseci
Da pojednostavim pitanje.

Da li je moguce nekako da na serveru (preko procedure) izvrsim upis u tabelu, a ne iz koda.

Znaci imam tabelu sa recimo 10 kolona. Koja ima 10.000 redova.

Treba da prosetam kroz nju od pocetka do kraja i u dve kolone upisem nesto.

Probao sam na par nacina ali uvek postizem slicno vreme oko 30 sek. i to mi se nikako ne svidja.

Koristim ADODataSet - Text.

Hvala na trudu u svakom slucaju.
 
Odgovor na temu

sparc
Sladjan Parc

Član broj: 65760
Poruke: 134
*.com
Via: [es] mailing liste



Profil

icon Re: MS SQL procedura kursor27.10.2008. u 07:57 - pre 128 meseci
>
Najbrze izvrsenje je svakako kroz stored procedure to se izvrsava munjevito.
Kada korsitis ADODataSet on dovlaci do clienta svaki record tu ga menja i
prosledjuje na upis, to zna da traje. Kada korstis stored proceduru ti
serveru saljes zahtev da se izvrsi stored procedura, mozes da posaljes i
parametre da bi ogranicio broj recorda nad kojim treba da se izvrsi, ako
sam dobro razumeo update recorda. U stored proceduri mozes da koristis
Update klauzulu ili da koristis cursore. Normalno je da ce se update
klauzula
izvrsavati brze nego kada koristis cursore. Treba u svakom slucaju da
koristis sve prednosti koje ti daje sql server.
 
Odgovor na temu

sdejans

Član broj: 139091
Poruke: 9
91.148.89.*



Profil

icon Re: MS SQL procedura kursor27.10.2008. u 11:42 - pre 128 meseci
U svaki red se upisuje druga vrednost.

Moze li neki primer kako se to radi sa kursorima na serveru, ili neka knjiga.

Ja sam otvorio jedno 4-5 knjiga i ne nadjoh nista slicno.

Jasno mi je da to bas i nije dobra praksa al tako sam krenuo da resim jednu stvar.
 
Odgovor na temu

sdejans

Član broj: 139091
Poruke: 9
91.148.89.*



Profil

icon Re: MS SQL procedura kursor28.10.2008. u 09:24 - pre 128 meseci
Ja sam uspeo da napisem nesto ovako. Time sam vreme izvrsavanja smanjio za 1/3 od prvobitnog koda.
Ako neko ima ideju ili misli da to moze da se napise drugacije da radi jos brze neka je iznese.

Evo mog koda mozda ce jos nekome pomoci u savladavanju kursora u SQL-u.

Code:


CREATE PROCEDURE PrgDRGROP AS
DECLARE @strnivo nchar(1)
DECLARE @intkey int, @intpred1 int, @intpred2 int

DECLARE id_cursor CURSOR LOCAL
FOR
SELECT nivo FROM TDRGROP ORDER BY drzava, mesto, opstina
FOR UPDATE OF SortKey, SortPred

SET @intkey= 1
SET @intpred1= 1
SET @intpred2= 1

OPEN id_cursor 

FETCH NEXT FROM id_cursor INTO @strnivo 

IF @strnivo=1 BEGIN
     UPDATE TDRGROP SET SortKey= @intkey, SortPred= 0 WHERE CURRENT OF id_cursor
     SET @intpred1= @intkey 
END ELSE IF @strnivo=2 BEGIN 
     UPDATE TDRGROP SET SortKey= @intkey, SortPred= @intpred1 WHERE CURRENT OF id_cursor
     SET @intpred2= @intkey
END ELSE UPDATE TDRGROP SET SortKey= @intkey, SortPred= @intpred2 WHERE CURRENT OF id_cursor 
SET @intkey = @intkey + 1

WHILE @@Fetch_Status = 0 
BEGIN
     FETCH NEXT FROM id_cursor INTO @strnivo
     IF @strnivo=1 BEGIN
          UPDATE TDRGROP SET SortKey= @intkey, SortPred= 0 WHERE CURRENT OF id_cursor
          SET @intpred1= @intkey 
     END ELSE IF @strnivo=2 BEGIN 
          UPDATE TDRGROP SET SortKey= @intkey, SortPred= @intpred1 WHERE CURRENT OF id_cursor
          SET @intpred2= @intkey
     END ELSE UPDATE TDRGROP SET SortKey= @intkey, SortPred= @intpred2 WHERE CURRENT OF id_cursor 
     SET @intkey = @intkey + 1
END

CLOSE id_cursor
DEALLOCATE  id_cursor

GO






[Ovu poruku je menjao sdejans dana 29.10.2008. u 14:07 GMT+1]
 
Odgovor na temu

[es] :: MS SQL :: MS SQL procedura kursor

[ Pregleda: 2762 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.