4D v16

Acceder al motor SQL de 4D

Inicio

 
4D v16
Acceder al motor SQL de 4D

Acceder al motor SQL de 4D  


 

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:
 QUERY BY SQL([OFFICES];"SALES > 100")
  • 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:
     SQL EXECUTE("select * from t1 into :$myvar") // 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// error en modo compilado

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".

  • En el caso de las etiquetas Begin SQL/End SQL, puede utilizar la cláusula INTO de la consulta SQL y hacer referencia a cualquier expresión válida 4D (campo, variable, array) para obtener el valor:
     Begin SQL
        SELECT ename FROM emp INTO <<[Employees]Name>>
     End SQL
  • Con el comando SQL EXECUTE, también puede utilizar los parámetros adicionales:
     SQL EXECUTE("SELECT ename FROM emp";[Employees]Name)

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:
     ARRAY INTEGER(aBirthYear;0)
     C_TEXT(vName)
     vName:="Smith"
     $SQLStm:="SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>>"
     SQL EXECUTE($SQLStm;aBirthYear)
     While(Not(SQL End selection))
        SQL LOAD RECORD(10)
     End while

Aquí tenemos que efectuar 10 bucles para recuperar los 100 registros. Si desea cargar todos los registros en un solo paso debemos utilizar:

  • Usando las etiquetas Begin SQL/End SQL:
     ARRAY INTEGER(aBirthYear;0)
     C_TEXT(vName)
     vName:="Smith"
     Begin SQL
        SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>> INTO <<aBirthYear>>
     End SQL

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:
     C_TEXT(vName)
     vName:="Smith"
     $SQLStm:="SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>>"
     SQL EXECUTE($SQLStm;[MYTABLE]Birth_Year)
     While(Not(SQL End selection))
        SQL LOAD RECORD(10)
     End while

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.

  • Usando las etiquetas Begin SQL/End SQL:
     C_TEXT(vName)
     vName:="Smith"
     Begin SQL
        SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>> INTO <<[MYTABLE]Birth_Year>>
     End SQL

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.



Ver también 

ref_lenguaje_4d

 
PROPIEDADES 

Producto: 4D
Tema: Utilizar SQL en 4D

 
HISTORIA 

 
ARTICLE USAGE

Manual de SQL ( 4D v16)