none
diferencia entre cursores RRS feed

  • Pregunta

  • hola gente quería saber cuál es la diferencia entre estos cursores:

    En este primer cursor hace uso de FOR UPDATE y WHERE CURRENT OF

    Declare @codigo varchar(5),
    @compania varchar(200),
    @contacto varchar(150),
    @pais varchar(100)
    Declare ccustomers cursor GLOBAL
    for Select customerid, companyname, contactname
    , country from customers FOR UPDATE
    Open ccustomers
    fetch ccustomers into @codigo, @compania, @contacto,
    @pais
    while(@@fetch_status=0)
    begin
    UPDATE customers
    set companyname = @compania + '(Modificado)'
    where current of ccustomers
    fetch ccustomers into @codigo, @compania, @contacto,
    @pais
    end
    close ccustomers
    deallocate ccustomers
    declare  @precio money, @producto int
    declare catCur cursor for
    select  Products.ProductId,Products.UnitPrice FROM Products join OrderDetails on Products.ProductId = OrderDetails.ProductId
    open catCur 
    fetch next from catCur into @producto, @precio
    while (@@FETCH_STATUS=0)
    begin
    UPDATE Products set UnitPrice =@precio+@precio*0.05 where ProductId = @producto
    Fetch Next From catCur into @producto,@precio
    End
    close catCur
    Deallocate catCur

    En ambos se actualizan los datos pero no se bien la diferencia entre usar el where current of y usar

    where campo = @campo

    así como también el uso de for update en la declaración del cursor

    En internet leí esto: "Para actualizar los datos de un cursor debemos especificar FOR UPDATE después de la sentencia SELECT en la declaración del cursor, y WHERE CURRENT OF [Nombre Cursor] en la sentencia UPDATE tal y como muestra el siguiente ejemplo.", pero no comprendo bien cuando se refiere a "actualizar los datos de un cursor", no se supone que está actualizando los datos de la tabla?


    miércoles, 29 de enero de 2020 0:13

Todas las respuestas

  • El primero es "de lectura/escritura", es decir, según el cursor va recorriendo registros permite modificar el propio registro en el que se encuentra posicionado en ese momento ("current of").

    Si lo ejecutas sin el "for update", entonces solo permite leer, y para modificar un registro hay que buscarlo por separado con un where en el update. Esto es menos eficiente que modificar el que ya está posicionado, porque requiere hacer una nueva búsqueda para encontrar el registro que satisface la condición del where.

    miércoles, 29 de enero de 2020 7:00
  • El primero es "de lectura/escritura", es decir, según el cursor va recorriendo registros permite modificar el propio registro en el que se encuentra posicionado en ese momento ("current of").

    Si lo ejecutas sin el "for update", entonces solo permite leer, y para modificar un registro hay que buscarlo por separado con un where en el update. Esto es menos eficiente que modificar el que ya está posicionado, porque requiere hacer una nueva búsqueda para encontrar el registro que satisface la condición del where.

    Estuve leyendo en un libro de SQL lo siguiente: "la cláusula FOR UPDATE en sí tampoco es necesaria en esta instrucción en particular debido a que el cursor es actualizable de manera preestablecida, ya que no contiene ninguna opción para limitar su capacidad de actualización." En referencia a este ejemplo:

    DECLARE CD_4 CURSOR
     FOR
     SELECT *
     FROM INVENTARIO_CD
     FOR UPDATE;

    es decir que por defecto los cursores son actualizables? en el caso del primer cursor si no pongo "for update" también es posible actualizar datos usando "current of".

    Por otro lado, siempre es recomendable utilizar "current of" a la hora de hacer un update/delete en un cursor?? porque siempre tiene mayor rendimiento que usando un where campo=@campo, donde @campo seria el valor capturado por el cursor. En que casos no se usaría "current of" en el where?

    miércoles, 29 de enero de 2020 13:00
  • En que casos no se usaría "current of" en el where?

    En el caso de que tengas que actualizar otro registro que no sea el mismo que tienes posicionado con el cursor.

    miércoles, 29 de enero de 2020 14:51