2012-08-09 27 views
5

Estoy escribiendo una instrucción INSERT para insertar una fila en la tabla en un bloque PL/SQL. Si esta inserción falla o no se inserta una fila, entonces necesito deshacer la declaración de actualización ejecutada previamente.Sql Insertar declaración devolver "cero/sin filas insertadas"

Quiero saber en qué circunstancias la instrucción INSERT podría insertar 0 filas. Si la inserción falla debido a alguna excepción, puedo manejar eso en el bloque de excepción. ¿Hay casos en los que el INSERT se ejecute correctamente pero no arroje una excepción donde necesito verificar si SQL%ROWCOUNT < 1?

+2

¿Su instrucción 'INSERT' es una declaración' INSERT ... VALUES'? ¿O un 'INSERTAR ... SELECCIONAR'? –

+1

Mi instrucción INSERT es como: INSERTAR ... VALORES – Sekhar

Respuesta

15

Si su estado de INSERT está estructurada como una INSERT ... VALUES, a continuación, insertará con éxito exactamente una fila o generará una excepción. No habría necesidad de marcar el SQL%ROWCOUNT.

Si su estado de INSERT está estructurada como una INSERT ... SELECT, entonces es posible que la declaración SELECT volverá 0 filas, la declaración INSERT insertará 0 filas, y no es una excepción será lanzada. Si considera que se trata de un error, deberá verificar el SQL%ROWCOUNT después de ejecutar la instrucción INSERT.

+0

¡Excelente respuesta! Siempre me he preguntado cómo podría pasar esto. – Gili

2

Sí, para averiguar cuántas filas se ven afectados por las sentencias DML (INSERT, actualizaciones, etc.), se puede comprobar el valor de SQL%ROWCOUNT

INSERT INTO TABLE 
SELECT col1, col2,.... 
    FROM TAB; 

if SQL%ROWCOUNT=0 then 
    RAISE_APPLICATION_ERROR(-20101, 'No records inserted'); 
end if; 
Cuestiones relacionadas