< Anterior | Siguiente >

Lección 6: Ejecutar código SQL arbitrario

En esta lección aprenderá procedimientos más flexibles para trabajar con código SQL en EGL.
Por qué y cuándo se efectúa esta tarea
Hasta este momento, se ha limitado a utilizar sentencias SQL coincidentes con una sentencia EGL. Por ejemplo, puede editar el código SQL asociado con una sentencia get, pero el código SQL está limitado a una sentencia SELECT. Por ejemplo, no puede colocar una sentencia SQL DELETE en el código SQL explícito para una sentencia get. Aunque puede editar el SQL explícito, el código SQL debe seguir siendo adecuado para la palabra clave de EGL.

Entonces, ¿cómo utilizar las sentencias SQL que no tienen analogía directa en EGL? Puede ejecutar código SQL que no esté asociado con una palabra clave EGL, ya sea directamente por medio de las herramientas del entorno de trabajo o con la sentencia EGL execute.

Utilizar el programa de creación de SQL para crear sentencias SQL

El entorno de trabajo incluye varias herramientas que facilitan el trabajo con bases de datos externas a una aplicación EGL. En esta sección trabajará más directamente con la base de datos de ejemplo con el programa de creación de SQL.
  1. Pase a la perspectiva Datos:
    1. Pulse Ventana > Abrir perspectiva > Otras.
    2. En la ventana Abrir perspectiva, pulse Datos.
    3. Pulse Aceptar.
    Se abrirá la perspectiva Datos, que incluye vistas utilizadas para trabajar con bases de datos. Trabajará principalmente con la vista Explorador de bases de datos.
  2. En la vista Explorador de bases de datos, expanda Conexiones. La vista Explorador de bases de datos muestra la conexión del proyecto con la base de datos como EGLDerbyDB, junto con una conexión Derby de ejemplo utilizada para las pruebas:
    La vista Explorador de bases de datos, que muestra la conexión EGLDerbyDB
  3. Pulse la conexión EGLDerbyDB con el botón derecho y pulse Volver a conectar. Una vez que la vista Explorador de bases de datos está conectada a la base de datos, puede trabajar con la base de datos utilizando las herramientas de la perspectiva Datos. Sin embargo, dado que Derby sólo permite una conexión simultánea a una base de datos, siempre que la vista Explorador de bases de datos esté conectada, los programas EGL no podrán conectarse a la base de datos.
  4. En la ventana Autorización de base de datos, pulse Aceptar.
  5. Expanda EGLDerbyDB > EGLDerbyDB > Esquemas > EGL > Tablas. Ahora, la vista Explorador de bases de datos lista las tablas de la base de datos utilizadas por esta guía de aprendizaje. Las demás tablas son metadatos y no son importantes para esta guía de aprendizaje.
    La vista Explorador de bases de datos que muestra las tablas de la base de datos
  6. Pulse la tabla CUSTOMERS con el botón derecho del ratón y pulse Datos > Contenido de ejemplo. La vista Salida de datos muestra los datos de la tabla CUSTOMERS:
    La vista Salida de datos, que muestra la tabla CUSTOMERS
    . La vista Salida de datos ha ejecutado una sentencia SELECT predeterminada, como sentencia SELECT implícita subyacente a una sentencia EGL get. Para trabajar con la base de datos más directamente y probar el código SQL antes de añadirlo a los programas EGL, puede utilizar el programa de creación de SQL para escribir y ejecutar mandatos SQL interactivamente.
  7. En la vista Explorador de bases de datos, pulse con el botón derecho del ratón la base de datos EGLDerbyDB, representada por el icono de base de datos azul, y luego pulse Sentencia SQL nueva.
    La vista Explorador de bases de datos que muestra la opción de menú Sentencia SQL nueva
  8. En la ventana Sentencia SQL nueva, dé el nombre sqlStatements a la sentencia.
  9. Deje el campo Plantilla de sentencia establecido en SELECT y el grupo de botones de selección Editar mediante establecido en Programa de creación de SQL.
    La ventana Sentencia SQL nueva
  10. Pulse Aceptar. Se abrirá el programa de creación de SQL. desde este editor, puede crear sentencias SQL y probarlas antes de añadirlas a la aplicación.
  11. Por ejemplo, pegue la sentencia SQL predeterminada del registro Customer en el programa de creación de SQL. Puede copiar esta sentencia (o cualquier otra sentencia SQL) desde el SQL explícito en el editor de EGL, o utilizar el código siguiente:
    select
      EGL.CUSTOMER.CUSTOMER_ID, EGL.CUSTOMER.FIRST_NAME, 
      EGL.CUSTOMER.LAST_NAME, EGL.CUSTOMER.PASSWORD, 
      EGL.CUSTOMER.PHONE, EGL.CUSTOMER.EMAIL_ADDRESS, 
      EGL.CUSTOMER.STREET, EGL.CUSTOMER.APARTMENT, 
      EGL.CUSTOMER.CITY, EGL.CUSTOMER."STATE", 
      EGL.CUSTOMER.POSTALCODE, EGL.CUSTOMER.DIRECTIONS
    from EGL.CUSTOMER
    order by
      EGL.CUSTOMER.CUSTOMER_ID asc
    El programa de creación de SQL muestra el código SQL de diversas formas:
    • El editor de código situado en la parte superior del programa de creación de SQL permite editar sentencias SQL igual que en el editor de EGL. Sin embargo, este editor contiene opciones adicionales para tratar con las sentencias SQL; por ejemplo, al pegar la sentencia SQL predeterminada del código EGL en este editor, el programa de creación de SQL la simplifica y reformatea:
      El programa de creación de SQL, que muestra el código SQL que debe editarse
      Este editor de SQL también proporciona asistencia de contenido para sentencias SQL. Al igual que en la asistencia de contenido de EGL, puede pulsar Control+Barra espaciadora para obtener una lista de sugerencias.
    • La segunda sección de la parte superior muestra una vista gráfica de las tablas involucradas en la sentencia y sus columnas. Puede seleccionar o eliminar columnas de la sentencia SELECT quitando la marca de los recuadros de selección situados junto a las columnas y añadir una tabla nueva a la sentencia pulsando con el botón derecho del ratón en el área del editor y luego pulsando Añadir tabla. También puede visualizar una lista de las opciones de una tabla pulsándola con el botón derecho del ratón:
      Menú emergente del área gráfica del programa de creación de SQL
    • La sección inferior muestra una vista tabular de la sentencia. Puede utilizar las plantillas de las tablas como guía para editar la sentencia.
      El área tabular del editor de sentencias del programa de creación de SQL
    Por ejemplo, puede utilizar el área tabular del programa de creación de SQL para añadir una cláusula WHERE a la sentencia SELECT en el editor:
  12. Vaya a la pestaña Condiciones del programa de creación de SQL.
  13. En la pestaña Condiciones, añada una nueva cláusula WHERE a la sentencia:
    1. En la pestaña Condiciones, pulse una fila vacía de la columna Column.
    2. En la casilla en blanco de Column, seleccione CUSTOMER.POSTALCODE.
    3. En Operador, seleccione LIKE.
    4. En Valor, especifique el código siguiente:
      1%
      El símbolo de porcentaje (%) es un comodín de SQL. Esta cláusula WHERE limita la sentencia a los clientes cuyo código postal empieza por el número 1.
    En el área tabular, la condición de selección tiene este aspecto:
    La nueva condición de selección en el programa de creación de SQL
    Cuando haya terminado de añadir la condición y haya establecido el foco en otro lugar, el programa de creación de SQL actualizará el código de la sentencia SELECT en el editor:
    El código de la sentencia SQL en el programa de creación de SQL
  14. Pulse sobre el editor de código situado en la parte superior del programa de creación de SQL con el botón derecho del ratón y luego pulse Ejecutar SQL.
    La opción Ejecutar SQL del menú contextual, abierta desde el área de edición de código del programa de creación de SQL
    La vista Salida de datos muestra los resultados de la sentencia. En este caso, muestra los clientes cuyo código postal empieza por 1:
    La vista Salida de datos, que muestra los resultados de la sentencia
    Si esta familiarizado con SQL, puede escribir aquí sus propias sentencias SQL y probarlas antes de utilizarlas en una aplicación.
  15. Cuando haya terminado con el programa de creación de SQL, puede guardar el código en un archivo o descartarlo.
  16. Otro ejemplo de mayor complejidad consiste en crear una sentencia SQL que creará una tabla copiando el diseño de la tabla CUSTOMER:
    1. En la vista Explorador de bases de datos, pulse la tabla CUSTOMER con el botón derecho del ratón y, a continuación, pulse Generar DDL.
    2. En la ventana Generar DDL, marque el recuadro de selección Sentencias CREATE y quite la marca de los demás recuadros de selección.
      La ventana Generar DDL
    3. Pulse Siguiente.
    4. En la página Objetos, pulse Seleccionar todo.
    5. Pulse Siguiente.
    6. Seleccione el proyecto EGLSQL en el campo Carpeta.
    7. En la página Guardar y ejecutar archivo DDL, dé al archivo el nombre createtable.sql.
    8. Quite la marca del recuadro de selección Ejecutar DDL en servidor.
    9. Marque el recuadro de selección Abrir archivo DDL para edición. La página Guardar y ejecutar DDL tiene este aspecto:
      La penúltima página del asistente Generar DDL
    10. Pulse Siguiente.
    11. Pulse Finalizar.
    La nueva sentencia SQL se abrirá en el editor de sentencias SQL, que funciona como el programa de creación de SQL, pero sólo contiene el área de edición de código, sin las áreas gráficas adicionales.
  17. Edite la sentencia para cambiar el nombre de la tabla creada por EGL.CUSTOMERTEMP, en lugar de CUSTOMER. El código SQL editado tiene este aspecto:
    CREATE TABLE EGL.CUSTOMERTEMP (
        CUSTOMER_ID INTEGER NOT NULL,
        FIRST_NAME VARCHAR(30),
        LAST_NAME VARCHAR(30),
        PASSWORD CHAR(8),
        PHONE VARCHAR(14),
        EMAIL_ADDRESS VARCHAR(50),
        STREET VARCHAR(30),
        APARTMENT VARCHAR(10),
        CITY VARCHAR(30),
        STATE CHAR(2),
        POSTALCODE VARCHAR(10),
        DIRECTIONS VARCHAR(255)
      );
  18. Guarde la sentencia.
  19. Desconéctese de la base de datos pulsando la base de datos EGLDerbyDB con el botón derecho del ratón en la vista Explorador de bases de datos y luego pulsando Desconectar.
Resultados
Ahora, dispone de una sentencia SQL que creará una tabla para la base de datos. Sin embargo, EGL no tiene ninguna sentencia equivalente a la sentencia SQL CREATE, y no puede insertarse esta sentencia en el SQL explícito para una sentencia como get, ya que get espera un conjunto de resultados de la base de datos. En la próxima sección, utilizará execute para ejecutar este sentencia SQL en EGL.

Utilizar execute

Podría ejecutar la nueva sentencia CREATE utilizando las herramientas de la perspeciva Datos, pero a veces puede ser necesario ejecutar código SQL personalizado en la aplicación EGL. Evidentemente, cada vez que inserta código SQL personalizado en una aplicación EGL, debe probarlo cuidadosamente para asegurarse de que realiza las acciones esperadas.
Por qué y cuándo se efectúa esta tarea
La sentencia EGL execute permite ejecutar código SQL sin utilizar variables de tipo SQLRecord. Puede utilizar execute para ejecutar diversas sentencias SQL, que incluyen CREATE, ALTER y DROP TABLE, INSERT, DELETE y UPDATE. Por ejemplo, puede eliminar una tabla de la base de datos del siguiente modo:
execute #sql{
  DROP TABLE OLD_TABLE;
}

La sentencia execute no da soporte a algunas sentencias SQL, especialmente a SELECT y OPEN. Para obtener una lista de las sentencias SQL que funcionan o no funcionan con execute, consulte la sección Consideraciones relativas a execute para SQL.

También puede utilizar execute para llamar a un procedimiento almacenado:
execute #sql{ 
  call aStoredProcedure( :parameterVar) 
};
Derby no da soporte a procedimientos almacenados del mismo modo que la mayoría de sistemas de gestión de bases de datos, por lo que en esta guía de aprendizaje no se da información sobre los procedimientos almacenados. En lugar de ello, en esta sección utilizará execute para crear una tabla en la base de datos y llenarla con datos sin utilizar ningún componente SQLRecord.
  1. Vuelva a la perspectiva EGL.
  2. Cree un componente Library en un archivo denominado CustomerTableOperations.egl en un paquete denominado libraries.
  3. Inserte funciones nuevas en la biblioteca, denominadas execCreateTable, execInsertIntoTable y execDropTable, cada una de las cuales reciba una variable de registro StatusRec como parámetro:
    function execCreateTable(status StatusRec inOut)
      
    end
    
    function execInsertIntoTable(status StatusRec inOut)
      
    end
    
    function execDropTable(status StatusRec inOut)
      
    end
    La variable de registro StatusRec registra información acerca del éxito o el fracaso de las operaciones de base de datos.
  4. Si no ha utilizado la asistencia de contenido para añadir el parámetro, añada la sentencia import siguiente al principio del archivo, inmediatamente debajo de la sentencia package:
    import EGLDerbyDB.StatusRec;
  5. Utilizando una sentencia execute en la función execCreateTable, ejecute la sentencia CREATE TABLE que ha creado en la sección anterior:
    function execCreateTable(status StatusRec inOut)
      try
        execute 
          #sql{
            CREATE TABLE EGL.CUSTOMERTEMP (
                CUSTOMER_ID INTEGER NOT NULL,
                FIRST_NAME VARCHAR(30),
                LAST_NAME VARCHAR(30),
                PASSWORD CHAR(8),
                PHONE VARCHAR(14),
                EMAIL_ADDRESS VARCHAR(50),
                STREET VARCHAR(30),
                APARTMENT VARCHAR(10),
                CITY VARCHAR(30),
                STATE CHAR(2),
                POSTALCODE VARCHAR(10),
                DIRECTIONS VARCHAR(255)
              )
            };
      onException (exception SQLException)
        ConditionHandlingLib.HandleException(status, exception);
      end
      
    end
    Esta función crea la tabla y luego maneja los errores utilizando la función HandleSuccess que se ha creado junto con los componentes de datos y componentes lógicos de la base de datos.
  6. Si no ha utilizado la asistencia de contenido para añadir este código, añada la sentencia import siguiente al principio del archivo:
    import EGLDerbyDB.ConditionHandlingLib;
  7. En la función execDropTable, añada una sentencia execute que elimine la tabla de la base de datos:
    function execDropTable(status StatusRec inOut)
      try  
        execute #sql{
         DROP TABLE EGL.CUSTOMERTEMP
           } ;
        onException (exception SQLException)
          ConditionHandlingLib.HandleException(status, exception);
        end
    end
  8. En la función execInsertIntoTable, añada una sentencia execute que mueva los registros de la tabla CUSTOMER a la tabla CUSTOMERTEMP:
    function execInsertIntoTable(status StatusRec inOut)
      try  
        execute #sql{
        INSERT INTO EGL.CUSTOMERTEMP 
          SELECT * FROM EGL.CUSTOMER
           } ;
      onException (exception SQLException)
        ConditionHandlingLib.HandleException(status, exception);
      end
    end
    Este código copia simplemente cada uno de los registros de CUSTOMER en CUSTOMERTEMP. Si lo desea, puede añadir una cláusula WHERE para seleccionar sólo determinados registros para copiar.
  9. Guarde y genere la biblioteca.
  10. Cree un componente Program en un archivo denominado duplicateTable.egl en el paquete programs.
  11. En el programa nuevo, llame a las funciones que crean la tabla e insertan registros en ella:
    package programs;
    
    import EGLDerbyDB.StatusRec;
    import libraries.CustomerTableOperations;
    
    program duplicateTable type BasicProgram {}
      
      status StatusRec;
      
      function main()
        CustomerTableOperations.execCreateTable(status);
        CustomerTableOperations.execInsertIntoTable(status);
      end
      
    end
  12. Genere y ejecute el programa.
  13. Vuelva a la perspectiva Datos y vuelva a conectarse a la base de datos en la vista Explorador de bases de datos.
  14. Como ha hecho en la sección anterior, previsualice los datos de la tabla nueva para ver la tabla nueva y sus datos:
    1. Expanda EGLDerbyDB > EGLDerbyDB > Esquemas > EGL > Tablas.
    2. Pulse la tabla CUSTOMERTEMP con el botón derecho del ratón y pulse Datos > Contenido de ejemplo.
Resultados
Ahora puede ver los datos de la tabla nueva:
Vista Salida de datos, que muestra la tabla nueva
A continuación, puede crear otras sentencias para trabajar con la tabla nueva, o llamar a la función execDropTable para eliminarla de la base de datos. Por ejemplo, podría ejecutar las sentencias ALTER TABLE y CREATE INDEX que se crearon junto con la sentencia CREATE TABLE, pero si lo hace, debe redenominar la restricción y el índice, ya que Derby no permite nombres duplicados para restricciones de clave primaria. Recuerde que debe desconectarse de la base de datos en la vista Explorador de bases de datos antes de ejecutar el código EGL que accede a la base de datos.

A continuación figura el código completo de los dos archivos utilizados en esta lección. Si ve muchos errores marcados por símbolos X rojos en cualquiera de los archivos, asegúrese de que el código coincida con este código: Archivos CustomerTableOperations.egl y duplicateTable.egl completados después de la lección 6.

Punto de comprobación de lección

En esta lección ha obtenido información acerca de algunas de las herramientas de gestión de bases de datos del entorno de trabajo y cómo puede combinarlas con la sentencia execute para ejecutar una amplia variedad de sentencias SQL dentro de una aplicación EGL.
Para obtener más detalles acerca de las herramientas de acceso a datos del entorno de trabajo, consulte la sección Trabajar con sentencias SQL. Para obtener más información acerca de la sentencia EGL execute, consulte la sección relativa a execute.

Comentarios