0% encontró este documento útil (0 votos)
14 vistas59 páginas

Comandos SQL-WPS Office

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
14 vistas59 páginas

Comandos SQL-WPS Office

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 59

Comandos SQL

Los comandos SQL generalmente se agrupan en dos categorías:

Comandos de manipulación de datos, que se utilizan para obtener, agregar, quitar y/o modificar la
información de base de datos. Específicamente, esto se refiere a los comandos SELECT, INSERT, UPDATE
y DELETE.

Comandos de definición de datos, que se utilizan para crear o eliminar objetos de estructura de la base
de datos o las bases de datos. Específicamente, se refiere a los comandos CREATE DATABASE, CREATE
TABLE, ALTER TABLE, DROP INDEX, DROP TABLE o CREATE SCHEMA.

En la sintaxis, los nombres y las palabras claves aparecen en negrita y se pasan "tal cual". Otros
elementos aparecen en cursiva y se detallan en el capítulo . Las palabras claves y/o las cláusulas que se
pasan entre corchetes [] son opcionales. El carácter barra vertical | separa las diferentes alternativas
disponibles. Cuando los elementos se pasan entre llaves (), separados por barras verticales, esto indica
que sólo un elemento del conjunto debe pasarse.

SELECT

SELECT [ALL | DISTINCT]

{* | select_elemento, ..., select_elemento}


FROM ref_tabla, ..., ref_tabla

[WHERE criterio_búsqueda]

[ORDER BY lista_orden]

[GROUP BY lista_orden]

[HAVING criterio_búsqueda]

[LIMIT {ref_lenguaje_4d|número_entero | ALL}]

[OFFSET ref_lenguaje_4d|número_entero]

[INTO {ref_lenguaje_4d, ..., ref_lenguaje_4d}]

[FOR UPDATE]

Descripción

El comando SELECT se utiliza para recuperar datos de una o más tablas.

Si pasa *, se devuelven todas las columnas, de lo contrario puede pasar uno o más argumentos de tipo
select_elemento para especificar individualmente cada columna a recuperar (separados por comas). Si
agrega la palabra clave opcional DISTINCT a la instrucción SELECT, los valores duplicados no se
devolverán.

No es posible ejecutar búsquedas que contengan a la vez "*" y campos explícitos. Por ejemplo, la
siguiente instrucción:
SELECT *, SALES, TARGET FROM OFFICES

... no se permite, mientras que:

SELECT * FROM OFFICES

...se permite.

La cláusula FROM se utiliza para especificar uno o más argumentos de tipo ref_tabla para la o las tabla(s)
de las cuales los datos se van a recuperar. Puede pasar un nombre SQL estándar o una cadena. No es
posible pasar una expresión de tipo búsqueda en lugar de un nombre de tabla. También puede pasar la
palabra clave opcional AS para asignar un alias a la columna. Si se pasa esta palabra clave, debe estar
seguida por el nombre del alias que también puede ser un nombre SQL o una cadena.

Nota: este comando no soporta campos 4D de tipo Objeto.

La cláusula opcional WHERE establece las condiciones que los datos deben cumplir para ser
seleccionados. Esto se hace pasando una condición_búsqueda que se aplica a los datos recuperados por
la cláusula FROM. La expresión condición_búsqueda siempre devuelve un valor de tipo booleano.

La cláusula opcional ORDER BY se puede utilizar para aplicar un criterio lista_orden a los datos
seleccionados. También puede agregar la palabra clave ASC o DESC para especificar si desea ordenar de
forma ascendente o descendente. Por defecto, se aplica el orden ascendente.

La cláusula opcional GROUP BY se puede utilizar para agrupar datos idénticos en función de los criterios
pasados en lista_orden. Puede pasar varias columnas de grupo. Esta cláusula se puede utilizar para
evitar redundancias o calcular una función de adición (SUM, COUNT, MIN o MAX) que se aplicarán a
estos grupos. También puede agregar la palabra clave ASC o DESC como con la cláusula ORDER BY.

La cláusula opcional HAVING se puede utilizar para aplicar un criterio_búsqueda a uno de los grupos. La
cláusula HAVING se puede pasar sin una cláusula GROUP BY.
La cláusula LIMIT opcional permite restringir el número de datos devueltos a la cantidad definida por la
variable ref_lenguaje_4d o el número_entero.

La cláusula opcional OFFSET permite definir un número (variable ref_lenguaje_4d o número_entero) de


valores a ignorar antes de comenzar a contar para la aplicación de la cláusula LIMIT.

La cláusula INTO permite indicar las variables ref_lenguaje_4d a las cuales los datos se asignarán.

Un comando SELECT que especifica una cláusula FOR UPDATE intenta bloquear para escritura todos los
registros seleccionados. Si al menos un registro no puede bloquearse, todo el comando falla y se
devuelve un error. Sin embargo, si todos los registros seleccionados estaban bloqueados, entonces se
mantendrán bloqueados hasta que la transacción actual se confirme o se cancele.

Ejemplo 1

Suponga que tiene una base de datos de películas con una tabla que contiene los títulos de las películas,
el año en que fueron lanzadas y los boletos vendidos.

Nos gustaría obtener los años a partir de 1979 y la cantidad de entradas vendidas para las películas que
vendieron en total menos de 10 millones de boletas. Queremos saltarnos los primeros 5 años y mostrar
sólo 10 años, ordenados por año.

C_LONGINT($MovieYear;$MinTicketsSold;$StartYear;$EndYear)

ARRAY INTEGER(aMovieYear;0)

ARRAY LONGINT(aTicketsSold;0)

$MovieYear:=1979

$MinTicketsSold:=10000000

$StartYear:=5

$EndYear:=10

Begin SQL
SELECT Year_of_Movie, SUM(Tickets_Sold)

FROM MOVIES

WHERE Year_of_Movie >= :$MovieYear

GROUP BY Year_of_Movie

HAVING SUM(Tickets_Sold) < :$MinTicketsSold

ORDER BY 1

LIMIT :$EndYear

OFFSET :$StartYear

INTO :aMovieYear, :aTicketsSold;

End SQL

Ejemplo 2

Este ejemplo utiliza una combinación de criterios de búsqueda:

SELECT supplier_id

FROM suppliers

WHERE (name = 'CANON')

OR (name = 'Hewlett Packard' AND city = 'New York')

OR (name = 'Firewall' AND status = 'Closed' AND city = 'Chicago');

Ejemplo 3

Dada la tabla VENDEDORES donde QUOTA es la cantidad de ventas esperada para un representante de
ventas y VENTAS la cantidad de ventas efectivamente realizadas.

ARRAY REAL(arrMin_Values;0)

ARRAY REAL(arrMax_Values;0)

ARRAY REAL(arrTotal_Values;0)

Begin SQL
SELECT MIN ( ( VENTAS * 100 ) / QUOTA ),

MAX( (VENTAS * 100 ) / QUOTA ),

SUM( QUOTA ) - SUM ( VENTAS )

FROM VENDEDORES

INTO :arrMin_Values, :arrMax_Values, :arrTotal_Values;

End SQL

Ejemplo 4

Este ejemplo busca todos los actores que nacieron en una ciudad determinada:

ARRAY TEXT(aActorName;0)

ARRAY TEXT(aCityName;0)

Begin SQL

SELECT ACTORS.FirstName, CITIES.City_Name

FROM ACTORS AS 'Act', CITIES AS 'Cit'

WHERE Act.Birth_City_ID=Cit.City_ID

ORDER BY 2 ASC

INTO : aActorName, : aCityName;

End SQL

Ver también

criterio_búsqueda

lista_orden

ref_lenguaje_4d
ref_tabla

select_elemento

sub_consulta.

INSERT

INSERT INTO {nom_sql | cadena_sql}

[(ref_columna, ..., ref_columna)]

[VALUES({[INFILE]expresión_aritmética |NULL}, ..., {[INFILE]expresión_aritmética |NULL};) |


sub_búsqueda]

Descripción

El comando INSERT se utiliza para añadir datos a una tabla existente. La tabla en donde los datos se
añaden se pasa utilizando un argumento de tipo nom_sql o cadena_sql. Los argumentos opcionales tipo
ref_columna permiten definir las columnas en las cuales insertar los valores. Si no se pasa ref_columna,
los valores se insertarán en el mismo orden que en la base (el primer valor pasado se insertará en la
primera columna, el segundo valor en la segunda columna, y así sucesivamente).

Nota: este comando no soporta campos 4D de tipo Objeto.

La palabra clave VALUES se utiliza para pasar el o los valor(es) a insertar en la(s) columna(s)
especificada(s). Puede pasar una expresión_aritmética o NULL. Por otra parte, una subconsulta se puede
pasar en la palabra clave VALUES con el fin de insertar una selección de datos que se pasan como los
valores.
El número de valores pasados vía la palabra clave VALUES debe coincidir con el número de columnas
especificado por el argumento de tipo ref_columna pasado y cada uno de ellos también debe coincidir
con el tipo de datos de la columna correspondiente o al menos ser convertible a ese tipo de datos.

La palabra clave INFILE le permite utilizar el contenido de un archivo externo para especificar los valores
de un nuevo registro. Esta palabra clave sólo se debe utilizar con expresiones de tipo VARCHAR. Cuando
se pasa la palabra clave INFILE, el valor expresión_aritmética se evalúa como una ruta del archivo, y si se
encuentra el archivo, el contenido del archivo se inserta en la columna correspondiente. Sólo los campos
de tipo texto o BLOB pueden recibir valores de un INFILE. El contenido del archivo se transfiere como
datos brutos, sin interpretación.

El archivo buscado debe estar en el equipo que aloja el motor SQL, incluso si la consulta viene de un
cliente remoto. Del mismo modo, la ruta debe expresarse respetando la sintaxis del sistema operativo
del motor de SQL. Puede ser absoluta o relativa.

El comando INSERT es soportado en búsquedas mono y multilíneas. Sin embargo, una instrucción
INSERT multilíneas no permite efectuar operaciones UNION y JOIN.

El motor de 4D permite la inserción de valores multilíneas, que pueden simplificar y optimizar el código,
en particular, al introducir grandes cantidades de datos. La sintaxis de las inserciones multilíneas es del
tipo:

INSERT INTO {sql_name | sql_string}

[(column_ref, ..., column_ref)]

VALUES(arithmetic_expression, ..., arithmetic_expression), ..., (arithmetic_expression, ...,


arithmetic_expression);

Esta sintaxis se ilustra en los ejemplos 3 y 4.

Ejemplo 1

Este ejemplo simple permite insertar una selección de la table2 en la table1:

INSERT INTO table1 (SELECT * FROM table2)

Ejemplo 2
Este ejemplo crea una tabla y luego inserta los valores en ella:

CREATE TABLE ACTOR_FANS

(ID INT32, Nom VARCHAR);

INSERT INTO ACTOR_FANS

(ID, Nom)

VALUES (1, 'Francis’);

Ejemplo 3

La sintaxis multilíneas permite evitar la repetición tediosa de líneas:

INSERT INTO MiTabla

(Campo1,Campo2,CampoBol,CampoHora,CampoInfo)

VALUES

(1,1,1,'11/01/01','11:01:01',’Primera línea’),

(2,2,0,'12/01/02','12:02:02',’Segunda línea’),

(3,3,1,'13/01/03','13:03:03',’Tercera línea’),

………

(7,7,1,'17/01/07','17:07:07',’Séptima línea’);

Ejemplo 4

También puede utilizar las variables o arrays 4D con la sintaxis multilíneas:

INSERT INTO MiTabla

(Campo1,Campo2,CampoBool,CampoFecha,CampoHora, CampoInfo)

VALUES

( :vArrId, :vArrIdx, :vArrbool, :vArrdate, :vArrL, :vArrText);


Nota: no es posible combinar las variables simples y los arrays en la misma instrucción INSERT.

Ver también

DELETE

expresión_aritmética

ref_columna

sub_consulta

anteriorsiguiente

UPDATE

UPDATE {nom_sql| cadena_sql}

SET nom_sql = {expresión_aritmética |NULL}, ..., nom_sql = {expresión_aritmética |NULL}

[WHERE criterio_búsqueda]

Descripción

El comando UPDATE permite modificar los datos contenidos en una tabla indicada por el argumento
nom_sql o cadena_sql.
La cláusula SET se utiliza para asignar nuevos valores (vía una expresión_aritmética o el valor NULL).

La cláusula opcional WHERE se utiliza para especificar cuales datos (los que cumplen la condición
criterio_búsqueda) se deben actualizar. Si no se pasa, todos los datos de la tabla se actualizarán con los
nuevos valores pasados en la cláusula SET.

Nota: este comando no soporta los campos 4D de tipo Objeto.

El comando UPDATE es soportado para consultas y subconsultas, sin embargo, una instrucción UPDATE
posicionada no es compatible.

Las actualizaciones en cascada son implementadas en 4D, pero las reglas de supresión SET NULL y SET
DEFAULT no son soportadas.

Ejemplo

El siguiente ejemplo modifica la tabla MOVIES de manera que los boletos vendidos para la película "Air
Force One" sean 3 500 000:

UPDATE MOVIES

SET Tickets_Sold = 3500000

WHERE TITLE = 'Air Force One';

Ver también

criterio_búsqueda

DELETE

expresión_aritmética.

DELETE
DELETE FROM {nom_sql | cadena_sql}

[WHERE criterio_búsqueda]

Descripción

El comando DELETE se puede utilizar para suprimir todo o una parte de los datos de la tabla indicada por
el argumento nom_sql o cadena_sql después de la palabra clave FROM.

La cláusula WHERE opcional se utiliza para indicar que parte de los datos (los que cumplen la condición
criterio_búsqueda) se van a eliminar. Si no se pasa, todos los datos de la tabla serán suprimidos.

No está soportada la instrucción DELETE posicionada. Las supresiones en cascada son implementadas en
4D, pero las reglas de supresión SET DEFAULT y SET NULL no son soportadas.

Nota: este comando no soporta campos 4D de tipo objeto.

Ejemplo

Este es un ejemplo que elimina todas las películas que estrenaron en el año 2000 o antes de la tabla
MOVIES:

DELETE FROM MOVIES

WHERE Año_estreno <= 2000;


Ver también

criterio_búsqueda

INSERT

UPDATE

anteriorsiguiente

CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] DATAFILE <Ruta de acceso completa>

Descripción

El comando CREATE DATABASE le permite crear una nueva base de datos externa (archivos db .4db
y .4dd) en una ubicación específica.

Si se pasa la restricción IF NOT EXISTS, la base de datos no se crea y ningún error se genera si una base
con el mismo nombre ya existe en la ubicación especificada.

Si no se pasa la restricción IF NOT EXISTS, la base de datos no se crea y se muestra el mensaje de error
"Esta base de datos ya existe. No se pudo ejecutar el comando CREATE DATABASE." si una base de datos
con el mismo nombre ya existe en la ubicación especificada.
La cláusula DATAFILE permite especificar el nombre completo (ruta de acceso completa + nombre) de la
nueva base de datos externa. Debe pasar el nombre del archivo de estructura. El programa añadirá
automáticamente la extensión ".4db" al archivo si no está y crea el archivo de datos. La ruta puede
expresarse en sintaxis POSIX o en la sintaxis del sistema, puede ser absoluta o relativa al archivo de
estructura de la base 4D principal.

Sintaxis POSIX (tipo URL): los nombres de las carpetas están separados por una barra oblicua ("/"),
independientemente de la plataforma que utilice, por ejemplo: .../extdatabases/myDB.4db

Para una ruta absoluta, pase en la primera posición el nombre del volumen seguido de dos puntos, por
ejemplo: "C:/test/extdatabases/myDB.4db"

Sintaxis sistema: ruta de acceso respetando la sintaxis de la plataforma actual, por ejemplo:

(Mac OS) Unidad:Applications:miserv:basesexternas:mibase.4db

(Windows) C:ApplicationsmyservextdatabasesmyDB.4db

Después de la ejecución exitosa del comando CREATE DATABASE, la nueva base de datos creada no se
convierte automáticamente en la base actual. Para hacer esto, debe declararla explícitamente como la
base actual con el comando USE DATABASE.

Sobre las bases externas

Una base externa es una base 4D independiente de la base 4D principal, pero con la que puede trabajar
desde la base 4D principal utilizando el motor SQL de 4D. Usar una base externa significa designar
temporalmente esta base como base actual, es decir, como la base de objetivo de las consultas SQL
ejecutadas por 4D. Por defecto, la base actual es la base principal.

Puede crear una base de datos externa directamente desde la base principal con el comando CREATE
DATABASE. Una vez creada, una base externa puede ser designada como la base actual con el comando
USE DATABASE. A continuación, se puede modificar a través de comandos estándar SQL (CREATE TABLE,
ALTER TABLE, etc.) y puede almacenar datos en ella. La función DATABASE_PATH permite conocer la
base de datos actual en cualquier momento.

El interés principal de las bases externas reside en el hecho de que pueden ser creadas y manipuladas
vía componentes 4D. Esto permite el desarrollo de componentes que son capaces de crear tablas y
campos de acuerdo a sus necesidades.
Nota: una base externa es una base 4D estándar. Se puede abrir y manipular como la base principal
mediante una aplicación 4D o 4D Server. Por el contrario, toda base 4D estándar se puede utilizar como
base externa. Sin embargo, es imperativo que no active el sistema de gestión de acceso (mediante la
asignación de una contraseña al Diseñador) en una base externa, de lo contrario ya no podrá tener
acceso a ella a través del comando USE DATABASE.

Ejemplo 1

Creación de archivos de base externa ExternalDB.4DB y ExternalDB.4DD en C:/MiBase/:

Begin SQL

CREATE DATABASE IF NOT EXISTS DATAFILE 'C:/MiBase/ExternalDB';

End SQL

Ejemplo 2

Creación de archivos de base externa TestDB.4DB y TestDB.4DD junto al archivo de estructura de la base
principal:

Begin SQL

CREATE DATABASE IF NOT EXISTS DATAFILE 'TestDB';

End SQL

Ejemplo 3

Creación de los archivos de base externa External.4DB y External.4DD en la ubicación definida por el
usuario:

C_TEXT($path)

$path:=Select folder("Carpeta de destino de la base externa:")

$path:=$path+"External"

Begin SQL
CREATE DATABASE DATAFILE <<$path>>;

End SQL

Ver también

DATABASE_PATH

USE DATABASE

anteriorsiguiente

USE DATABASE

USE DATABASE

USE [LOCAL | REMOTE] DATABASE

{DATAFILE <Ruta de acceso completa> | SQL_INTERNAL | DEFAULT}

[AUTO_CLOSE]

Descripción

El comando USE DATABASE se utiliza para designar una base externa como base de datos actual, en
otras palabras, la base a la cual se dirigirán las próximas consultas SQL en el proceso actual. Todos los
tipos de consultas SQL concernientes: consultas incluidas en la estructura Begin SQL/End SQL, comandos
SQL EXECUTE o EXECUTE SCRIPT, etc.

Nota: para mayor información sobre bases externas, consulte la descripción del comando CREATE
DATABASE.

Si trabaja en una configuración monopuesto, la base externa debe estar ubicada en la misma máquina
que su 4D.

Si trabaja en modo remoto, la base externa puede estar ubicada en la máquina local o en la máquina 4D
Server.

Si utiliza 4D en modo remoto, la palabra clave REMOTE permite designar una base externa ubicada en
4D Server.

Por razones de seguridad, este mecanismo sólo funciona con conexiones remotas nativas, es decir, en el
contexto de una base 4D remota conectada a 4D Server. Las conexiones vía ODBC o pass-through no
están permitidas.

Si no se especifica la palabra clave, la opción LOCAL se utiliza por defecto. Si está utilizando 4D en modo
local, las palabras claves REMOTE y LOCAL se ignoran: las conexiones son siempre locales.

Para designar una base externa a utilizar, pase su ruta completa (ruta de acceso + nombre) en la cláusula
DATAFILE. La ruta puede expresarse en la sintaxis POSIX o en la sintaxis del sistema. Puede ser absoluta
o relativa al archivo de estructura de la base 4D principal.

En modo remoto, si se pasa la palabra clave REMOTE, este parámetro designa la ruta de acceso de la
base a partir de la máquina servidor. Si se omite o si se pasa la palabra clave LOCAL, este parámetro
designa la ruta de acceso de la base en la máquina 4D local.

Importante: debe designar una base 4D externa válida y en la cual el sistema de control de acceso no
esté activado (mediante la asignación de una contraseña al Diseñador). De lo contrario, se genera un
error.
Con el fin de restablecer la base principal como la base actual, ejecute el comando al pasar la palabra
clave SQL_INTERNAL o DEFAULT.

Pase AUTO_CLOSE si desea cerrar físicamente la base externa después de su uso, es decir, cuando usted
cambia la base actual. De hecho, la apertura de una base externa es una operación que requiere un
poco de tiempo, por razones de optimización 4D mantiene en la memoria la información relativa a las
bases externas abiertas durante la sesión usuario. Esta información se mantiene en memoria hasta que
se lance la aplicación 4D. Las aperturas posteriores de la misma base externa, son por lo tanto más
rápidas. Sin embargo, esto impide el intercambio de bases externas entre varias aplicaciones 4D porque
la base de datos externa sigue estando abierta en lectura/escritura para la primera aplicación que la
utilice. Si varias aplicaciones 4D deben utilizar la misma base externa al mismo tiempo, pase la palabra
clave AUTO_CLOSE para liberar físicamente la base externa después de su uso.

Esta restricción no aplica a los procesos de la misma aplicación: diferentes procesos de una aplicación
siempre pueden acceder a la misma base externa en lectura/escritura sin que sea necesario forzar su
cierre.

Tenga en cuenta que cuando varios procesos utilizan la misma base externa, es físicamente liberada sólo
hasta que el último proceso que utiliza se cierre, incluso cuando se pasa la opción AUTO_CLOSE. Debe
tener en cuenta este funcionamiento para las operaciones que implican el intercambio entre
aplicaciones o supresión de bases externas.

Ejemplo

Uso de una base externa para una búsqueda luego regresa a la base principal:

Begin SQL

USE DATABASE DATAFILE 'C:/MiBase/Noms'

SELECT Name FROM emp INTO :tNoms1

USE DATABASE SQL_INTERNAL

End SQL
Ver también

CREATE DATABASE

DATABASE_PATH

anteriorsiguiente

ALTER DATABASE

ALTER DATABASE {ENABLE | DISABLE} {INDEXES | CONSTRAINTS | TRIGGERS}

Descripción

El comando ALTER DATABASE activa o deshabilita las opciones SQL de la base actual para la sesión
actual. es decir par todos los usuarios y procesos hasta que la base se reinicie.

Este comando está diseñado para permitirle deshabilitar temporalmente las opciones SQL con el fin de
acelerar ciertas operaciones que consumen una gran cantidad de recursos. Por ejemplo, desactivar los
índices y las restricciones antes de comenzar la importación de una gran cantidad de datos puede
reducir significativamente la duración de la importación.

Tenga en cuenta que las restricciones incluyen las llaves primarias y las llaves foráneas, así como los
atributos de unicidad y de nulidad.
Si prefiere gestionar los triggers individualmente para cada tabla, debe utilizar ALTER TABLE.

Ejemplo

Ejemplo de una importación con desactivación temporal de todas las opciones SQL:

Begin SQL

ALTER DATABASE DISABLE INDEXES;

ALTER DATABASE DISABLE CONSTRAINTS;

ALTER DATABASE DISABLE TRIGGERS;

End SQL

SQL EXECUTE SCRIPT("C:\\Exported_data\\Export.sql";SQL On error continue)

Begin SQL

ALTER DATABASE ENABLE INDEXES;

ALTER DATABASE ENABLE CONSTRAINTS;

ALTER DATABASE ENABLE TRIGGERS;

End SQL

anteriorsiguiente

CREATE TABLE
CREATE TABLE [IF NOT EXISTS] [nom_sql.]nom_sql({definicion_columna |restriccion_tabla}[PRIMARY
KEY], ... , {definicion_columna |restriccion_tabla}[PRIMARY KEY]) [{ENABLE | DISABLE} REPLICATE]

Descripción

El comando CREATE TABLE se utiliza para crear una tabla llamada nom_sql con los campos especificados
al pasar una o más definicion_columna y/o restriccion_tabla. Si se pasa la restricción IF NOT EXISTS, la
tabla sólo se crea cuando no existe una tabla con el mismo nombre en la base. De lo contrario, no se
crea y no se genera ningún error.

El primer parámetro nom_sql (opcional) permite designar el esquema SQL al cual quiere asignar la tabla.
Si no pasa este parámetro o si pasa el nombre de un esquema que no existe, el esquema por defecto se
le asigna automáticamente, llamado "DEFAULT_SCHEMA". Para mayor información sobre los esquemas
SQL, consulte la sección Implementaciones del motor SQL de 4D.

Nota: también es posible asignar una tabla a un esquema SQL utilizando el menú pop-up "Esquemas" en
el Inspector de tablas de 4D. Este menú contiene la lista de esquemas definidos en la base.

Una definicion_columna contiene el nombre (nom_sql) y el tipo de datos (tipo_datos_sql) de una


columna y una restriccion_tabla restringe los valores que una tabla puede almacenar.

Nota: este comando no permite añadir un campo (columna) de tipo Objeto.

La palabra clave PRIMARY KEY se utiliza para especificar la llave primaria cuando se crea la tabla. Para
mayor información sobre las llaves primarias, consulte la sección Implementaciones del motor SQL de
4D.

Las palabras claves ENABLE REPLICATE y DISABLE REPLICATE se utilizan para activar o desactivar el
mecanismo que permite la replicación de la tabla (ver la sección Replicación vía SQL).
Nota para despliegue

Dado que este comando modifica la estructura de la base de datos, no puede utilizarse en el contexto de
una aplicación empaquetada de sólo lectura (archivo .4dc instalado en la carpeta Archivos de programa
o archivo .4dz).

Ejemplo 1

Este es un ejemplo simple de creación de una tabla con dos columnas:

CREATE TABLE ACTOR_FANS

(ID INT32, Nom VARCHAR);

Ejemplo 2

Este ejemplo crea la misma tabla pero sólo si no hay una tabla con el mismo nombre:

CREATE TABLE IF NOT EXISTS ACTOR_FANS

(ID INT32, Nom VARCHAR);

Ejemplo 3

Este ejemplo crea la tabla "Preferences" y se le asigna el esquema "Control":

CREATE TABLE Control.Preferences

(ID INT32, Value VARCHAR);

Ver también

ALTER TABLE

definición_columna
DROP TABLE

restricción_tabla

anteriorsiguiente

ALTER TABLE

ALTER TABLE nom_sql

{ADD [TRAILING] definición_columna [PRIMARY KEY] |

[TRAILING] |

DROP nom_sql |

ADD definición_llave_primaria |

DROP PRIMARY KEY |

ADD definición_llave_foránea |

DROP CONSTRAINT nom_sql |

[{ENABLE | DISABLE} REPLICATE] |

[{ENABLE | DISABLE} LOG] |

[MODIFY sql_name {ENABLE | DISABLE} AUTO_INCREMENT] |

[MODIFY sql_name {ENABLE | DISABLE} AUTO_GENERATE] |


[{ENABLE | DISABLE} TRIGGERS] |

SET SCHEMA nom_sql}

Descripción

El comando ALTER TABLE se utiliza para modificar una tabla existente (nom_sql). Puede efectuar una de
las siguientes acciones:

Pasar ADD definición_columna añade una columna a la tabla.

La palabra clave TRAILING (debe ubicarse en frente de definición_columna si se utiliza) forza la creación
de la columna luego de la última columna existente de la tabla en el archivo de estructura. Esta opción
es útil cuando las columnas que contienen los datos se han eliminado de la tabla (sin que los datos sean
borrados), para evitar que los datos existentes sean reasignados a la nueva columna.

Nota: este comando no permite añadir un campo (columna) de tipo Objeto.

La palabra clave PRIMARY KEY se utiliza para definir la llave primaria cuando se añade una columna.

Pasar DROP nom_sql elimina la columna nom_sql de la tabla.

Pasar ADD definición_llave_primaria añade una llave primaria (PRIMARY KEY) a la tabla.

Pasar DROP PRIMARY KEY elimina la llave primaria (PRIMARY KEY) de la tabla.

Pasar ADD definición_llave_foránea añade una llave foránea (FOREIGN KEY) a la tabla.

Pasar DROP CONSTRAINT nom_sql elimina la restricción especificada por nom_sql de la tabla.

Pasar ENABLE REPLICATE o DISABLE REPLICATE activa o desactiva el mecanismo que permite la
replicación de la tabla (ver la sección Replicación vía SQL).

Pasar ENABLE LOG o DISABLE LOG activa o desactiva el historial de la tabla.

Pasar ENABLE AUTO_INCREMENT o DISABLE AUTO_INCREMENT activa o desactiva la opción


"Autoincrement" de los campos de tipo entero largo.

Pasar ENABLE AUTO_GENERATE o DISABLE AUTO_GENERATE activa o desactiva la opción "Auto UUID"
para los campos alfa de tipo UUID. En los dos casos, debe pasar la palabra clave MODIFY seguida del
nom_sql de la columna a modificar.
Pasar ENABLE TRIGGERS o DISABLE TRIGGERS activa o desactiva los triggers para la tabla. Si desea
gestionar los triggers globalmente a nivel de la base, debe utilizar ALTER DATABASE.

Pasar SET SCHEMA nom_sql transfiere la tabla al esquema nom_sql.

El comando devuelve un error:

cuando el parámetro opcional ENABLE LOG se pasa y ninguna llave primaria válida se ha definido,

si intenta modificar o eliminar la definición de llave primaria de la tabla sin desactivar el historial vía
DISABLE LOG.

Nota para despliegue

Dado que este comando modifica la estructura de la base de datos, no puede utilizarse en el contexto de
una aplicación empaquetada de sólo lectura (archivo .4dc instalado en la carpeta Archivos de programa
o archivo .4dz).

Ejemplo 1

Este ejemplo crea una tabla, inserta un conjunto de valores en ella, luego añade una columna Num_Tel,
inserta otro conjunto de valores y luego elimina la columna ID:

CREATE TABLE ACTOR_FANS

(ID INT32, Nom VARCHAR);

INSERT INTO ACTOR_FANS

(ID, Nom)

VALUES(1, 'Francis');

ALTER TABLE ACTOR_FANS

ADD Num_Tel VARCHAR;


INSERT INTO ACTOR_FANS

(ID, Nom, Num_Tel)

VALUES (2, 'Florence', '01446677888');

ALTER TABLE ACTOR_FANS

DROP ID;

Ejemplo 2

Ejemplo para activar la opción "Autoincrement" del tipo campo Entero largo [Table_1]id:

Begin SQL

ALTER TABLE Table_1 MODIFY id ENABLE AUTO_INCREMENT;

End SQL

Desactivando la opción:

Begin SQL

ALTER TABLE Table_1 MODIFY id DISABLE AUTO_INCREMENT;

End SQL

Ejemplo para la activación de "Auto UUID" del campo tipo Alfa [Table_1]uid:

Begin SQL

ALTER TABLE Table_1 MODIFY uid ENABLE AUTO_GENERATE;

End SQL

Desactivando la opción:
Begin SQL

ALTER TABLE Table_1 MODIFY uid DISABLE AUTO_GENERATE;

End SQL

Ver también

CREATE TABLE

definición_columna

definición_llave_foránea

definición_llave_primaria

DROP TABLE

anteriorsiguiente

DROP TABLE

DROP TABLE [IF EXISTS] nom_sql

Descripción
El comando DROP TABLE se utiliza para eliminar la tabla nom_sql de una base. Cuando se pasa la
restricción IF EXISTS, si la tabla a eliminar no existe en la base, el comando no hace nada y no se genera
ningún error.

Este comando no sólo elimina la tabla de la estructura, sino también sus datos y los índices, triggers y
restricciones asociados. No se puede utilizar este comando con una tabla referenciada por una
restricción FOREIGN KEY.

Nota: debe asegurarse de que cuando se ejecute el comando DROP TABLE, no haya registros de la tabla
nom_sql que se carguen en memoria en modo de escritura. De lo contrario, se genera el error 1272.

Nota para despliegue

Dado que este comando modifica la estructura de la base de datos, no puede utilizarse en el contexto de
una aplicación empaquetada de sólo lectura (archivo .4dc instalado en la carpeta Archivos de programa
o archivo .4dz).

Ejemplo 1

Este ejemplo borra la tabla ACTOR_FANS:

DROP TABLE ACTOR_FANS

Ejemplo 2

Este ejemplo hace lo mismo que el anterior excepto que en este caso, si la tabla ACTOR_FANS no existe,
no se genera ningún error:

DROP TABLE IF EXISTS ACTOR_FANS

Ver también

ALTER TABLE
CREATE TABLE

anteriorsiguiente

CREATE INDEX

CREATE [UNIQUE] INDEX nom_sql ON nom_sql (ref_columna, ... , ref_columna)

Descripción

El comando CREATE INDEX permite crear un índice (nom_sql) en una o más columnas de una tabla
existente (nom_sql) designada por el o los parámetros ref_columna. Los índices son transparentes para
los usuarios y permiten acelerar la ejecución de las peticiones.

Nota: el motor 4D SQL no soporta el atributo UNIQUE para índices. Se puede pasar a CREATE INDEX por
compatibilidad con scripts SQL genéricos (no se genera ningún error), pero se ignorará. Utilice la palabra
clave UNIQUE en definición_columna de CREATE TABLE para no permitir valores duplicados en una
columna.

Nota para despliegue

Dado que este comando modifica la estructura de la base de datos, no puede utilizarse en el contexto de
una aplicación empaquetada de sólo lectura (archivo .4dc instalado en la carpeta Archivos de programa
o archivo .4dz).
Ejemplo

Este es un ejemplo de creación de índices:

CREATE INDEX ID_INDEX ON ACTOR_FANS (ID)

Ver también

DROP INDEX

ref_columna

.DROP INDEX

DROP INDEX nom_sql

Descripción

El comando DROP INDEX permite eliminar de la base el índice existente designado por nom_sql. No
puede utilizarse con los índices creados por las restricciones PRIMARY KEY o UNIQUE.

Ejemplo

Este es un ejemplo simple de eliminación de un índice:


DROP INDEX ID_INDEX

Ver también

CREATE INDEX

LOCK TABLE

LOCK TABLE nom_sql IN {EXCLUSIVE | SHARE} MODE

Descripción

El comando LOCK TABLE permite bloquear la tabla nom_sql en el modo EXCLUSIVE o SHARE.

En el modo EXCLUSIVE, los datos de la tabla no pueden leerse o modificarse por otra transacción.

En el modo SHARE, los datos de la tabla pueden ser leídos por otras transacciones pero las
modificaciones siguen siendo prohibidas.

Ejemplo

Este ejemplo bloquea la tabla MOVIES de manera que pueda ser leída pero no modificada por otras
transacciones:
LOCK TABLE MOVIES IN SHARE MODE

UNLOCK TABLE

UNLOCK TABLE nom_sql

Descripción

El comando UNLOCK TABLE se utiliza para desbloquear la tabla nom_sql previamente bloqueada vía el
comando LOCK TABLE. Este comando no funciona si se pasa dentro de una transacción o si se utiliza en
una tabla que bloqueada por otro proceso.

Ejemplo

Este comando elimina el bloquea de la tabla PELICULAS:

UNLOCK TABLE PELICULAS

EXECUTE IMMEDIATE
EXECUTE IMMEDIATE <<nom_sql>> | <<$nom_sql>> | :nom_sql | :$nom_sql

Descripción

El comando EXECUTE IMMEDIATE permite ejecutar una expresión SQL dinámica. El argumento nom_sql
representa una variable que contiene un conjunto de instrucciones SQL que se ejecutarán como un
todo.

Notas:

Este comando no puede utilizarse en una conexión SQL externa (pass-through) iniciada vía el comando
4D SQL LOGIN.

En modo compilado, no es posible utilizar las variables 4D locales (que comienzan por el carácter $) en la
cadena de búsqueda pasada al comando EXECUTE IMMEDIATE.

Ejemplo

Este ejemplo recupera el número de películas realizadas desde 1960:

C_LONGINT(NumMovies)

C_TEXT(tQueryTxt)

NumMovies:=0

tQueryTxt:="SELECT COUNT(*) FROM MOVIES WHERE Year_of_Movie >= 1960 INTO :NumMovies;"

Begin SQL

EXECUTE IMMEDIATE :tQueryTxt;


End SQL

ALERT("La videoteca contiene "+String(NumMovies)+" películas realizadas desde 1960")

CREATE SCHEMA

CREATE SCHEMA nom_sql

Descripción

El comando CREATE SCHEMA permite crear un nuevo esquema SQL llamado nom_sql en la base de
datos. Puede utilizar todo nom_sql excepto por "DEFAULT_SCHEMA" y "SYSTEM_SCHEMA".

Nota: para mayor información sobre los esquemas, consulte la sección .

Cuando se crea un nuevo esquema, por defecto los derechos de acceso asociados son los siguientes:

Sólo lectura (Datos): <Todos>

Lectura/Escritura (Datos):<Todos>

Completo (datos y estructura): <Persona>

Cada esquema puede atribuirse un tipo de derechos de acceso externos utilizando el comando GRANT.

Solo el Diseñador y el Administrador de la base puede crear, modificar o eliminar esquemas.


Atención: la implementación del esquema SQL requiere que el sistema de administración de acceso de
4D esté activado (en otras palabras, se haya asignado una contraseña al Diseñador). De lo contrario,
todos los usuarios pueden tener acceso a los datos sin restricciones.

Cuando una base de datos se crea o se convierte con 4D v11 SQL (desde la versión 3), se crea un
esquema por defecto con el fin de agrupar todas las tablas de la base. Este esquema se llama
"DEFAULT_SCHEMA". No puede borrarse ni renombrarse.

Ejemplo

Creación de un esquema llamado "Derechos_Contabilidad":

CREATE SCHEMA Derechos_Contabilidad

ALTER SCHEMA

ALTER SCHEMA nom_sql RENAME TO nom_sql

Descripción

El comando ALTER SCHEMA permite renombrar el esquema SQL nom_sql (primer parámetro) por
nom_sql (segundo parámetro).

Sólo el Diseñador y el Administrador pueden modificar esquemas.


Nota: no es posible renombrar el esquema por defecto ("DEFAULT_SCHEMA") o el esquema que
contiene las tablas sistema ("SYSTEM_SCHEMA") ni utilizar estos nombres en sql_name (segundo
parámetro).

Ejemplo

Renombrar el esquema MyFirstSchema por MyLastSchema:

ALTER SCHEMA MyFirstSchema RENAME TO MyLastSchema

Ver también

CREATE SCHEMA

CREATE VIEW

CREATE [OR REPLACE] VIEW [nom_schema.]nom_vista[(lista_columnas)] AS instruccion_select[;]

Descripción

El comando CREATE VIEW permite crear una vista SQL llamada nom_vista (que es un nom_sql estándar)
que contiene las columnas definidas en el parámetro lista_columnas. Es necesario especificar un
nombre de columna si esta columna es una función o se deriva de una operación aritmética (escalar).
También es necesario especificar un nombre de columna cuando se quiere evitar tener distintas
columnas con el mismo nombre (por ejemplo, durante una operación JOIN) o cuando desea utilizar un
nombre de columna diferente del que se deriva.

Si se pasa el parámetro lista_columnas, debe contener el mismo número de columnas como en la


petición de definición instruccion_select de la vista. Si se omite lista_columnas, las columnas de la vista
tendrán los

mismos nombres que los de las columnas de la instruccion_select de la vista.

Las vistas y las tablas deben tener nombres únicos.

Si pasa la opción OR REPLACE, la vista se recreará automáticamente si ya existe. Esta opción puede ser
útil con el fin de cambiar la definición de una vista existente sin tener que borrar/crear/afectar los
privilegios

de los objetos que ya están definidos para la vista actual.

Si no se pasa la opción OR REPLACE, y si la vista ya existe, se devuelve un error.

nom_schema es también un nom_sql estándar y puede utilizarlo para designar el nombre del esquema
que contendrá la vista. Si no pasa nom_schema o si pasa el nombre de un esquema que no existe, la
vista

se asigna automáticamente al esquema por defecto, llamado "DEFAULT_SCHEMA".

Instruccion_select designa la instrucción SELECT que es la consulta de definición de la vista. La


Instruccion_select es la misma que un SELECT estándar de 4D, pero con las siguientes restricciones:

No puede utilizar las cláusulas INTO, LIMIT u OFFSET ya que la limitación, definición o asignación de
variables en 4D será realizada por SELECT que llama a la vista.

No puede utilizar la cláusula GROUP BY.


Las vistas son de sólo lectura y no se pueden actualizar.

Una definición de vista es "estática" y no se actualiza si las tablas fuentes se modifican o eliminan. En
particular, las columnas añadidas a una tabla no aparecen en la vista basada en esta tabla. Del mismo

modo, si trata de acceder por medio de una vista a las columnas eliminadas, se produce un error.

Sin embargo, una vista que refiera a una vista fuente eliminada seguirá funcionando. De hecho, cuando
se crea una vista, convierte cualquier referencia de vistas en referencias a las tablas fuente.

Las vistas tienen un alcance global. Una vez que se crea una vista con CREATE VIEW, es accesible para
todas las partes de la aplicación (4D remoto vía SQL, bases externas creadas con el comando CREATE
DATABASE, otras bases utilizan el comando SQL LOGIN, etc.) y durante la sesión, hasta que se borra
utilizando el comando DROP VIEW o se cierre la base.

Ejemplo

Aquí presentamos algunos ejemplos de definiciones de vista basados en la tabla PEOPLE que contiene
las siguientes columnas:

ID INT64

NOMBRE VARCHAR(30)

APELLIDO VARCHAR(30)

DEPARTAMENTO VARCHAR(30)

SALARIO INT

Una vista sin restricciones:

CREATE VIEW FULLVIEW AS

SELECT * FROM PERSONS;

Una vista sin restricciones: "horizontales". Por example, usted quiere mostrar únicamente las personas
que trabajan en el departamento de Mercadeo:
CREATE VIEW HORIZONTALVIEW (ID, Nombre, Apellido, Salario) AS

SELECT ID, FIRST_NAME, LAST_NAME, SALARY FROM PERSONS

WHERE DEPARTMENT = 'Marketing';

Una vista agregada:

CREATE VIEW AGGREGATEVIEW (Nombre, Apellido AnnualSalary) AS

SELECT Nombre, Apellido, SALARY*12 FROM PERSONS;

Una vista con restricciones "verticales". Por ejemplo, usted no quiere mostrar la columna SALARY:

CREATE VIEW VERTICALVIEW (ID, Nombre, Apellido, Departamento) AS

SELECT ID, FIRST_NAME, LAST_NAME, DEPARTEMENT FROM PERSONS;

Una vez definidas las vista, puede utilizarlas como tablas estándar. Por ejemplo, si quiere obtener todas
las personas cuyo salario es mayor a 5,000 Euros:

SELECT * FROM FULLVIEW

WHERE SALARY < 5000

INTO :aID, :aNombre, :aApellido, :aDepartamento, :aSalario;

Otro ejemplo: usted quiere obtener todas las personas del departamento de Mercadeo cuyo nombre es
"Miguel":

SELECT ID, Apellido, Salary FROM HORIZONTALVIEW

WHERE Nombre='Miguel'

INTO :aID, :aApellido, :aSalary;


DROP VIEW

DROP VIEW [IF EXISTS] [schema_name.]view_name[;]

Descripción

El comando DROP VIEW borra de la base la vista llamada nom_vista.

Cuando se pasa la restricción IF EXISTS, el comando no hace nada y no se genera ningún error si la vista
nom_vista no existe en la base.

nom_esquema es un nom_sql estándar y se puede utilizar para designar el nombre del esquema que va
a contener la vista. Si no pasa nom_esquema o si pasa un nombre de esquema que no existe, la vista se
considera automáticamente como que pertenece al esquema por defecto, llamado
"DEFAULT_SCHEMA".

GRANT
GRANT[READ | READ_WRITE | ALL] ON sql_name TO sql_name

Descripción

El comando GRANT permite definir los derechos de acceso asociados al esquema nom_sql (primer
parámetro). Estos derechos se asignarán al grupo de usuarios 4D designados por el segundo parámetro
nom_sql.

Las palabras claves READ, READ_WRITE y ALL permiten definir los tipos de acceso autorizados para la
tabla:

READ establece el modo de acceso de sólo lectura (datos). Por defecto: <Everybody>

READ_WRITE establece el modo de acceso lectura/escritura (datos).Por defecto: <Everybody>

ALL establece el modo de acceso completo (datos y estructura). Por defecto: <Nobody>

Note que cada tipo de acceso está definido independientemente de los otros. En particular, si asigna
sólo los derechos READ a un grupo, esto no tendrá ningún efecto ya que el grupo como también los
otros continuarán beneficiándose del acceso READ_WRITE (asignado a todos los grupos por defecto).
Para definir el acceso READ, debe llamar dos veces el comando GRANT (ver ejemplo 2).

El control de acceso solo aplica a las conexiones externas. El código SQL ejecutado al interior de 4D vía
las etiquetas Begin SQL/End SQL o los comandos tales como SQL EXECUTE tiene acceso total.

Nota de compatibilidad: durante la conversión de una base anterior a la versión 11.3 o superior, los
derechos de acceso globales (tales como los definidos en la página SQL de las Preferencias de la
aplicación) se transfieren al esquema por defecto.

El segundo parámetro nom_sql debe contener el nombre del grupo de usuarios 4D al que desea asignar
derechos de acceso al esquema. Este grupo debe existir en la base 4D.
Nota: 4D permite definir los nombres de grupos incluyendo espacios y/o caracteres acentuados que no
son aceptados por el estándar SQL. En este caso, debe poner el nombre entre los caracteres [ y ]. Por
ejemplo: GRANT READ ON [mi esquema] TO [los administradores]

Solo el Diseñador y el Administrador de la base pueden modificar los esquemas.

Atención: la implementación del esquema SQL requiere que el sistema de administración de acceso de
4D esté activado (en otras palabras, se haya asignado una contraseña al Diseñador). De lo contrario,
todos los usuarios pueden tener acceso a los datos sin restricciones.

Nota sobre la integridad referencial

4D garantiza el principio de integridad referencial independientemente de los derechos de acceso. Por


ejemplo, supongamos que tiene dos tablas, Tabla1 y Tabla2, conectadas por una relación de tipo
Muchos a Uno (Tabla2 -> Tabla1). Tabla1 pertenece al esquema S1 y Tabla2 al esquema S2. Un usuario
que tenga derechos de acceso al esquema S1 pero no al S2 puede eliminar los registros en la Tabla1. En
este caso, con el fin de respetar los principios de integridad referencial, todos los registros de Tabla2 que
están relacionados con los registros eliminados de la Tabla1 también se eliminarán.

Ejemplo 1

Usted quiere autorizar el acceso en lectura escritura de datos del esquema MiEsquema1 al grupo
"Power_Users":

GRANT READ_WRITE ON MiEsquema1 TO POWER_USERS

Ejemplo 2

Usted quiere autorizar un acceso en lectura únicamente al grupo "Readers". Este caso requiere asignar
al menos un grupo con derechos READ_WRITE (aquí "Admins") de manera que ya no se asigna a todos
los grupos por defecto:

GRANT READ ON MySchema2 TO Readers /*Asignación del acceso en lectura únicamente */

GRANT READ_WRITE ON MySchema2 TO Admins /*Detener el acceso a todos en lectura escritura*/


REVOKE

REVOKE [READ | READ_WRITE | ALL] ON nom_sql

Descripción

El comando REVOKE permite borrar los derechos de acceso específicos asociados al esquema definido
por el parámetro nom_sql.

Cuando ejecuta este comando, asigna el pseudo-grupo de usuarios <Persona> al derecho de acceso
definido.

Ejemplo

Usted quiere borrar todo derecho lectura-escritura al esquema MiEsquema1:

REVOKE READ_WRITE ON MiEsquema1


REPLICATE

REPLICATE lista_replicada

FROM ref_tabla

[WHERE criterio_búsqueda]

[LIMIT {número_entero | ref_lenguaje_4d}]

[OFFSET {número_entero | ref_lenguaje_4d}]

FOR REMOTE [STAMP] {número_entero | ref_lenguaje_4d}

[, LOCAL [STAMP] {número_entero | ref_lenguaje_4d}]

[{REMOTE OVER LOCAL | LOCAL OVER REMOTE}]

[LATEST REMOTE [STAMP] ref_lenguaje_4d

[, LATEST LOCAL [STAMP] ref_lenguaje_4d]]

INTO {lista_objetivo | ref_tabla(nom_sql_1;...;nom_sql_N)};

Descripción

El comando REPLICATE permite replicar los datos de una tabla de una base A en la de una tabla de una
base B. Por convención, la base donde se ejecuta el comando se llama "base local" y la base de la cual
los datos se replican se llama "base remota".

Este comando sólo puede utilizarse en el marco de un sistema de replicación de base. Para que el
sistema funcione, la replicación debe haber sido activada en la base local y en la base remota y cada
tabla implicada deberá tener una llave primaria. Para mayor información sobre este sistema, consulte la
sección Replicación vía SQL.

Nota: si desea implementar un sistema de sincronización completo, consulte la descripción del comando
SYNCHRONIZE.

Pase una lista de campos (virtuales o estándar), separados por comas en lista_replicada. Los campos
deben pertenecer a la tabla ref_tabla de la base remota.

La cláusula FROM debe ir seguida de un argumento del tipo ref_tabla que permite designar la tabla de la
base remota desde la cual replicar los datos de los campos lista_replicada.

Nota: los campos virtuales de la tabla remota sólo se pueden almacenar en los arrays de la base local.

Lado base remota

La cláusula opcional WHERE permite aplicar un filtro preliminar a los registros de la tabla en la base de
datos remota; sólo aquellos registros que cumplan los criterios_de_búsqueda serán tenidos en cuenta
por el comando.

4D recupera los valores de los campos lista_replicada para todos los registros designados por la cláusula
FOR REMOTE STAMP. El valor pasado en esta cláusula puede ser:

Un valor de tipo entero largo > 0: en este caso, se recuperan los registros donde el valor de
__ROW_STAMP es mayor o igual a este valor.

0: en este caso, se recuperan todos los registros donde el valor de __ROW_STAMP es diferente de 0.
Tenga en cuenta que los registros que existían antes de la activación de la replicación, no serán tenidos
en cuenta (el valor de __ROW_STAMP = 0).

-1: en este caso, todos los registros de la tabla remota se recuperan, es decir, todos los registros donde
el valor de __ROW_STAMP >= 0. A diferencia del caso anterior, se tendrán en cuenta todos los registros
de la tabla, incluidos los que existían antes de la activación de la replicación.

-2: En este caso, se recuperan todos los registros borrados de la tabla remota (después de la activación
de la replicación), es decir, todos los registros donde el valor de __ROW_ACTION = 2.
Por último, puede aplicar a la selección obtenida las cláusulas opcionales OFFSET y/o LIMIT:

Cuando se pasa, la cláusula OFFSET permite ignorar los primeros X registros de la selección (donde X es
el valor pasado a la cláusula).

Cuando se pasa, la cláusula LIMIT permite restringir la selección a los Y primeros registros de la selección
(donde Y es el valor pasado a la cláusula). Si la cláusula OFFSET también se pasa, la cláusula LIMIT se
aplica a la selección obtenida tras la ejecución de OFFSET.

Una vez aplicadas ambas cláusulas, la selección resultante se envía a la base local.

Lado base local

Los valores recuperados se escriben directamente la lista_objetivo de la base local o en los campos
estándar especificados por nom_sql de la tabla ref_tabla de la base local.

El argumento lista_objetivo puede contener una lista de campos estándar o una lista de arrays del
mismo tipo que los campos remotos (pero no una combinación de ambos). Si el destino del comando es
una lista de campos, los registros objetivos serán creados, modificados o eliminados automáticamente
en función de la acción almacenada en el campo virtual __ROW_ACTION.

Los conflictos para los registros duplicados que ya existen en la base objetivo (llaves primarias idénticas)
se resuelven utilizando las cláusulas de prioridad (opción REMOTE OVER LOCAL y LOCAL OVER REMOTE):

Si pasa la opción REMOTE OVER LOCAL u omite la cláusula de prioridad, todos los registros fuente (base
remota) designados por la cláusula FOR REMOTE STAMP reemplazan los registros objetivo (base local) si
ya existen, cambiados o no de un lado o del otro. En este caso, no tiene sentido pasar una cláusula
LOCAL STAMP porque se ignorará.

Si pasa la opción LOCAL OVER REMOTE, el comando tiene en cuenta el marcador local LOCAL STAMP. En
este caso, los registros objetivo (base local) cuyo valor de marcador es inferior o igual al pasado en
LOCAL STAMP no son remplazados por los registros fuente (base remota). Por ejemplo, si pasa 100 en
LOCAL STAMP, todos los registros de la base local cuyo marcador sea menor o igual a 100 serán
remplazados por los registros equivalentes de la base remota. Este principio permite preservar los datos
modificados localmente y reducir la selección de los registros a replicar en la tabla local.

Si pasa las cláusulas LATEST REMOTE STAMP y/o LATEST LOCAL STAMP, 4D devuelve en las variables
ref_lenguaje_4D correspondientes los valores de los últimos marcadores de las tablas local y remota.
Esta información puede ser útil si desea personalizar la gestión del procedimiento de sincronización.
Estos valores corresponden al valor de los marcadores inmediatamente después de terminada la
operación de replicación: si los utiliza en una instrucción REPLICATE o SYNCHRONIZE, no es necesario
incrementarlos porque son incrementados automáticamente antes de ser devueltos por el comando
REPLICATE.

Si la operación de replicación se lleva a cabo correctamente, la variable sistema OK toma el valor 1.


Puede controlar este valor desde un método 4D.

Si se producen errores durante la operación de replicación, la operación se detiene cuando ocurra el


primer error. La última variable 4d_language_reference de la cláusula LATEST REMOTE STAMP (si se ha
especificado) se valoriza con el marcador del registro en el que se produjo el error. La variable sistema
OK toma el valor 0. El error generado puede interceptarse por un método de gestión de errores
instalado por el comando ON ERR CALL.

Nota: las operaciones efectuadas por el comando REPLICATE no tienen en cuenta las restricciones de
integridad de datos. Esto significa, por ejemplo, que las reglas que rigen las llaves foráneas, unicidad,
etc. no son verificadas. Si los datos recibidos pueden afectar la integridad de los datos, debe comprobar
los datos después de la operación de replicación. La manera más simple es bloquear, vía el lenguaje 4D
o SQL, los registros que se tienen que modificar.

Ver también

SYNCHRONIZE
SYNCHRONIZE

[LOCAL] TABLE ref_tabla (ref_columna_1,...,ref_columna_N)

WITH

[REMOTE] TABLE ref_tabla (ref_columna_1,...,ref_columna_N)

FOR REMOTE [STAMP] {número_entero | ref_lenguaje_4d},

LOCAL [STAMP] {número_entero | ref_lenguaje_4d}

{REMOTE OVER LOCAL | LOCAL OVER REMOTE}

LATEST REMOTE [STAMP] ref_lenguaje_4d,

LATEST LOCAL [STAMP] ref_lenguaje_4d;

Descripción

El comando SYNCHRONIZE permite sincronizar dos tablas ubicadas en dos servidores 4D SQL diferentes.
Todo cambio realizado en una de las tablas también se efectúa en el otro. El servidor 4D SQL que ejecuta
el comando se llama servidor local y el otro servidor se llama servidor remoto.

El comando SYNCHRONIZE es una combinación de dos llamadas internas al comando REPLICATE. La


primera llamada replica los datos desde el servidor remoto al servidor local y la segunda efectúa la
operación inversa: replicación de los datos del servidor local al servidor remoto. Las tablas a sincronizar
deben estar configuradas para la replicación

Deben tener una llave primaria,

La opción "Activar replicación" debe estar seleccionada en la ventana Inspector de cada tabla.

Para mayor información, consulte la descripción del comando REPLICATE.

El comando SYNCHRONIZE acepta cuatro marcadores (stamps) como "parámetros": dos marcadores en
entrada y dos marcadores en salida (última modificación). Los marcadores de entrada se utilizan para
indicar el momento de la última sincronización en cada servidor. Los marcadores de salida devuelven el
valor de los marcadores de modificación en cada servidor justo después de la última modificación.
Gracias a este principio, cuando el comando SYNCHRONIZE se llama regularmente, es posible usar los
marcadores de salida de la última sincronización como marcadores de entrada para la siguiente.

Nota: los marcadores de entrada y de salida se expresan como valores numéricos (stamps) y no de
marcadores de tiempo (timestamps). Para obtener más información sobre estos marcadores, consulte la
descripción del comando REPLICATE.

En caso de error, el marcador de salida del servidor en cuestión contiene el marcador del registro al
origen del error. Si el error se debe a una causa distinta a la sincronización (problemas de red por
ejemplo), el marcador contendrá 0.

Hay dos códigos de error diferentes, uno para indicar un error de sincronización en el sitio local y otro
para un error de sincronización en el sitio remoto.

Cuando ocurre un error, el estado de los datos dependerá de la de la transacción en el servidor local. En
el servidor remoto, la sincronización se realiza siempre dentro de una transacción, de manera que los
datos no puedan ser alterados por la operación. Sin embargo, en el servidor local, el proceso de
sincronización queda bajo el control del desarrollador. Se efectúa fuera de cualquier transacción si la
preferencia Transacciones Auto-commit no está activada, (de lo contrario, un contexto de transacción se
crea automáticamente). El desarrollador puede optar por iniciar una transacción y es responsabilidad
del desarrollador validar o cancelar esta transacción después de la sincronización de los datos.

Puede "forzar" la dirección de sincronización utilizando las cláusulas REMOTE OVER LOCAL y LOCAL
OVER REMOTE, dependiendo de las características de su aplicación. Para mayor información sobre los
mecanismos de implementación, consulte la descripción del comando REPLICATE.

Nota: las operaciones efectuadas por el comando SYNCHRONIZE no tienen en cuenta restricciones de
integridad de los datos. Esto significa, por ejemplo, que las reglas que rigen las llaves foráneas, unicidad,
etc. no son verificadas. Si los datos recibidos pueden afectar la integridad de datos, debe verificar los
datos después de la operación de sincronización. La manera más simple es bloquear, vía el lenguaje 4D o
SQL, los registros que deben modificarse.

En las variables 4d_language_ref de las cláusulas LATEST REMOTE STAMP y LATEST LOCAL STAMP, 4D
devuelve los valores de los últimos marcadores de las tablas remota y local. Esta información le permite
automatizar la gestión del procedimiento de sincronización. Estos valores corresponden al valor de los
marcadores hasta el final de la operación de replicación: si los utiliza en una instrucción REPLICATE o
SYNCHRONIZE posterior, no necesita incrementarlos; se incrementan automáticamente antes de ser
devueltos por el comando REPLICATE.

Ejemplo

Para entender los mecanismos involucrados en la operación de sincronización, vamos a examinar las
diferentes posibilidades relativas a la actualización de un registro existente en las dos bases
sincronizadas.

El método de sincronización es de la siguiente forma:

C_LONGINT(vRemoteStamp)

C_LONGINT(vLocalStamp)

C_LONGINT(vLatestRemoteStamp)

C_LONGINT(vLatestLocalStamp)

vRemoteStamp:=X... // ver valores en el array a continuación

vLocalStamp:=X... // ver valores en el array a continuación

vLatestRemoteStamp:=X... // valor devuelto en un anterior LATEST REMOTE STAMP

vLatestLocalStamp:=X... // valor devuelto en un anterior LATEST LOCAL STAMP

Begin SQL

SYNCHRONIZE

LOCAL MYTABLE (MyField)

WITH

REMOTE MYTABLE (MyField)

FOR REMOTE STAMP :vRemoteStamp,

LOCAL STAMP :vLocalStamp

LOCAL OVER REMOTE // or REMOTE OVER LOCAL, ver en el array a continuación


LATEST REMOTE STAMP :vLatestRemoteStamp,

LATEST LOCAL STAMP :vLatestLocalStamp;

End SQL

Los datos iniciales son:

El marcador del registro en la base LOCAL tiene un valor de 30 y el de la base REMOTA tiene un valor de
4000

Los valores del campo MiCampo son los siguientes:

LOCAL REMOTE

Antiguo valor Nuevo valor Antiguo valor Nuevo valor

AAA BBB AAA CCC

Utilizamos los valores devueltos por las cláusulas anteriores LATEST LOCAL STAMP y LATEST REMOTE
STAMP para sincronizar únicamente los valores que fueron modificados desde la última sincronización.

Estas son las sincronizaciones efectuadas por el comando SYNCHRONIZE en función de los valores
pasados en los parámetros LOCAL STAMP y REMOTE STAMP como también la opción de prioridad
utilizada: ROL (para REMOTE OVER LOCAL) o LOR (para LOCAL OVER REMOTE):

LOCAL STAMP REMOTE STAMP Prioridad LOCAL después de sinc REMOTA después de
sinc Sincronización LOCAL - REMOTA

20 3000 ROL CCC CCC <---->

20 3000 LOR BBB BBB <---->

31 3000 ROL CCC CCC <--

31 3000 LOR CCC CCC <--

20 4001 ROL BBB BBB -->

20 4001 LOR BBB BBB -->

31 4001 ROL BBB CCC Sin sincronización

31 4001 LOR BBB CCC Sin sincronización


40 3000 ROL CCC CCC <--

40 3000 LOR CCC CCC <--

20 5000 ROL BBB BBB -->

20 5000 LOR BBB BBB -->

40 5000 ROL BBB CCC Sin sincronización

40 5000 LOR BBB CCC Sin sincronización

Lenguaje de Definición de Datos (DDL)

Es un lenguaje de programación para definir estructuras de datos, proporcionado por los sistemas
gestores de bases de datos, en este caso PostgreSQL. En inglés, Data Definition Language, de ahí sus
siglas DDL. Te recuerdo que si necesitas un amplio conocimiento en DDL deberías ver nuestro Curso de
Sentencias DDL, DML, DCL y TCL. Si estás empezando y quieres conocer Postgre, quizás te interese
nuestro Curso de introducción a PostgreSQL.

Empieza ahora y apúntate ya para aprender más sobre PostgreSQL.

¿Quieres ser un profesional trabajando como Administrador de Bases PostgreSQL? ¿Ampliar tus
conocimientos? Mira nuestro listado de Carreras para PostgreSQL.

Este lenguaje permite a los programadores de un sistema gestor de base de datos, como Postgres,
definir las estructuras que almacenarán los datos así como los procedimientos o funciones que permitan
consultarlos.

Para definir las estructura disponemos de tres sentencias:


CREATE, se usa para crear una base de datos, tabla, vistas, etc.

ALTER, se utiliza para modificar la estructura, por ejemplo añadir o borrar columnas de una tabla.

DROP, con esta sentencia, podemos eliminar los objetos de la estructura, por ejemplo un índice o una
secuencia.

Cursos y formación en Postgre

Lenguaje de Manipulación de Datos (DML)

También es un lenguaje proporcionado por los sistemas gestores de bases de datos. En inglés, Data
Manipulation Language (DML).

Utilizando instrucciones de SQL, permite a los usuarios introducir datos para posteriormente realizar
tareas de consultas o modificación de los datos que contienen las Bases de Datos.

Los elementos que se utilizan para manipular los datos, son los siguientes:

SELECT, esta sentencia se utiliza para realizar consultas sobre los datos.

INSERT, con esta instrucción podemos insertar los valores en una base de datos.

UPDATE, sirve para modificar los valores de uno o varios registros.

DELETE, se utiliza para eliminar las filas de una tabla.

Todos estos lenguajes forman parte del lenguaje SQL en general. Es decir, no son aplicables únicamente
a PostgreSQL sino a todos los gestores de bases de datos relacionales tales como Oracle SQL, MySQL o
SQL Server. Si quieres aprender más sobre ello, empieza ya y apúntate a nuestra academia de
PostgreSQL donde tienes todo el contenido en español.

Si quieres convertirte en DBA de PostgreSQL mira nuestros cursos de PostgreSQL: DBA & Developers

Lenguaje de Control de Datos (DCL)

Es un lenguaje que incluye una serie de comandos SQL. Como los anteriores, es proporcionado por los
sistemas gestores de bases de datos. Sus siglas son DCL por su nombre en inglés, Data Control Language.

Estos comandos permiten al Administrador del sistema gestor de base de datos, controlar el acceso a los
objetos, es decir, podemos otorgar o denegar permisos a uno o más roles para realizar determinadas
tareas.

Los comandos para controlar los permisos son los siguientes:

GRANT, permite otorgar permisos.

REVOKE, elimina los permisos que previamente se han concedido.

En nuestro curso de SQL Developer te explicamos personalmente estos comandos, su uso y algunos
trucos de cuando, cómo y por qué se deben de utilizar.

Sentencias prácticas

Cómo habéis visto en el video, las diferencias entre DDL, DML y DCL radican en los diferentes usos que
hacemos de cada lenguaje. Si quieres ampliar la información sobre una de las sentencias más utilizadas
en el mundo SQL, aquí tienes acceso a una entrada en la que vemos cómo podemos hacer uso de la
instrucción INSERT.
¡Muchísimas gracias, y hasta la próxima!

Empieza ahora apuntándote a nuestra academia online de PostgreSQL y no dejes escapar la oportunidad
en convertirte en un DBA de PostgreSQL gracias a todos los cursos que tienes dentro de tu suscripción.

Icono del sitioMtro. Fernando Arciniega

SENTENCIAS SQL (DDL, DML, DCL Y TCL)

Mtro. Fernando Omar Arciniega Martínez Mtro. Fernando Omar Arciniega Martínez

hace 7 años

SENTENCIAS SQL (DDL, DML, DCL Y TCL)

En el lenguaje de bases de datos, las sentencias DDL, DML, DCL y TCL son cuatro tipos diferentes de
comandos que se utilizan para realizar diferentes operaciones en una base de datos.

A continuación, explicaremos qué son cada uno de ellos y en qué se diferencian:

SQL se divide en 4 categorías para manipular los datos dentro de una Base de Datos, las cuales son:
Data Definition Language ( DDL ) – Lenguaje de Definición de Datos ( LDD )

ddl

Se utilizan para definir la estructura de base de datos o el esquema de la base.

Es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios de
la misma llevar a cabo las tareas de definición de las estructuras que almacenarán los datos así como de
los procedimientos o funciones que permitan consultarlos.

Un Data Definition Language o Lenguaje de definición de datos ( DDL ) es un lenguaje de programación


para definir estructuras de datos . Las sentencias que se utilizan son:

CREATE – PARA CREAR OBJETOS EN LA BASE DE DATOS

ALTER – ALTERA LA ESTRUCTURA DE LA BASE DE DATOS

DROP – ELIMINA LOS OBJETOS DE LA BASE DE DATOS

TRUNCATE – ELIMINAR TODOS LOS REGISTROS DE UNA TABLA , INCLUYENDO TODOS LOS ESPACIOS
ASIGNADOS A LOS REGISTROS SE ELIMINAN

COMMENT – AGREGAR COMENTARIOS AL DICCIONARIO DE DATOS

RENAME – CAMBIAR EL NOMBRE DE UN OBJETO

Data Manipulation Language ( DML ) Lenguaje de Manipulación de Datos ( LMD )


dml

Se utilizan para la gestión de datos dentro de los objetos del esquema de la base de datos.

Es un idioma proporcionado por los sistemas gestores de bases de datos que permite a los usuarios de la
misma llevar a cabo las tareas de consulta o modificación de los datos contenidos en las Bases de Datos
del Sistema Gestor de Bases de Datos. El lenguaje de manipulación de datos más popular hoy día es SQL,
usado para recuperar y manipular datos en una base de datos relacional.

SELECT – RECUPERAR DATOS DE LA BASE DE DATOS.

INSERT – INSERTAR DATOS EN UNA TABLA .

UPDATE – ACTUALIZACIONES DE DATOS EXISTENTES EN UNA TABLA.

DELETE – ELIMINA TODOS LOS REGISTROS DE UNA TABLA.

MERGE – OPERACIÓN UPSERT (INSERCIÓN O ACTUALIZACIÓN).

CALL – LLAMA A UN PL / SQL O SUBPROGRAMA JAVA.

EXPLAIN PLAN – EXPLICAR LA RUTA DE ACCESO A LOS DATOS.

LOCK TABLE – CONCURRENCIAS DE CONTROL.

Data Control Language ( DCL ) – Lenguaje de Control de Datos ( LCD )


Un Lenguaje de Control de Datos (DCL por sus siglas en inglés: Data Control Language) es un lenguaje
proporcionado por el Sistema de Gestión de Base de Datos que incluye una serie de comandos SQL que
permiten al administrador controlar el acceso a los datos contenidos en la Base de Datos.

Algunos ejemplos de comandos incluidos en el DCL son los siguientes:

GRANT: Permite dar permisos a uno o varios usuarios o roles para realizar tareas determinadas.

REVOKE: Permite eliminar permisos que previamente se han concedido con GRANT.

Las tareas sobre las que se pueden conceder o denegar permisos son las siguientes:

CONNECT

SELECT

INSERT

UPDATE

DELETE

USAGE

CONTROL DE TRANSACCIÓN (TCL)

Es un lenguaje de programación y un subconjunto de SQL , que se utiliza para controlar el


procesamiento de transacciones en una base de datos.

Una transacción es una unidad lógica de trabajo que comprende una o más sentencias SQL, por lo
general un grupo de Data Manipulation Language (DML).

Ejemplos de comandos de TCL incluyen:


COMMIT – GUARDA EL TRABAJO REALIZADO.

SAVEPOINT – IDENTIFICA UN PUNTO EN UNA TRANSACCIÓN A LA QUE MÁS TARDE SEVPUEDE VOLVER.

ROLLBACK – RESTAURAR LA BASE DE DATOS A LA ORIGINAL, HASTA EL ÚLTIMO COMMIT.

SET TRANSACTION – CAMBIA LAS OPCIONES DE TRANSACCIÓN COMO NIVEL DE AISLAMIENTO Y QUÉ
SEGMENTO DE CANCELACIÓN UTILIZA.

En conclusión, las sentencias DDL, DML, DCL y TCL son cuatro tipos diferentes de comandos que se
utilizan en el lenguaje de bases de datos para realizar diferentes operaciones en una base de datos. Es
importante tener en cuenta la función de cada uno de ellos y utilizarlos adecuadamente para garantizar
el correcto funcionamiento de la base de datos.

Referencias:

Oracle. (n.d.). SQL Language Reference. Recuperado el 1 de marzo de 2023, de


https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/index.html

Categorías: Bases de Datos, NET Tecamac

Deja un comentario

Mtro. Fernando Arciniega

Volver arriba

Salir de la versión móvil

También podría gustarte