La Web del Programador: Comunidad de Programadores
 
    Pregunta:  11178 - BLOQUEAR UN REGISTRO CON ORACLE8 Y VISUAL BASIC
Autor:  Jaime sanchez
Hola, me gustaria saber como puedo bloquear una fila concreta de una tabla de Oracle con el control ORADC que uso en Visual Basic. Quiero que quede bloqueada de manera que los otros usuarios solo tengan acceso de lectura a esa fila. Posteriormente se deberia desbloquear dicha fila. Como se puede bloquear y desbloquar una fila con el control ORADC?
Gracias.

  Respuesta:  Jorge Mario Correal Bustamante
Haber Jaime primero recibe un cordial saludo , mira te estás preocupando por algo que es realmente trivial, cuando actualices las BD lo puedes hacer con recordsets y/o con Procedimientos Almacenados (Store Procedure) que son más eficientes.
Si lo haces con recordsets debes tener en cuenta que si estás trabajando con BD multiusuario, debes como tú dices controlar la concurrencia o bloquear el registro implicado en la actualización, existen dos tipos de bloqueo a saber: Optimista y Pesimista en el primero se bloquea el registro sólo en el momento del Update, mientras que el pesimista lo bloquea desde que tú llamas el registro, este es menos eficiente por razones obvias. Observar ejemplo:

\'Bloqueo Optimista:
Rst1.Open "SELECT IDENTIFICADOR_ID, FROM IDENTIFICADORES", Cn.ConnectionString, adOpenStatic, adLockOptimistic

\'Bloqueo Pesimista:
Rst1.Open "SELECT IDENTIFICADOR_ID, FROM IDENTIFICADORES", Cn.ConnectionString, adOpenStatic, adLockPessimistic

Ahora bien te mencioné los procedimientos almacenados, con estos no tienes que preocuparte por bloqueos, pues es el motor quein se encarga de esa tarea, aparte de que son más veloces, eficientes, seguros y la actualización se lleva a cabo directamente en el servidor, un Proc. Alm. no es más que una instrucción SQL ya compilada y que reside en la BD o motor y al cual sólo le debes enviar los parámetros requeridos, te recomiendo que trabajes así pues es muy bueno, observa el ejemplo:

\'Este es un PA que reisde en una BD en Oracle
CREATE OR REPLACE PROCEDURE MCLAVES(TxtCed in varchar2,TxtCla in varchar2)
as

begin
UPDATE USUARIOS SET CLAVE=TxtCla
WHERE CEDULA=TxtCed
;
end MCLAVES;
\'Hasta aquí

\'Ahora como lo invocas desde VB así:
Dim cmd As New Command
Set cmd.ActiveConnection = Cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "MODUSUARIOS"\'Este es el nombre del PA
cmd!TxtCed = UCase$(TxtCed)
cmd!TxtNom = UCase$(TxtNom)
cmd!TxtPer = CboPer
cmd!TxtCla = UCase$(Encript)
cmd.Execute
Set cmd = Nothing \'Liberar Memoria

La tabla tienes los campos: Cédula, Clave, Nombre y Perfil.

Espero te sirva...