4D inclui um motor SQL integrado. O programa também inclui um servidor SQL que pode ser consultado por outras aplicações 4D ou de terceiras partes (através do piloto OBDC de 4D).
A documentação SQL de 4D está composta de duas partes:
- A Guia de referencia SQL de 4D Manual de SQL). Este manual descreve os diferentes modos de acesso ao motor SQL de 4D, a configuração do servidor SQL como também os comandos e palavras chaves utilizáveis nas petições SQL (por exemplo SELECT ou UPDATE). Consulte este manual para maior informação sobre a utilização da linguagem SQL em 4D.
- O tema SQL do manual "Linguagem" de 4D (SQL). Este tema agrupa os diferentes comandos internos de 4D relacionados ao uso de SQL em 4D:
- Controle do servidor SQL: START SQL SERVER e STOP SQL SERVER
- Acesso direto ao motor SQL integrado: SET FIELD VALUE NULL, Is field value Null, QUERY BY SQL.
- Gestão das conexões a fontes de dados externas ou internas (SQL pass-through): GET DATA SOURCE LIST, Get current data source, SQL LOGIN, SQL LOGOUT.
- Comandos de alto nível para manipulação de dados no marco de conexões SQL diretas ou através ODBC: Begin SQL, End SQL, SQL CANCEL LOAD, SQL LOAD RECORD, SQL EXECUTE, SQL End selection, SQL SET OPTION, SQL SET PARAMETER, SQL GET LAST ERROR, SQL GET OPTION.
Os comandos SQL integrados de 4D começam com o prefixo "SQL" e implementam os seguintes princípios:
- A menos que seja indicado o contrário, pode utilizar estes comandos com o motor SQL interno 4D ou em uma conexão externa que é aberta diretamente ou através ODBC. O comando SQL LOGIN permite definir o tipo de conexão a abrir.
- O alcance de uma conexão é o processo. Se deseja administrar simultaneamente várias conexões, deve iniciar um processo por SQL LOGIN.
- Pode interceptar os erros ODBC gerados durante a execução de uno dos comandos SQL de alto nível utilizando o comando ON ERR CALL. O comando SQL GET LAST ERROR pode ser utilizado neste caso para obter informação adicional.
O padrão ODBC (Open DataBanco Connectivity) define uma biblioteca de funções padronizadas. Estas funções permitem a uma aplicação como 4D acessar através da linguagem SQL a todos os Sistemas de gestão de dados compatíveis com ODBC (bancos de dados, folhas de cálculo, outras aplicações 4D, etc.).
Nota: 4D também permite importar e exportar dados em uma fonte ODBC através dos comandos IMPORT ODBC e EXPORT ODBC ou manualmente em modo Desenho. Para maior informação, consulte o Manual de Desenho 4D.
Nota: os comandos SQL de alto nível de 4D permitem implementar solucões simples para a comunicação entre as aplicações 4D e as fontes de dados ODBC. Se seus aplicações necessitam um apoio mais extenso do padrão ODBC, necessitará o plug-in ODBC “baixo nível” de 4D, 4D ODBC Pro.
A tabela a seguir lista as correspondências estabelecidas automaticamente por 4D entre os tipos de dados 4D e SQL:
4D Tipo | SQL Tipo |
C_STRING | SQL_C_CHAR |
C_TEXT | SQL_C_CHAR |
C_REAL | SQL_C_DOUBLE |
C_DATE | SQL_C_TYPE_DATE |
C_TIME | SQL_C_TYPE_TIME |
C_BOOLEAN | SQL_C_BIT |
C_INTEGER | SQL_C_SHORT |
C_LONGINT | SQL_C_SLONG |
C_BLOB | SQL_C_BINARY |
C_PICTURE | SQL_C_BINARY |
C_GRAPH | SQL_C_BINARY |
4D oferece duas maneiras de inserir expressões 4D (variáveis, arrays, campos, expressões válidas) nas solicitações SQL: a associação direta e a definição de parâmetros utilizando SQL SET PARAMETER.
A associação direta pode ser realizada de duas formas:
* Inserindo o nome do objeto 4D entre os caracteres << e >> no texto da solicitação.
* Antecedendo a referência com dois pontos":".
SQL EXECUTE("INSERT INTO emp (empnum,enome) VALUES (<<vempnum>>,<<vemome>>)")
&NBSP;SQL EXECUTE("SELECT idade FROM Pessoa WHERE nome= :vNome")</vemome></vempnum>
Nota: em modo compilado, não pode utilizar referências a variáveis locais (que começam por $).
Nesses exemplos, os valores atuais das variáveis 4D vEmpnum, vEnome e Vnome substituirão os parâmetros quando o pedido seja executado. Esta solução também funciona com campos e arrays 4D.
Esta sintaxe de fácil utilização, apresenta o inconveniente de não cumprir o padrão SQL e de não permitir a utilização de parâmetros de saída. Para remediar isto, pode utilizar o comando
SQL SET PARAMETER. Este comando permite definir cada objeto 4D a ser integrado em uma solicitação assim como também seu modo de utilização (entrada, saída ou ambos). A Sintaxe produzida é padrão. Para maior informação, consulte a descrição do comando
SQL SET PARAMETER1. Este exemplo executa uma pesquisa SQL que utiliza diretamente os arrays 4D associados:
ARRAY TEXT(MeuArrayText;10)
ARRAY LONGINT(MeuArrayInteiroLongo;10)
For(vContador;1;Size of array(MeuArrayText))
MeuArrayText{vContador}:="Text"+String(vContador)
MeuArrayInteiroLongo{vContador}:=vContador
End for
SQL LOGIN("meusql";"root";"")
SQLStmt:="insert into app_testTable (campo_alfa, campo_inteirolongo) VALUES (<<miarraytext>>, <<miarrayinteirolongo>>)"
SQL EXECUTE(SQLStmt)</miarrayinteirolongo></miarraytext>
2. Este exemplo permite executar um pedido SQL utilizando diretamente os campos 4D associados:
ALL RECORDS([Tabela 2])
&NBSP;SQL LOGIN("mysql";"root";"")
&NBSP;SQLStmt:="insert into app_testTable (campo_alfa, campo_inteirolongo) VALUES (<<[Tabela 2]Campo1>"+">,<<[Tabela2]Campo2>>)"
&NBSP;SQL EXECUTE(SQLStmt)
3. Este exemplo permite executar uma pesquisa SQL passando diretamente uma variável através de um ponteiro Sem referência:
C_LONGINT($vLong)
C_POINTER($vPonteiro)
$vLong:=1$vPonteiro:=->$vLong
SQL LOGIN("meusql";"root";"")
SQLStmt:="SELECT Col1 FROM TEST WHERE Col1=:$vPonteiro"
SQL EXECUTE(SQLStmt)
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:
O seguinte código irá falhar em modo compilado:
A recuperação dos valores na linguagem 4D que resulta das consultas SQL é realizada de duas formas:
- Utilizando os parâmetros adicionais do comando SQL EXECUTE (solução recomendada).
- Utilizando a cláusula INTO dentro da própria pesquisa SQL (solução reservada para casos especiais).
É possível por diretamente o resultado de uma petição SQL em um list box de tipo array. Esta função oferece um meio rápido de visualizar o resultado de petições SQL. Só podem ser utilizadas as petições de tipo SELECT. Este mecanismo não pode ser utilizado com uma base SQL externa.
Isso funciona de acordo com os seguintes princípios:
- Crie o list box que receberá os resultados da petição. A fonte de dados do lsit box deve ser Arrays.
- Execute a petição SQL de tipo SELECT e atribua o resultado à variável associada ao list box. É possível utilizar as palavras chaves Begin SQL/End SQL (ver o manual de Linguagem 4D).
- Quando o conteúdo de um list box provém de uma petição SQL, as colunas não podem ser ordenadas ou modificadas pelo usuário.
- Cada nova execução de uma petição SELECT com o list box a reiniciação das colunas (não é possível preencher o mesmo list box progressivamente utilizando várias petições SELECT).
- Recomenda-se dar ao list box o mesmo número de colunas que as que terá no resultado de petição SQL. Se o número de colunas do list box é inferior ao necessário para a petição SELECT, as colunas são adicionadas automaticamente. Se o número de colunas do list box é superior ao necessário para a petição SELECT,as colunas desnecessárias são ocultas.
Nota: As colunas adicionadas automaticamente estão relacionadas com as Variáveis Dinâmicas de tipo array. Esses arrays temporários permanecem enquanto o formulário existir. Uma variável temporária é criada do mesmo modo para cada título. Quando se chama o comando GET LISTBOX ARRAYS, o parâmetro arrVarCols contém ponteiros (apontadores) aos arrays temporários e o parâmetro arrVarTitulos contém os ponteiros às variáveis de títulos temporários. Se uma coluna adicionada é, por exemplo, a quinta coluna, seu nome é sql_column5 e seu título é sql_header5.
- Em modo interpretado, os arrays existentes utilizados pelo list box podem ser redigitados automaticamente de acordo com os dados enviados pela petição SQL.
ExemploQueremos recuperar todos os campos da tabela PESSOAS e localizar seu conteúdo no list box cujo nome de variável é vlistbox. No método de objeto de um botão (por exemplo), é suficiente escrever:
Begin SQL
SELECT * FROM PEOPLE INTO <<vlistbox>>
End SQL