< Anterior | Siguiente >

Lección 2: Operaciones básicas SQL en EGL

Si ha seguido la guía de aprendizaje Introducción a EGL, conocerá los componentes EGL necesarios para acceder a una base de datos relacional y los mandatos con los que puede leer los datos de una base de datos y grabarlos en ella. En esta lección se describen estos conceptos con mayor detalle.
Por qué y cuándo se efectúa esta tarea
Cuando ha ejecutado el asistente de aplicación de acceso a datos, ya sea en la lección anterior o en una guía de aprendizaje anterior, EGL ha creado componentes de datos y componentes lógicos basados en la información de la base de datos.

Los componentes de datos más importantes que se han creado son los componentes SQLRecord. Los campos de estos componentes de registro (Record) están relacionados con las columnas de la base de datos. Al crear una variable basada en este registro, puede utilizar dicha variable para representar una fila nueva o existente de la base de datos. Aunque cada SQLRecord creado por el asistente de aplicación de acceso a datos sólo compara las columnas de una única tabla, más adelante en esta guía de aprendizaje aprenderá a fusionar datos de varias tablas en un único registro (proceso denominado unión de tablas en SQL).

Por ejemplo, a lo largo de esta guía de aprendizaje utilizará el SQLRecord Customer; puede encontrar este registro en el archivo EGLSource/EGLDerbyDB/data/customer.egl:
record Customer type sqlRecord { 
  tablenames=[["EGL.CUSTOMER"]],
  keyItems=[CustomerId]
  } 

  CustomerId CustomerId {column="EGL.CUSTOMER.CUSTOMER_ID"};
  FirstName FirstName {column="EGL.CUSTOMER.FIRST_NAME", 
    sqlVariableLen=yes, maxLen=30, isSqlNullable=yes};
  LastName LastName {column="EGL.CUSTOMER.LAST_NAME", 
    sqlVariableLen=yes, maxLen=30, isSqlNullable=yes};
...
  Directions Directions {column="EGL.CUSTOMER.DIRECTIONS", 
    sqlVariableLen=yes, maxLen=255, isSqlNullable=yes};
end
El código tablenames=[["EGL.CUSTOMER"]] especifica la tabla de la base de datos con la que se relaciona este registro, y las propiedades column de cada uno de los campos especifican la columna de la tabla con la que se relaciona el campo. El código keyItems=[CustomerId] indica que el campo CustomerId, y por extensión la columna EGL.CUSTOMER.CUSTOMER_ID de la base de datos, son la clave primaria de esta tabla.
El asistente de aplicación de acceso a datos también ha creado varias bibliotecas que realizan operaciones CRUD (crear, leer, actualizar y suprimir) sobre los registros y matrices de registros. Estas bibliotecas implican procedimientos más sofisticados de realizar las operaciones CRUD directamente con mandatos EGL. En esta guía de aprendizaje utilizará los mandatos EGL directamente, en la práctica real probablemente separará la lógica en bibliotecas para reutilizarla. Los cuatro mandatos CRUD de EGL son:
Tabla 1. Mandatos CRUD de EGL y sus equivalentes SQL
Mandato EGL Ejemplo de EGL Mandato SQL
add
add myRecord;
INSERT
get
get myRecord;
SELECT
replace
replace myRecord;
UPDATE
delete
delete myRecord;
DELETE
Cuando se utiliza uno de estos mandatos, EGL genera una sentencia SQL predeterminada a partir de dicho mandato. Por ejemplo, tomemos la siguiente sentencia add:
add myCustomer;
Si coloca el cursor sobre el registro myClient, pulsa el botón derecho del ratón y luego pulsa Sentencia SQL > Añadir, el editor de EGL expande la sentencia add para mostrar el código SQL, haciéndolo explícito:
El menú contextual que muestra como explicitar una sentencia SQL
add myCustomer with
  #sql{
    insert into EGL.CUSTOMER
      (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)
    values
      (:myCustomer.CustomerId, :myCustomer.FirstName, 
      :myCustomer.LastName, :myCustomer.Password, 
      :myCustomer.Phone, :myCustomer.EmailAddress, 
      :myCustomer.Street, :myCustomer.Apartment, 
      :myCustomer.City, :myCustomer.State, 
      :myCustomer.Postalcode, :myCustomer.Directions)
  };
En esencia, no ha cambiado nada; simplemente, EGL ha expuesto el código SQL que genera a partir de la sentencia add. Ahora que el código es explícito, puede editar el SQL predeterminado generado a partir del mandato EGL.

La cláusula VALUES de la sentencia SQL INSERT lista los valores que deben insertarse en la fila de base de datos nueva, en este caso los campos en el registro myCustomer. Cada valor que se encuentra dentro del bloque #sql va precedido por un signo de dos puntos (:), que indica que no se trata de un valor SQL, sino de un valor EGL. Estos valores EGL utilizados en el código SQL explícito se conocen como variables de lenguaje principal.

Como otro ejemplo de variables de lenguaje principal que pueden generarse durante el trabajo, a continuación figura una función que utiliza una sentencia get para eliminar una serie de registros de una base de datos.
function getCustFromState(customerState CHAR(2) in, 
  customers Customer[] out)

  get customers with
    #sql{
      select *
      from EGL.CUSTOMER
      where EGL.CUSTOMER."STATE" like :customerState
    };

end
Esta función recibe un parámetro CHAR de dos bytes y lo utiliza como variable de lenguaje principal para recuperar los registros cuyo campo STATE coincide con esos dos caracteres. Para que EGL funcione con código SQL explícito, es necesario utilizar con mucho cuidado las variables de lenguaje principal.

Revisar las operaciones CRUD

En esta sección utilizará operaciones get, add, replace y delete para realizar operaciones básicas de base de datos con EGL. Esta sección es opcional; puede pasarla por alto si se siente seguro con las cuatro sentencias básicas de acceso a datos de EGL y sus equivalentes SQL.
  1. Cree un programa EGL denominado CRUDTest.egl:
    1. En la vista Explorador de proyectos, pulse con el botón derecho sobre el proyecto EGLSQL y pulse Nuevo > Programa. Se abrirá la ventana Componente de programa EGL nuevo.
    2. En el campo Paquete, especifique el nombre programs.
    3. En el campo Nombre de archivo fuente EGL, especifique el nombre CRUDTest.
    4. Compruebe que el recuadro de selección Crear como programa llamado esté deseleccionado y pulse Finalizar.
    El programa EGL nuevo se creará y se abrirá en el editor.
  2. Sustituya el código EGL predeterminado por el código siguiente:
    package programs;
    
    import EGLDerbyDB.data.*;
    
    program CRUDTest type BasicProgram {}
      
      function main()
        
        try
          // Visualizar los registros iniciales de la base de datos
          SysLib.writeStdout("Contenido de la base de datos antes de las operaciones SQL:");
          printAllCustomers();
          
        // Qué hacer si se produce un error
        onException (exception SQLException)
          handleDBException(exception);
        end
        
      end
      
      // Esta función visualiza el contenido de la tabla CUSTOMER
      // de la base de datos
      function printAllCustomers()
        
        allCustomers Customer[0];
    
        get allCustomers;
        for (counter int from 1 to allcustomers.getSize())
          SysLib.writeStdout(allCustomers[counter].CustomerId::" "::
            allCustomers[counter].FirstName::" "::
            allCustomers[counter].LastName);
        end
        SysLib.writeStdout("\n");
    
      end
      
      //Esta función responde a los errores de acceso a la base de datos
      function handleDBException(exception SQLException)
        SysLib.writeStdout("Error de acceso a la base de datos."::
          "Consulte la sección Resolución de problemas");
        SysLib.writeStdout(exception.message);
      end
      
    end

    Por ahora, este programa sólo muestra la lista completa de clientes de la base de datos. También incluye una función denominada handleDBException() para procesar los problemas que EGL encuentra al trabajar con la base de datos. (Aprenderá más cosas acerca del manejo de errores más adelante en esta guía de aprendizaje). Puede ejecutar este programa en este momento para ver el aspecto de la base de datos antes de cambiarla.

  3. Guarde y genere el programa.
  4. Ejecute el programa:
    1. En la vista Explorador de proyectos, expanda EGLSQL/JavaSource/programs.
    2. Pulse el archivo CRUDTest.java con el botón derecho del ratón y luego pulse Ejecutar como > Aplicación Java.
    Si el programa se ejecuta sin errores, la vista Consola mostrará el contenido de la base de datos. El resultado visualizado en la vista Consola será parecido a este:
    Contenido de la base de datos antes de las operaciones SQL:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    Si los resultados de la consola incluyen errores, compruebe que ha copiado el programa con exactitud y consulte la sección Resolución de problemas.
  5. Añada una función para insertar una fila nueva en la base de datos, antes de la sentencia final end:
    function addCustomer()
      customerToAdd Customer;
      customerToAdd.CustomerId = 50;
      customerToAdd.FirstName = "Jane";
      customerToAdd.LastName = "Doe";
      
      // Insertar el registro en la base de datos
      try
        add customerToAdd;
        SysLib.writeStdout("Contenido de la base de datos después de añadir un registro nuevo:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
    Esta función utiliza add para insertar un registro en la base de datos. Para ver el código SQL implícito subyacente a la sentencia add, sitúe el cursor directamente sobre la palabra clave customerToAdd en la línea add customerToAdd;, pulse el botón derecho del ratón y luego pulse Sentencia SQL > Añadir. Ahora, la sentencia tiene este aspecto:
    try
      add customerToAdd with
        #sql{
          insert into EGL.CUSTOMER
            (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)
          values
            (:customerToAdd.CustomerId, :customerToAdd.FirstName, 
            :customerToAdd.LastName, :customerToAdd.Password, 
            :customerToAdd.Phone, :customerToAdd.EmailAddress, 
            :customerToAdd.Street, :customerToAdd.Apartment, 
            :customerToAdd.City, :customerToAdd.State, 
            :customerToAdd.Postalcode, :customerToAdd.Directions)
        };
    También puede previsualizar el código SQL sin explicitarlo situando el cursor directamente sobre la variable de registro, pulsándola con el botón derecho del ratón y pulsando Sentencia SQL > Ver. Para trabajar con código SQL dentro de código EGL como este, el cursor del editor de EGL debe estar en algún lugar de la sentencia.
  6. Llame a la función nueva desde la función main() del programa:
    function main()
      
      // Visualizar los registros iniciales de la base de datos
      SysLib.writeStdout("Contenido de la base de datos antes de las operaciones SQL:");
      printAllCustomers();
      
      // Añadir un registro
      addCustomer();
      
    end
  7. Guarde, genere y ejecute el programa. El resultado muestra el contenido de la tabla antes y después de añadir un registro a la misma:
    Contenido de la base de datos antes de las operaciones SQL:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    
    
    Contenido de la base de datos después de añadir un registro nuevo:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    50 Jane Doe
  8. Añada una función para suprimir el registro de la base de datos, antes de la sentencia final end:
    function deleteCustomer()
      customerToDelete Customer;
      customerToDelete.CustomerId = 50;
      
      // Suprimir el registro
      try
        delete customerToDelete noCursor;
        SysLib.writeStdout("Contenido de la base de datos después de suprimir el registro:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
  9. En la función main(), sustituya la llamada a la función que añade el registro por una llamada a la función que lo suprime. Dado que la columna CUSTOMER_ID es la clave primaria de la tabla, y que la tabla ya contiene una fila con CUSTOMER_ID establecido en 50, el intento de añadir de nuevo el registro provocará un error.
    function main()
      
      // Visualizar los registros iniciales de la base de datos
      SysLib.writeStdout("Contenido de la base de datos antes de las operaciones SQL:");
      printAllCustomers();
      
      // Suprimir un registro
      deleteCustomer();
      
    end
  10. Guarde, genere y ejecute el programa. La salida muestra el contenido de la tabla antes y después de suprimir el registro de la misma:
    Contenido de la base de datos antes de las operaciones SQL:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    50 Jane Doe
    
    
    Contenido de la base de datos después de suprimir el registro:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
  11. Añada una función para recuperar y actualizar el registro de la base de datos, antes de la sentencia final end:
    function updateCustomer()
      customerToUpdate Customer;
      customerToUpdate.CustomerId = 50;
      
      // Recuperar la fila
      get customerToUpdate;
      
      // Cambiar valores en la variable de registro
      customerToUpdate.FirstName = "John";
      customerToUpdate.LastName = "Smith";
      
      // Actualizar la fila en la base de datos
      try
        replace customerToUpdate noCursor;
        SysLib.writeStdout("Contenido de la base de datos después de actualizar el registro:");
        printAllCustomers();
      onException(exception SQLException)
        handleDBException(exception);
      end
      
    end
  12. En la función main() del programa, llame a las funciones add, replace y delete por ese orden:
    function main()
      
      // Visualizar los registros iniciales de la base de datos
      SysLib.writeStdout("Contenido de la base de datos antes de las operaciones SQL:");
      printAllCustomers();
      
      // Añadir un registro
      addCustomer();
      
      // Actualizar el registro
      updateCustomer();
      
      // Suprimir un registro
      deleteCustomer();
      
    end
  13. Guarde, genere y ejecute el programa. La salida muestra el contenido de la tabla al principio del programa, después de añadir un registro, después de actualizar el registro y después de suprimir el registro:
    Contenido de la base de datos antes de las operaciones SQL:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    
    
    Contenido de la base de datos después de añadir un registro nuevo:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    50 Jane Doe
    
    
    Contenido de la base de datos después de actualizar el registro:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
    50 John Smith
    
    
    Contenido de la base de datos después de suprimir el registro:
    1 Francisco Ramirez
    2 Andrea Lundquist
    3 Khaled Said
    4 Francoise Remy
    5 Malachi Johnston
    6 Ben Liebowitz
    7 Ellen Lu
    8 Chitra Bhatt
    9 Maxim Artomov
    10 Yoshio Takahashi
Resultados
Este es el código completo del archivo CRUDTest.egl. Si ve errores marcados con símbolos X rojos en el archivo, asegúrese de que el código coincide con el código de este archivo: Archivo CRUDTest.egl completado después de la lección 2.

Punto de comprobación de lección

En esta lección ha revisado los conceptos básicos para acceder a una base de datos relacional con EGL y SQL.
Ahora debe estar familiarizado con los conceptos siguientes:
  • Componentes SQLRecord y su relación con las tablas de base de datos
  • Las cuatro sentencias básicas EGL que realizan las operaciones de base de datos
  • SQL explícito
  • Variables de lenguaje principal
Consulte los temas de ayuda siguientes para obtener más detalles acerca de las cuatro sentencias EGL básicas de acceso a datos:
< Anterior | Siguiente >

Comentarios