Básicamente, el motor SQL de 4D es compatible con SQL-92. Esto significa que para una descripción detallada de los comandos, funciones, operadores y sintaxis a utilizar, puede referirse a la documentación del SQL-92. Múltiples recursos sobre este tema están disponibles en Internet.
Sin embargo, el motor SQL de 4D no soporta el 100% de las funciones del SQL-92 y ofrece otras funciones adicionales específicas.
Esta sección cubre las principales implementaciones y limitaciones del motor SQL de 4D.
Puesto que el motor SQL de 4D se ha integrado en el corazón de la base de datos de 4D, todas las limitaciones relativas al número máximo de tablas, columnas (campos) y registros por base, así como las reglas para dar nombres a las tablas y columnas, son las mismas a las del motor estándar de 4D. Se enumeran a continuación.
Número máximo de tablas: teóricamente dos mil millones, pero por razones de compatibilidad con 4D: 32767.
Número máximo de columnas (campos) por tabla: teóricamente dos mil millones columnas (campos), pero por razones de compatibilidad con 4D: 32767.
Número máximo de líneas (registros) por tabla: mil millones.
Número máximo de llaves de índice: mil millones x 64.
Una llave primaria no puede ser un valor NULL y debe ser única. No es necesario indexar las columnas (campos) llaves primarias.
Número máximo de caracteres permitido para los nombres de tablas y campos: 31 caracteres (limitación 4D).
No está permitido crear varias tablas con el mismo nombre. Aplica el mecanismo de control estándar de 4D.
La siguiente tabla indica los tipos de datos soportados en el SQL de 4D así como su tipo correspondiente en 4D:
Tipo 4D SQL
Descripción
4D
Varchar
Texto Alfanumérico
Texto o Alfa
Real
Número de punto flotante en el rango de +/-1.7E308
Real
Numeric
Número entre +/- 2E64
Entero 64 bits
Float
Número de punto flotante (virtualmente infinito)
Float
Smallint
Número entre -32 768 y 32 767
Entero
Int
Número entre -2 147 483 648 y 2 147 483 647
Entero largo, Entero
Int64
Número entre +/- 2E64
Entero 64 bits
UUID
Número de 16 bytes (128 bits) contiene 32 caracteres hexadecimales
Alpha format UUID
Bit
Campo que sólo acepta los valores TRUE/FALSE o 1/0
Booleano
Boolean
Campo que sólo acepta los valores TRUE/FALSE o 1/0
Booleano
Blob
Hasta 2 GB; todo objeto binario tal como una imagen, un documento, una aplicación
Blob
Bit varying
Hasta 2 GB; todo objeto binario tal como una imagen, un documento, una aplicación
Blob
Clob
Hasta 2 GB de texto. Esta columna (campo) no puede indexarse. No se guarda en el registro mismo.
Texto
Text
Hasta 2 GB de texto. Esta columna (campo) no puede indexarse. No se guarda en el registro mismo.
Texto
Timestamp
Fecha en formato 'YYYY/MM/DD' y hora en formato 'HH:MM:SS:ZZ'
Partes Fecha y Hora generados por separado (conversión automática)
Duration
Duración en formato 'HH:MM:SS:ZZ'
Hora
Interval
Duración en formato 'HH:MM:SS:ZZ'
Hora
Picture
Imagen PICT hasta de 2 GB
Imagen
La conversión entre los tipos de datos numéricos es automática. Las cadenas que representan un número no se convierten en un número correspondiente. Hay funciones CAST especiales que convertirán los valores de un tipo a otro. Los siguientes tipos de datos SQL no se implementan:
Los valores NULL se implementan en el lenguaje SQL de 4D, así como en el motor de base de datos de 4D. Sin embargo, no son soportados en el lenguaje 4D. Sin embargo, es posible leer y escribir valores NULL en un campo 4D utilizando los comandos Is field value Null y SET FIELD VALUE NULL.
Por razones de compatibilidad en 4D, los valores NULL almacenados en las tablas de la base de datos 4D se convierten automáticamente en valores por defecto cuando se manipulan vía el lenguaje 4D. Por ejemplo, en el caso de la siguiente instrucción:
mivarAlf:=[mitabla]MiCampoAlfa
... si el campo MiCampoAlfa contiene un valor NULL, la variable mivarAlfa contendrá "" (cadena vacía).
Los valores por defecto dependen del tipo de dato:
Para los tipos Alfa y Texto: ""
Para los tipos Real, Entero y Entero largo: 0
Para el tipo Fecha: "00/00/00"
Para el tipo Hora: "00:00:00"
Para el tipo Booleano: Falso
Para el tipo Imagen: Imagen vacía
Para el tipo BLOB: BLOB vacío
Por otra parte, este mecanismo, en principio, no se aplica a los tratamientos efectuados a nivel del motor de la base de datos 4D, tales como las consultas. De hecho, la búsqueda de un valor "vacío" (por ejemplo mivalor = 0) no encuentra registros que almacenen el valor NULL y viceversa. Cuando los dos tipos de valores (valores por defecto y NULL) están presentes en los registros para un mismo campo, algunos procesos pueden alterarse o necesitar código adicional.
Para evitar estos inconvenientes, una opción permite estandarizar todos los procedimientos el lenguaje 4D: Mapear valores NULOS a valores vacíos. Esta opción, que se encuentra en la ventana Inspector de campos del editor de estructura, permite extender el principio de utilizar los valores por defecto en todos los tratamientos. Los campos que contengan valores NULL se consideran sistemáticamente que contienen valores por defecto. Esta opción está seleccionada por defecto.
La propiedad Mapear valores NULOS a valores vacíos se tiene en cuenta a un nivel muy bajo del motor de la base de datos. Actúa más en particular en el comando Is field value Null.
La propiedad de campo Rechazar valor NULO de entrada permite evitar el almacenamiento de valores NULL:
Cuando este atributo está seleccionado para un campo, no será posible almacenar el valor NULL en este campo. Esta propiedad de bajo nivel corresponde exactamente al atributo NOT NULL de SQL. Generalmente, si quiere poder utilizar los valores NULL en su base de datos 4D, se recomienda utilizar exclusivamente el lenguaje SQL de 4D.
Nota: en 4D, los campos también puede tener el atributo "Obligatorio". Los dos conceptos son similares, pero su alcance es distinto: el atributo "obligatorio" es un control de entrada, mientras que el atributo "Rechazar valor NULO de entrada" trabaja a nivel del motor de la base de datos. Si un campo con este atributo recibe un valor NULL, se genera un error.
El servidor SQL integrado de 4D soporta las constantes fecha y hora de acuerdo al API ODBC. Esta es la sintaxis para las secuencias de constantes fecha y hora ODBC:
{constant_type 'value'}
tipo_constante
valor
Descripción
d
aaaa-mm-dd
Fecha únicamente
t
hh:mm:ss[.fff]
Hora únicamente
ts
aaaa-mm-dd hh:mm:ss[.fff]
Fecha y hora (timestamp)
Note:fff indica milisegundos.
Por ejemplo, puede utilizar las siguientes constantes:
{ d '2013-10-02' } { t '13:33:41' } { ts '1998-05-02 01:23:56.123' }
Una propiedad de seguridad se ha añadido para los métodos proyecto 4D: Disponible vía SQL:
Cuando está seleccionada, esta opción permite la ejecución del método de proyecto por el motor SQL de 4D. No está seleccionada por defecto, lo que significa que los métodos proyecto 4D están protegidos y no pueden ser llamados por el motor SQL de 4D a menos que haya sido expresamente autorizado al seleccionar esta opción.
Esta propiedad se aplica a todas las consultas SQL, tanto internas como externas, si se ejecuta vía el driver ODBC, el código SQL insertado entre las etiquetas Begin SQL/End SQL, o vía el comando QUERY BY SQL.
Notas:
Incluso cuando un método tiene el atributo "Disponible vía SQL", los derechos de acceso definidos a nivel de las Propiedades de la base y las propiedades del método se tienen en cuenta durante su ejecución.
La función ODBC SQLProcedure devuelve únicamente los métodos proyecto que tienen el atributo "Disponible vía SQL".
Transacciones Auto-commit: esta opción permite activar el mecanismo de auto-commit en el motor SQL. El propósito del modo auto-commit es preservar la integridad referencial de los datos. Cuando esta opción está seleccionada, toda búsqueda SELECT, INSERT, UPDATE y DELETE (SIUD) no efectuada dentro de una transacción se incluye automáticamente en una operación ad hoc. Esto garantiza que las consultas se ejecutarán en su totalidad o en caso de error, se cancelarán por completo.
Las consultas incluidas en una transacción (gestión personalizada de la integridad referencial) no se verán afectadas por esta opción. Cuando esta opción no está seleccionada, no se genera transacción automática (excepto para las consultas SELECT... FOR UPDATE, consulte el comando SELECT). Por defecto, esta opción no está seleccionada. También puede administrar esta opción por programación utilizando el comando SET DATABASE PARAMETER. Nota: sólo las bases locales consultadas por el motor SQL de 4D se ven afectadas por este parámetro. En el caso de las conexiones externas a otras bases de datos SQL, el mecanismo de auto-commit es manejado por los motores SQL remotos.
Tener en cuenta las mayúsculas y minúsculas en las comparaciones de cadenas: esta opción permite modificar la sensibilidad a las mayúsculas y minúsculas de los caracteres en las consultas SQL. Está seleccionada por defecto, lo que significa que el motor SQL diferencia entre mayúsculas y minúsculas cuando se comparan cadenas (ordenaciones y búsquedas). Por ejemplo, "ABC" = "ABC", pero "ABC" # Abc "." En algunos casos, por ejemplo para alinear el funcionamiento del motor SQL con el del motor 4D, es posible que desee que las comparaciones de cadenas no sean sensibles a las mayúsculas ("ABC" = "Abc"). Para ello, sólo tendrá que deseleccionar esta opción. También puede administrar esta opción por programación utilizando el comando SET DATABASE PARAMETER.
4D implementa el concepto de esquemas. Un esquema es un objeto virtual que contiene las tablas de la base. En el SQL, el propósito de los esquemas es asignar derechos de acceso específicos a los diferentes conjuntos de objetos de la base. Los esquemas dividen la base en entidades independientes que en conjunto forman toda la base. En otras palabras, una tabla siempre pertenece a un sólo esquema.
Para crear un esquema, debe utilizar el comando CREATE SCHEMA. A continuación, puede utilizar los comandos GRANT y REVOKE para configurar los tipos de acceso a los esquemas.
Para asociar una tabla a un esquema, puede llamar a los comandos CREATE TABLE o ALTER TABLE. También puede usar el menú pop-up "Esquemas" del Inspector del editor de estructura de 4D, que lista todos los esquemas definidos en la base.
El comando DROP SCHEMA permite eliminar un esquema.
Nota: el control de acceso vía los esquemas sólo se aplica a las conexiones desde el exterior. El código SQL ejecutado en 4D vía las etiquetas Begin SQL/End SQL, SQL EXECUTE, QUERY BY SQL, siempre tiene acceso total.
En el lenguaje SQL, una llave primaria permite identificar en una tabla la(s) columna(s) (campos) responsables de designar de manera única los registros (líneas). La definición de una llave primaria es particularmente necesaria para la función de replicación de los registros de una tabla de 4D (vér la sección Replicación vía SQL) y para la historialización de las tablas 4D a partir de la v14.
4D le permite administrar la llave primaria de una tabla de varias maneras:
Puede definir una llave primaria durante la creación de una tabla (vía el comando CREATE TABLE) o al agregar o modificar una columna (vía el comando ALTER TABLE). La llave primaria se define utilizando la cláusula PRIMARY KEY seguida por el nombre de la columna o de una lista de columnas. Para obtener más información, consulte la sección definición_llave_primaria.
4D le permite crear y eliminar directamente llaves primarias vía el menú contextual del editor de la estructura.
Para crear una llave primaria:
Seleccione el o los campo(s) que componen la llave primaria de la tabla.
Haga clic derecho y elija el comando Crear la llave primaria en el menú contextual:
Los campos incluidos en la llave primaria aparecen subrayados en el editor y su descripción SQL muestra la palabra clave PRIMARY KEY.
El o los campo(s) que pertenece(n) a la llave primaria no debe contener valores duplicados. Si ya existen valores duplicados en los registros de tabla, aparece una caja de diálogo de advertencia.
Nota: la o las columna(s) que pertenece(n) a la llave primaria no aceptan valores NULL.
Para borrar la llave primaria de una tabla:
Haga clic derecho sobre la tabla que contiene la llave primaria y elija el comando Suprimir la llave primaria en el menú contextual:
Aparece una caja de diálogo de confirmación. Si hace clic en Aceptar, la llave primaria se elimina de inmediato.
El motor SQL integrado de 4D soporta vistas SQL estándar. Una vista es una tabla virtual con datos que pueden provenir de varias tablas de la bases de datos. Una vez que se define una vista, se puede utilizar en un instrucción SELECT como una tabla real.
Los datos se encuentran en una vista se definen mediante una petición de definición basada en el comando SELECT. Las tablas reales utilizadas en la consulta de definición son llamadas "tablas fuentes". Una vista SQL contiene columnas y líneas como una tabla estándar, pero en realidad no existe, sino que es sólo una representación resultante del procesamiento y se almacena en la memoria. Sólo la definición de la vista se almacenada en la base.
Dos comandos SQL se utilizan para administrar vistas en 4D v14: Comandos SQL y DROP VIEW.