viernes, 14 de octubre de 2011

Commit sin validación previa

He aquí lo que dice Oracle sobre la instrucción COMMIT cuando se ejecuta en un formulario de Forms:
“Causes Oracle Forms to update data in the database to match data in the form. Oracle Forms  first validates the form, then, for each block in the form, deletes, inserts, and updates to the database, and performs a database commit. As a result of the database commit, the database releases all row and table locks.”
Finalmente advierte lo siguiente:
“If you use a PL/SQL COMMIT statement in an anonymous block or a form-level procedure, Oracle Forms interprets that statement as a call to the COMMIT_FORM built-in”. Resumiendo, no es posible hacer un COMMIT sin evitar la validación de los datos modificados en los bloques.


Sin embargo, en ocasiones desearíamos evitar esa validación, por ejemplo si hemos ejecutado directamente alguna sentencia INSERT, UPDATE o DELETE en nuestro programa. Para evitarlo la validación que realiza Oracle Forms os presento este pequeño programa:

PROCEDURE doCommit IS
    ret NUMBER;
    cursorID EXEC_SQL.CURSTYPE;
    connection_id EXEC_SQL.CONNTYPE := EXEC_SQL.default_connection;

BEGIN
    cursorId := EXEC_SQL.open_cursor(connection_id);
    EXEC_SQL.parse(connection_id, cursorId, 'COMMIT');
    ret := EXEC_SQL.execute(connection_id, cursorId);
    EXEC_SQL.close_cursor(connection_id, cursorId);
END doCommit;


doCommit hace uso de la librería EXEC_SQL que nos proporciona Oracle Forms para ejecutar SQL dinámico. Primero obtiene una referencia a la conexión actual, luego prepara una sentiencia SQL con el COMMIT y luego la ejecuta pasando por alto las validaciones que hace Forms sobre los bloques de base de datos que se hayan modificado hasta el momento. Veamos un ejemplo de uso:


BEGIN
    UPDATE employees
    SET last_name = 'PEREZ'
    WHERE employee_id = 29;

    doCommit;
END;


Más información sobre el paquete EXEC_SQL en la ayuda en pantalla de Oracle Forms.

No hay comentarios:

Publicar un comentario