2010-06-18 13 views
8

Estoy seleccionando de las tablas FOO y BAR. Me gustaría bloquear los registros de FOO que se devuelven, pero no quiero que se bloqueen los registros de BAR.Bloqueo de Oracle con SELECCIONAR ... PARA ACTUALIZAR DE

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of <what should I put here?> 

Parece que necesito especificar columnas individuales, pero quiero que todo el registro de foo se bloquee. p.ej. Me gustaría poder hacer algo como:

cursor c_foobar is 
select foo.*, bar.* from 
foo, bar 
where foo.id = bar.foo_id 
for update of foo 

¿Tengo que enumerar todas las columnas de foo en la sección for update of el fin de bloquear a todos? ¿O puedo elegir arbitrariamente cualquier columna en foo, incluso aquellas que no son su clave principal, y se bloqueará todo el registro?

Respuesta

12

De the 10G PL/SQL documentation:

Al consultar varias tablas, pueden utilizar la cláusula FOR UPDATE para confinar bloqueo de filas a las tablas particulares. Las filas en una tabla están bloqueadas solo si la cláusula FOR UPDATE OF hace referencia a una columna en esa tabla. Por ejemplo, la siguiente consulta cierra filas en la tabla empleados, pero no en la mesa departamentos:

DECLARE 
    CURSOR c1 IS SELECT last_name, department_name FROM employees, departments 
    WHERE employees.department_id = departments.department_id 
      AND job_id = 'SA_MAN' 
     FOR UPDATE OF salary; 
+0

muy buena; no estoy seguro de cómo me perdí eso. Así que supongo que solo requiere un nombre de columna arbitrario de la fila ... fácil pero no parece terriblemente intuitivo para mí. –

+0

Estoy de acuerdo, no es así. Me parece recordar haber leído en algún lugar hace mucho tiempo que el requisito de especificar columnas es para que en alguna versión futura, quizás Oracle solo bloquee determinadas columnas en la fila. Pero mi memoria es confusa en eso. –

+2

Es una forma de código de auto-documentación, creo: "Solo tengo la intención de actualizar la columna 'salario'" –

Cuestiones relacionadas