4D v16

Importación con procedimientos almacenados (ejemplo)

Inicio

 
4D v16
Importación con procedimientos almacenados (ejemplo)

Importación con procedimientos almacenados (ejemplo)  


 

 

El siguiente ejemplo muestra cómo la importación de datos puede acelerarse dramáticamente en entorno cliente/servidor. El método Regular Import permite medir cuanto tiempo toma importar los registros utilizando el comando IMPORT TEXT:

  ` Método de proyecto Import clásico
 $vhDocRef:=Open document("")
 If(OK=1)
    CLOSE DOCUMENT($vhDocRef)
    INPUT FORM([Tabla1];"Import")
    $vhStartTime:=Current time
    IMPORT TEXT([Tabla1];Document)
    $vhEndTime:=Current time
    ALERT("La operación toma "+String(0+($vhEndTime-$vhStartTime))+" segundos.")
 End if

Con la importación de datos clásica, 4D analiza el archivo de texto, luego para cada registro, crea un nuevo registro, llena los campos con los valores importados y envía el registro al equipo servidor para ser añadido a la base. Por consiguiente circulan numerosas peticiones por la red. Una manera de optimizar la operación es utilizar un procedimiento almacenado para efectuar la importación localmente en el equipo servidor. El equipo cliente carga el documento en un BLOB, luego inicia un procedimiento almacenado que pasa el BLOB como parámetro. El procedimiento almacenado guarda el BLOB en un documento en el disco, luego importa el documento localmente. Por lo tanto, la importación de los datos se realiza localmente (a una velocidad comparable con la de una versión local de 4D) porque se eliminan la mayoría de las peticiones que transitan por la red.

Este es el método de proyecto CLIENT IMPORT. Ejecutado en el equipo cliente, produce la ejecución del procedimiento almacenado SERVER IMPORT que se muestra a continuación:

  ` Método de proyecto CLIENT IMPORT
  ` CLIENT IMPORT ( Puntero ; Texto)
  ` CLIENT IMPORT ( -> [Tabla] ; Formulario de entrada )
 
 C_POINTER($1)
 C_TEXT($2)
 C_TIME($vhDocRef)
 C_BLOB($vxDatos)
 C_LONGINT(spErrCode)
 
  ` Seleccione el documento a importar
 $vhDocRef:=Open document("")
 If(OK=1)
  ` Si se seleccionó un documento, no lo conserve abierto
    CLOSE DOCUMENT($vhDocRef)
    $vhStartTime:=Current time
  ` Trate de cargarlo en memoria
    DOCUMENT TO BLOB(Document;$vxDatos)
    If(OK=1)
  ` Si el documento puede cargarse en el BLOB,
  ` Inicie el procedimiento almacenado que importará los datos en el equipo servidor
       $spProcesoID:=Execute on server("SERVER IMPORT";32*1024;
       "Servidor Import Services";Table($1);$2;$vxDatos)
  ` En este punto, ya no necesitamos el BLOB en este proceso
       CLEAR VARIABLE($vxDatos)
  ` Espere a que termine la operación realizada por el procedimiento almacenado
       Repeat
          DELAY PROCESS(Current process;300)
          GET PROCESS VARIABLE($spProcesosID;spErrCode;spErrCode)
          If(Undefined(spErrCode))
  ` Nota: si el procedimiento almacenado no ha inicializado su propia instancia
  ` de la variable spErrCode, puede que se devuelva una variable indefinida
             spErrCode:=1
          End if
       Until(spErrCode<=0)
  ` Envíamos un acuse de recibo al procedimiento almacenado
       spErrCode:=1
       SET PROCESS VARIABLE($spProcesosID;spErrCode;spErrCode)
       $vhEndTime:=Current time
       ALERT("Tomó "+String(0+($vhEndTime-$vhStartTime))+" segundos.")
    Else
       ALERT("No hay suficiente memoría para cargar el documento.")
    End if
 End if

Este es el método de proyecto SERVER IMPORT ejecutado como un procedimiento almacenado:

  ` Método de proyecto SERVER IMPORT
  ` SERVER IMPORT ( Entero largo ; Texto; BLOB )
  ` SERVER IMPORT ( Número de Tabla ; Formulario de entrada ; Datos importados )
 
 C_LONGINT($1)
 C_TEXT($2)
 C_BLOB($3)
 C_LONGINT(spErrCode)
 
  ` La operación no ha terminado, asigne 1 a spErrCode
 spErrCode:=1
 $vpTabla:=Table($1)
 INPUT FORM($vpTabla->;$2)
 $vsDocName:="Archivo Import "+String(1+Random)
 If(On Windows)
    $vsDocName:=$vsDocName+".txt" ` En Windows, la extensión es obligatoria
 End if
 DELETE DOCUMENT($vsDocName)
 BLOB TO DOCUMENT($vsDocName;$3)
 IMPORT TEXT($vpTable->;$vsDocName)
 DELETE DOCUMENT($vsDocName)
  ` La operación terminó, asigne 0 a spErrCode
 spErrCode:=0
  ` Espere a que el equipo cliente que originó la petición haya recibido el resultado
 Repeat
    DELAY PROCESS(Current process;1)
 Until(spErrCode>0)

Nota: el método de proyecto On Windows se lista en la sección del manual Lenguaje de 4D.

Una vez que estos dos métodos se hayan implementado en una base, puede efectuar una importación basada en un procedimiento almacenado, escribiendo por ejemplo:

 CLIENT IMPORT(->[Tabla1];"Import")

Si realiza algunas pruebas comparativas, descubrirá que utilizando este método puede importar registros hasta 60 veces más rápido que con una importación regular.



Ver también 

Procedimientos almacenados
Servicios basados en los procedimientos almacenados (ejemplo)

 
PROPIEDADES 

Producto: 4D
Tema: 4D Server y el lenguaje 4D

 
HISTORIA 

 
ARTICLE USAGE

Manual de 4D Server ( 4D v16)