El motor SQL integrado de 4D puede llamarse de tres maneras diferentes:
- Vía el comando QUERY BY SQL. Pase la cláusula WHERE de un comando SQL SELECT como un parámetro búsqueda. Ejemplo:
- Vía los comandos SQL integrados de 4D, ubicados en el tema "SQL" (SQL SET PARAMETER, SQL EXECUTE, etc.). Estos comandos pueden trabajar con una fuente de datos ODBC o el motor SQL de 4D de la base de datos actual.
- Vía el editor de métodos estándar de 4D. Las instrucciones SQL pueden escribirse directamente en el editor de métodos estándar de 4D. Simplemente debe insertar la consulta SQL entre las etiquetas: Begin SQL y End SQL. El código entre estas etiquetas no será analizado por el intérprete de 4D y será ejecutado por el motor SQL (o por otro motor, si se define por el comando SQL LOGIN).
Es posible hacer referencia a todo tipo de expresión 4D válida (variable, campo, array, expresión ...) dentro de las cláusulas WHERE e INTO de las expresiones SQL. Para indicar una referencia 4D, puede utilizar cualquiera de las siguientes notaciones:
- Poner la referencia entre símbolos dobles menor que y mayor que como se muestra aquí “<<” y “>>”
- Poner dos puntos ":" delante de la referencia.
Ejemplos:
C_TEXT(vName)
vName:=Request("Name:")
SQL EXECUTE("SELECT age FROM PEOPLE WHERE name=<<vName>>")
o:
C_TEXT(vName)
vName:=Request("Name:")
Begin SQL
SELECT age FROM PEOPLE WHERE name= :vName
End SQL
Nota:
- El uso de corchetes [] es necesario cuando trabaja con variables interprocesos (por ejemplo, <<[<>mivar]>> o: [<>mivar]).
En modo compilado, puede utilizar referencias de variables locales (comenzando por el carácter $) en instrucciones SQL bajo ciertas condiciones:
- Puede utilizar variables locales dentro de una secuencia Begin SQL / End SQL, excepto con el comando EXECUTE IMMEDIATE;
- Puede utilizar variables locales con el comando SQL EXECUTE cuando estas variables se utilizan directamente en el parámetro de petición SQL y no vía las referencias.
Por ejemplo, el siguiente código funciona en modo compilado:
El siguiente código generará un error en modo compilado:
C_TEXT(tRequest)
tRequest:="select * from t1 into :$myvar"
SQL EXECUTE(tRequest)
La recuperación de datos en una instrucción SELECT se gestionará dentro de las etiquetas Begin SQL/End SQL vía la cláusula INTO del comando SELECT o vía los comandos 4D del tema "SQL".
- Con el comando SQL EXECUTE, también puede utilizar los parámetros adicionales:
La principal diferencia entre estas dos maneras de recuperar los datos de una petición SQL (etiquetas Begin SQL/End SQL y comandos SQL) es que en el primer caso toda la información se devuelve a 4D en un solo paso, mientras que en el segundo caso, los registros deberán cargarse de forma explícita utilizando el comando SQL LOAD RECORD.
Por ejemplo, suponiendo que en la tabla PERSONAS hay 100 registros:
- Usando los comandos SQL genéricos de 4D:
Aquí tenemos que efectuar 10 bucles para recuperar los 100 registros. Si desea cargar todos los registros en un solo paso debemos utilizar:
En esta situación, después de la ejecución de la instrucción SELECT, el array añoNacimiento contiene 100 elementos y cada elemento almacena un año de nacimiento de todos los 100 registros.
Si en lugar de una array, queremos almacenar los datos recuperados en una columna (un campo 4D), entonces 4D creará automáticamente tantos registros como sea necesario para guardar todos los datos. En nuestro ejemplo anterior, suponiendo que en la tabla PERSONAS hay 100 registros:
- Usando los comandos SQL genéricos de 4D:
Aquí tenemos que efectuar 10 bucles para recuperar todos los 100 registros. Cada pasada por el bucle crea 10 registros en la tabla [MITABLA] y cada valor Año_Nacimiento recuperado de la tabla PERSONAS se guardará en el campo Año_Nacimiento.
En este caso, durante la ejecución de la instrucción SELECT, se crearán 100 registros en la tabla [MITABLA] y cada campo Año_Nacimiento contendrá los datos correspondientes de la tabla PERSONAS, columna Birth_Year..
4D incluye un funcionamiento automático específico (palabra clave LISTBOX) que permite poner los datos de las consultas SELECT en un list box. Para mayor información, consulte el Manual de Diseño.
Por razones de optimización, es preferible utilizar expresiones 4D en lugar de funciones SQL en las consultas. Las expresiones 4D se calcularán una vez antes de la ejecución de la consulta mientras que las funciones SQL se evalúan para cada registro encontrado.
Por ejemplo, con la siguiente instrucción:
SQL EXECUTE("SELECT nombreCompleto FROM PEOPLE WHERE nombreCompleto=<<vApellido+vNombre>>")
... la expresión vApellido+vNombre se calcula una vez, antes de la ejecución de la consulta. Con la siguiente instrucción:
SQL EXECUTE("SELECT nombreCompleto FROM PEOPLE WHERE nombreCompleto=CONCAT(<<vApellido>>,<<vNombre>>)")
... la función CONCAT(<<vApellido>>,<<vNombre>>) se llama para cada registro de la tabla, es decir, la expresión se evalúa para cada registro.