4D v16

Importação baseada nos procedimentos armazenados (exemplo)

Página Inicial

 
4D v16
Importação baseada nos procedimentos armazenados (exemplo)

Importação baseada nos procedimentos armazenados (exemplo)  


 

 

O seguinte exemplo mostra como a importação de dados pode ser acelerada drasticamente em um entorno cliente/servidor. O método Regular Import permite medir quanto tempo toma importar os registros utilizando o comando IMPORT TEXT

  ` Método de projeto Import clássico
 $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

Com a importação de dados clássica, 4D analisa o arquivo de texto, depois para cada registro, cria um novo registro, enche os campos com os valores importados e envia o registro à máquina servidor para ser adicionado a base. Por conseguinte circulam numerosas petições pela rede. Uma maneira de otimizar a operação é utilizar um procedimento armazenado para realizar a importação localmente na máquina servidor. A máquina cliente carrega o documento em um BLOB, depois inicia um procedimento armazenado que passa o BLOB como parâmetro. O procedimento armazenado guarda o BLOB em um documento no disco, depois importa o documento localmente. Portanto, a importação dos dados se realiza localmente (a uma velocidade comparada com a de uma versão local de 4D) porque a maioria das petições que transitam por la rede são eliminadas.

Este é o método de projeto CLIENT IMPORT. Executado na máquina cliente, produz a execução do procedimento armazenado SERVER IMPORT que é mostrado a continuação:

  ` Método de projeto CLIENT IMPORT
  ` CLIENT IMPORT ( Ponteiro ; Texto)
  ` CLIENT IMPORT ( -> [Tabela] ; Formulário de entrada )
 
 C_POINTER($1)
 C_TEXT($2)
 C_TIME($vhDocRef)
 C_BLOB($vxDatos)
 C_LONGINT(spErrCode)
 
  ` Selecione o documento a importar
 $vhDocRef:=Open document("")
 If(OK=1)
  ` Foi selecionado um documento, não o conserve aberto
    CLOSE DOCUMENT($vhDocRef)
    $vhStartTime:=Current time
  ` Trate de carregar em memória
    DOCUMENT TO BLOB(Document;$vxDatos)
    If(OK=1)
  ` Se o documento pode ser carregado no BLOB,
  ` Inicie o procedimento armazenado que importará os dados na máquina servidor
       $spProcessoID:=Execute on server("SERVER IMPORT";32*1024;
       "Servidor Import Services";Table($1);$2;$vxDados)
  ` Neste ponto, já não necessitamos o BLOB neste processo
       CLEAR VARIABLE($vxDatos)
  ` Espere a que termine a operação realizada pelo procedimento armazenado
       Repeat
          DELAY PROCESS(Current process;300)
          GET PROCESS VARIABLE($spProcessosID;spErrCode;spErrCode)
          If(Undefined(spErrCode))
  ` Nota: se o procedimento armazenado não iniciou sua própria instância
  ` da variável spErrCode, pode ser que devolva uma variável indefinida
             spErrCode:=1
          End if
       Until(spErrCode<=0)
  ` Enviamos um aviso de recibo ao procedimento armazenado
       spErrCode:=1
       SET PROCESS VARIABLE($spProcessosID;spErrCode;spErrCode)
       $vhEndTime:=Current time
       ALERT("Tomó "+String(0+($vhEndTime-$vhStartTime))+" segundos.")
    Else
       ALERT("Não há suficiente memória para carregar o documento.")
    End if
 End if

Este é o método de projeto SERVER IMPORT executado como um procedimento armazenado:

  ` Método de projeto SERVER IMPORT
  ` SERVER IMPORT ( Inteiro longo ; Texto; BLOB )
  ` SERVER IMPORT ( Número de Tabela ; Formulário de entrada ; Dados importados )
 
 C_LONGINT($1)
 C_TEXT($2)
 C_BLOB($3)
 C_LONGINT(spErrCode)
 
  ` A operação não terminou, assinale 1 a spErrCode
 spErrCode:=1
 $vpTabla:=Table($1)
 INPUT FORM($vpTabela->;$2)
 $vsDocName:="Arquivo Import "+String(1+Random)
 If(On Windows)
    $vsDocName:=$vsDocName+".txt" ` Em Windows, a extensão é obrigatória
 End if
 DELETE DOCUMENT($vsDocName)
 BLOB TO DOCUMENT($vsDocName;$3)
 IMPORT TEXT($vpTable->;$vsDocName)
 DELETE DOCUMENT($vsDocName)
  ` A operação terminou, assinale 0 a spErrCode
 spErrCode:=0
  ` Espere a que a máquina cliente que originou a petição tenha recebido o resultado
 Repeat
    DELAY PROCESS(Current process;1)
 Until(spErrCode>0)

Nota: O método de projeto On Windows é listado na seção Documentos de Sistema do manual de Linguagem de 4D.

Uma vez que estes dois métodos tenham sido implementados em uma base, pode realizar uma importação baseada em um procedimento armazenado, escrevendo por exemplo:

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

É realizada algumas provas comparativas, você vai descobrir que utilizando este método se pode importar registros até 60 vezes mais rápido que com uma importação regular.



Ver também 

Procedimentos armazenados
Serviços baseados nos procedimentos armazenados (exemplo)

 
PROPRIEDADES 

Produto: 4D
Tema: 4D Server e a linguagem 4D

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de 4D Server ( 4D v16)