Avatar billede hrc Mester
02. april 2007 - 13:42 Der er 2 kommentarer og
1 løsning

Cursor looper i Stored Procedure

Jeg har følgende kode, og det kan sikkert laves anderledes. Lige nu vil jeg bare gerne blive klogere.

Databasen er MsSQL 2000 (@bolig_ref, @requestresult og @transnavn er parametre):

  -- start transaction @TransNavn

  declare billeder_cursor cursor for
  select b.ref as  billeder_ref, bc.ref as billedercache_ref, bc.operation, bc.result from billeder b
    left join billedercache bc on (bc.billeder_ref = b.ref)
    where (b.bolig_ref = @bolig_ref)

  declare @billeder_ref integer
  declare @billedercache_ref integer
  declare @operation integer
  declare @result integer
 
  declare @ErrorNo integer
  set @ErrorNo = 0
 
  open billeder_cursor

  fetch next from billeder_cursor into @billeder_ref, @billedercache_ref, @operation, @result
  while (@@fetch_status = 0)
  begin
    if (@billedercache_ref is null) or ((@billedercache_ref is not null) and (@result <> 0))
    begin
      insert into billedercache (billeder_ref, operation, result) values (@billeder_ref, 5, -1)
      set @ErrorNo = @@error
    end

    fetch next from billeder_cursor into @billeder_ref, @billedercache_ref, @operation, @result
  end

  close billeder_cursor
  deallocate billeder_cursor

  if @ErrorNo = 0
  begin
    set @requestresult = 1
    -- commit work @TransNavn
  end
  else begin
    set @requestresult = 0
    -- rollback work @TransNavn
  end


1. Skidtet looper hvis proceduren forsøger at indsætte record i tabellen. Er det fordi det er samme tabel som cursoren har fingrene nede i? Ligeså snart jeg kommenterer "insert into" ud virker det.

2. Vil gerne have lidt transaktionsstyring på det (her kommenteret ud). Er det den rigtige opbygning jeg har forsøgt eller er der smartere?

3. Behøver jeg føre et transaktionsnavn med som parameter for at holde transaktionen unik/lokal?
Avatar billede hrc Mester
02. april 2007 - 13:44 #1
Kan jeg hente fundne records over i en array og processere den efter min cursor?
Avatar billede hrc Mester
02. april 2007 - 14:05 #2
Kører nu denne her - og så virker det.

  insert into billedercache
    (billeder_ref, operation, result)
    select distinct b.ref as billeder_ref, 5, -1 from billeder b
      left join billedercache bc on (bc.billeder_ref = b.ref)
      where (b.bolig_ref = @bolig_ref)
        and (bc.operation is null)
        or ((bc.operation is not null) and (bc.result <> 0))

1. I oprindelige design: Skulle jeg have indkapslet "insert into" i en transaktion der først blev comitted når cursoren var færdig?
Avatar billede hrc Mester
13. april 2007 - 11:12 #3
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