4D v16

Acessar ao motor SQL de 4D

Página Inicial

 
4D v16
Acessar ao motor SQL de 4D

Acessar ao motor SQL de 4D  


 

O motor SQL integrado de 4D pode ser chamado de três formas diferentes:

  • Via o comando QUERY BY SQL. Passe a cláusula WHERE de um comando SQL SELECT como um parâmetro pesquisa. Exemplo:
 QUERY BY SQL([OFFICES];"SALES > 100")
  • Via os comandos SQL integrados de 4D, localizados no tema "SQL" (SQL SET PARAMETER, SQL EXECUTE, etc.). Estes comandos podem trabalhar com uma fonte de dados ODBC ou o motor SQL de 4D do banco de dados atual.
  • Via o editor de métodos padrão de 4D. As instruções SQL podem ser escritas diretamente no editor de métodos padrão de 4D. Simplesmente deve inserir a consulta SQL entre as etiquetas: Begin SQL e End SQL. O código entre estas etiquetas não será analisado pelo intérprete de 4D e será executado pelo motor SQL (ou por outro motor, é definido pelo comando SQL LOGIN).

É possível fazer referencia a todo tipo de expressão 4D válida (variável, campo, array, expressão ...) dentro das cláusulas WHERE e INTO das expressões SQL. Para indicar uma referencia 4D, pode utilizar qualquer das seguintes notações:

  • Colocar a referencia entre símbolos duplos menor que e maior que como é visto aqui “<<” e “>>”
  • Colocar dois pontos ":" na frente da referencia.

Exemplos:

 C_STRING(80;vNome)
 vNome:=Request("Nome:")
 SQL EXECUTE("SELECT age FROM PEOPLE WHERE nome=<<vNome>>")

ou:

 C_STRING(80;vNome)
 vNome:=Request("Nome:")
 Begin SQL
    SELECT age FROM PEOPLE WHERE name= :vNome
 End SQL

Notas:

  • O uso de colchetes [] é necessário quando trabalha com variáveis interprocessos (por exemplo, <<[<>mivar]>> ou: [<>mivar]).

Em modo compilado, pode utilizar referencias de variáveis locais (começando pelo caractere $) em instruções SQL sob certas condições:

  • Pode utilizar variáveis locais dentro de uma sequência Begin SQL / End SQL, exceto com o comando EXECUTE IMMEDIATE;
  • Pode utilizar variáveis locais com o comando SQL EXECUTE quando estas variáveis se utilizam diretamente no parâmetro de petição SQL e não via as referencias.
    Por exemplo, o seguinte código funciona em modo compilado:
     SQL EXECUTE("select * from t1 into :$myvar") // funciona em modo compilado

    O seguinte código irá falhar em modo compilado:
     C_TEXT(tRequest)
     tRequest:="select * from t1 into :$myvar"
     SQL EXECUTE(tRequest// erro em modo compilado

A recuperação de dados em uma instrução SELECT será gerenciada dentro das etiquetas Begin SQL/End SQL sob a cláusula INTO do comando SELECT ou sob os comandos 4D do tema "SQL".

  • No caso das etiquetas Begin SQL/End SQL, pode utilizar a cláusula INTO da consulta SQL e fazer referencia a qualquer expressão válida 4D (campo, variável, array) para obter o valor:
 Begin SQL
    SELECT ename FROM emp INTO <<[Employees]Name>>
 End SQL

  • Com o comando SQL EXECUTE, também pode utilizar os parâmetros adicionais:
 SQL EXECUTE("SELECT ename FROM emp";[Empregados]Nome)

A principal diferença entre estas duas maneiras de obter os dados de SQL (etiquetas Begin SQL/End SQL e comandos SQL) é que no primeiro caso toda a informação é enviada novamente a 4D em um só passo, enquanto no segundo caso, os registros deverão ser carregados de forma explícita utilizando o comando SQL LOAD RECORD.

Por exemplo, supondo que na tabela PESSOAS há 100 registros:

  • Usando os comandos SQL genéricos de 4D:
 ARRAY INTEGER(anoNascimento;0)
 C_STRING(40;vNome)
 vNome:="Smith"
 $SQLStm:="SELECT Birth_Year FROM PEOPLE WHERE ename= <<vNome>>"
 SQL EXECUTE($SQLStm;anoNascimento)
 While(Not(SQL End selection))
    SQL LOAD RECORD(10)
 End while

Aqui temos que realizar 10 laços para recuperar os 100 registros. Se deseja carregar todos os registros em um só passo devemos utilizar:

 ARRAY INTEGER(anoNascimento;0)
 C_STRING(40;vNome)
 vNome:="Smith"
 Begin SQL
    SELECT Birth_Year FROM PEOPLE WHERE ename= <<vName>> INTO <<anoNascimento>>
 End SQL

Nesta situação, depois da execução da instrução SELECT, o array anoNascimento contém 100 elementos e cada elemento armazena um ano de nascimento de todos os 100 registros.
Se no lugar de um array, queremos armazenar os dados recuperados em uma coluna (um campo 4D), então 4D criará automaticamente tantos registros como seja necessário para salvar todos os dados. Em nosso exemplo anterior, supondo que na tabela PESSOAS há 100 registros:

  • Usando os comandos SQL genéricos de 4D:
 C_STRING(40;vNome)
 vNome:="Smith"
 $SQLStm:="SELECT Birth_Year FROM PEOPLE WHERE ename= <<vNome>>”
 SQL EXECUTE($SQLStm;[MINHATABELA]Ano_Nascimento)
 While(Not(SQL End selection))
    SQL LOAD RECORD(10)
 End while

Aqui temos que realizar 10 laços para recuperar todos os 100 registros. Cada passada pelo laço cria 10 registros na tabela [MINHATABELA] e cada valor Ano_Nascimento recuperado da tabela PESSOAS será salvado no campo Ano_Nascimento.

 C_STRING(40;vNome)
 vNome:="Smith"
 Begin SQL
    SELECT Birth_Year FROM PEOPLE WHERE ename= <<vNome>> INTO <<[MINHATABELA]Ano_Nascimento>>
 End SQL


Neste caso, durante a execução da instrução SELECT, serão criados 100 registros na tabela [MINHATABELA] e cada campo Ano_Nascimento conterá os dados correspondentes da tabela PESSOAS, coluna Birth_Year..

4D inclui um funcionamento automático específico (palavra chave LISTBOX) que permite colocar os dados das consultas SELECT em um list box. Para maior informação, consulte o Manual de Desenho.

Por razões de otimização, é preferível utilizar expressões 4D em lugar de funções SQL nas consultas. As expressões 4D serão calculadas uma vez antes da execução da consulta enquanto as funções SQL serão avaliadas para cada registro encontrado.

Por exemplo, com a seguinte instrução:

 SQL EXECUTE("SELECT nomeCompleto FROM PEOPLE WHERE nomeCompleto=<<vSobrenome+vNome>>")

... a expressão vSobrenome+vNome é calculada uma vez, antes da execução da consulta. Com a seguinte instrução:

 SQL EXECUTE("SELECT nomeCompleto FROM PEOPLE WHERE nomeCompleto=CONCAT(<<vSobrenome>>,<<vNome>>)")

... a função CONCAT(<<vSobrenome>>,<<vNome>>) é chamada para cada registro da tabela, ou seja, a expressão é avaliada para cada registro.



Ver também 

ref_linguagem_4d

 
PROPRIEDADES 

Produto: 4D
Tema: Utilizar SQL em 4D

 
HISTÓRIA 

 
ARTICLE USAGE

Manual de SQL ( 4D v16)