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.
- Vuelva a la perspectiva EGL.
- Cree un componente Library en un archivo denominado
CustomerTableOperations.egl en un paquete denominado libraries.
- 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.
- 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;
- 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.
- 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;
- 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
- 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.
- Guarde y genere la biblioteca.
- Cree un componente Program en un archivo denominado
duplicateTable.egl en el paquete programs.
- 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
- Genere y ejecute el programa.
- Vuelva a la perspectiva Datos y vuelva a conectarse a la base de datos en la
vista Explorador de bases de datos.
- Como ha hecho en la sección anterior, previsualice los datos de la tabla nueva
para ver la tabla nueva y sus datos:
- Expanda
.
- Pulse la tabla CUSTOMERTEMP con el botón derecho del ratón y pulse
.
Resultados
Ahora puede ver los datos de 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.