Koenma's Laboratory




SQL inmerso en C/C++ (Parte V)

11 de julio de 2007

Programación con cursores

Los cursores son estructuras con las que Oracle nos permite recorrer resultados de consultas t-upla a t-upla. Un ejemplo para la creación de un cursor sobre el resultado de una consulta se realiza de la siguiente forma:
    EXEC SQL DECLARE (nombre_del_cursor) CURSOR FOR
    SELECT (atributo)
    FROM (tabla);
Para el acceso a los datos del cursor, usamos la sentencia FETCH. Una forma común de acceder a los resultados de la consulta es aprovechando la generación de un error cuando no se pueden obtener más datos del cursor:
    EXEC SQL WHENEVER NOT FOUND DO break;

      For ( ; ; ) {
      EXEC SQL FETCH dato TO <:variable_huesped>
      (... acciones ...)
      }
A la instrucción FETCH se la puede acompañar de una posición:

  • Next: siguiente elemento al actual.
  • Last: último elemento del cursor.
  • Prior: anterior elemento al actual.
  • First: primer elemento del cursor.
Un cursor no evalúa la consulta a la que se ha asociado hasta que no se ejecuta la sentencia:
    EXEC SQL OPEN (nombre_cursor);
Para finalizar los cambios realizados sobre las t-uplas asociadas a la consulta, usamos:
    EXEC SQL CLOSE (nombre_cursor);
Si a parte de consultarlas, queremos modificar las t-uplas, en la declaración debemos añadir la cláusula “FOR UPDATE (lista de columnas)”. Para el borrado de las t-uplas usando un cursor, usamos:
    EXEC SQL DELETE FROM (nombre_tabla) WHERE CURRENT OF (cursor)
Eliminaría el elemento actualmente seleccionado por el cursor indicado en la tabla dada.

SQL estático y SQL dinámico

Dentro del SQL podemos encontrar dos variantes de éste: el SQL estático y el dinámico.

El SQL estático es aquella parte del mismo que se encarga de consultar, modificar, etc,una base de datos. En esta variante se da por conocidas las instrucciones SQL completas en el momento de escribir el programa, lo cual lleva a crear una serie de pasos comunes a seguir. Simplemente, se incorpora en el archivo fuente del lenguaje principal y el precompilador maneja la conversión necesaria a las llamadas a API de servicio de tiempo de ejecución del gestor de bases de datos que puede procesar el compilador del lenguaje principal.

Por lo tanto, si en algún momento el propio programa fuese el que tuviera que tomar una decisión (en tiempo de ejecución decidir las sentencias a usar o las tablas a referenciar), esta variante no nos resultaría útil.

Para ello, se emplea la otra variante conocida como SQL dinámico, que facilita la generación y ejecución automática de las declaraciones del programa. Esto puede ser útil cuando es necesario escribir código que puede modificar las bases de datos, condiciones o servidores. Esto también hace más fácil automatizar tareas que se repiten varias veces.

Las declaraciones de SQL dinámico están guardadas como cadenas de caracteres que son introducidas cuando el programa se ejecuta. Estas declaraciones pueden ser introducidas por el programador o generadas por el mismo programa, pero a diferencia de las declaraciones de SQL estático, no están inmersas en el código fuente. En contraste con las declaraciones del SQL estático, las de SQL dinámico pueden cambiar de una ejecución a otra.

A continuación se muestra un ejemplo de una sentencia ejecutada dinámicamente en C:
    /* Actualizar columna de tabla mediante DYNAMIC SQL*/
    strcpy(hostVarStmtDyn, "UPDATE staff SET salary = salary + 1000 WHERE dept = ?");
    EXEC SQL PREPARE StmtDyn FROM :hostVarStmtDyn;
    EXEC SQL EXECUTE StmtDyn USING :dept
Las sentencias más relevantes del SQL dinámico son:

  • EXECUTE IMMEDIATE Prepara y ejecuta una sentencia que no utiliza ninguna variable del lenguaje principal. Se utiliza esta sentencia como alternativa a las sentencias PREPARE y EXECUTE. Por ejemplo:

      strcpy (qstring,"INSERT INTO WORK_TABLE SELECT *
      FROM EMP_ACT WHERE ACTNO >= 100");
      EXEC SQL EXECUTE IMMEDIATE :qstring;

  • PREPARE Convierte el formato de serie de caracteres de la sentencia de SQL en un formato ejecutable de la sentencia, asigna un nombre de sentencia y opcionalmente coloca información sobre la sentencia en una estructura SQLDA.

  • EXECUTE Ejecuta una sentencia de SQL previamente preparada. La sentencia se puede ejecutar repetidamente dentro de una conexión.

Etiquetas:

 
Posteado por Koenma a las 10:06, |                  Ir al Inicio | Ir Arriba

0 Comentario(s):


Publicar un comentario