DB V2: Cenários de uso
Saiba mais sobre cenários práticos de uso do conector DB V2, desde a definição de propriedades personalizadas de conexão até o tratamento de tipos de dados personalizados.
Atualizado
Isto foi útil?
Saiba mais sobre cenários práticos de uso do conector DB V2, desde a definição de propriedades personalizadas de conexão até o tratamento de tipos de dados personalizados.
Atualizado
Isto foi útil?
O é um conector que oferece suporte às operações SELECT
, INSERT
, DELETE
e UPDATE
, além da execução de procedures
, retornando os resultados em uma estrutura JSON. Para a lista completa de bancos de dados compatíveis, consulte a documentação de .
Este documento apresenta diversos cenários de uso do conector, como a definição de propriedades personalizadas de conexão e o tratamento de tipos de dados personalizados.
Confira abaixo os cenários de uso compatíveis:
QUERY
com uma instrução SELECT
Use o DB V2 para executar uma consulta SELECT
sempre que precisar recuperar dados de um banco de dados configurado.
Para isso, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, por exemplo: SELECT * FROM CLIENTES
.
Após a , a saída será:
{
"data": [
{
"uf": "SP",
"codigo": 1,
"cidade": "Osasco",
"logradouro": "Rua Laranjeiras",
"name": "João Bosco",
"due_date": "2019-03-27",
"email": "joao.bosco@digibee.com.br",
"cep": "XXXXX-XXX"
},
{
"uf": "SP",
"codigo": 2,
"cidade": "São Paulo",
"logradouro": "Rua João Bosco",
"name": "Roberto Carlos",
"due_date": "2019-03-27",
"email": "roberto.carlos@digibee.com.br",
"cep": "XXXXX-XXX"
}
],
"updateCount": 0,
"rowCount": 2
}
Entendendo a saída
A consulta retorna um objeto JSON com três propriedades principais:
data
: Um array de objetos que representam as linhas retornadas pela consulta. Cada objeto contém propriedades correspondentes às colunas do SELECT
. Por exemplo, se a consulta for SELECT name FROM CLIENTES
, cada objeto no array terá apenas a propriedade name
.
updateCount
: A quantidade de linhas afetadas pela consulta. Neste caso, o valor é 0
porque a operação SELECT
não altera a tabela.
rowCount
: A quantidade de linhas retornadas pela consulta.
QUERY
com uma instrução UPDATE
Use o DB V2 para atualizar registros no seu banco de dados executando uma instrução UPDATE
.
Para isso, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, por exemplo: UPDATE CLIENTES SET uf='SP' WHERE uf is null
.
Após a , a saída será:
{
"data": null,
"updateCount": 5,
"rowCount": 0
}
Entendendo a saída
updateCount
: Confirma que cinco linhas na tabela foram modificadas neste exemplo.
QUERY
com uma instrução DELETE
Use o DB V2 para remover dados do seu banco de dados com uma instrução DELETE
.
Para isso, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, por exemplo: DELETE FROM CLIENTES WHERE codigo='111111
.
Após a , a saída será:
{
"data": null,
"updateCount": 1,
"rowCount": 0
}
Entendendo a saída
updateCount
: Confirma que uma linha foi excluída da tabela neste exemplo.
QUERY
com uma instrução INSERT
Use o DB V2 para inserir novos registros no seu banco de dados com uma instrução INSERT
.
Para isso, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, por exemplo: INSERT INTO CLIENTES (name, email) VALUES ('My Name', 'myname@email.com')
.
Após a , a saída será:
{
"data": null,
"updateCount": 1,
"rowCount": 0
}
Entendendo a saída
updateCount
: Confirma que uma linha foi criada na tabela neste exemplo.
Se o seu banco de dados for incompatível com JDBC 4.0 ou tiver dificuldades para manter uma conexão estável, você pode usar o DB V2 para executar qualquer query — mesmo que a mesma chamada seja feita novamente após 20 minutos. Isso garante que a conexão com o banco de dados permaneça ativa.
Na aba Advanced Settings, é possível configurar a Connection Test Query. Essa consulta é executada antes da especificada no parâmetro SQL Statement, garantindo que a conexão com o banco de dados esteja ativa e prevenindo erros.
Se o teste de conexão falhar, uma nova conexão será aberta automaticamente. Isso ajuda a evitar problemas como conexões "travadas" e timeouts causados por falhas anteriores.
Essa opção deve ser considerada apenas para bancos de dados antigos que utilizam versões do JDBC anteriores à 4.0.
Para isso, conecte o DB V2 ao trigger e configure da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do seu banco de dados, como por exemplo jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, por exemplo INSERT INTO CLIENTES (name, email) VALUES ('My Name', 'myname@email.com')
.
Aba Advanced Settings:
Connection Test Query: Insira uma consulta para testar a conexão, como SELECT version()
.
Após a execução do pipeline, o resultado da consulta será exibido na coluna Saída do .
Use o DB V2 para manter a conexão com o banco de dados aberta por 5 ou 30 minutos, dependendo das suas necessidades.
Configure o conector da seguinte forma:
Aba Advanced Settings:
Keep Connection: Habilite essa opção para estender o tempo padrão de conexão de 5 minutos para 30 minutos, garantindo uma sessão ativa mais longa com o banco de dados.
Use o DB V2 para controlar a execução do pipeline, interrompendo-a quando ocorrer um erro durante uma operação no banco de dados.
Para controlar como os erros impactam a execução, configure o conector da seguinte forma:
Aba General:
Fail On Error: Habilite essa opção para parar o pipeline se ocorrer um erro ao invocar o DB V2. Se desabilitado, o pipeline continuará executando mesmo que a operação falhe.
Use o DB V2 para ler ou gravar arquivos em campos BLOB ou CLOB no seu banco de dados. Isso permite que você:
Grave arquivos do pipeline em colunas BLOB ou CLOB no banco de dados.
Leia dados BLOB ou CLOB do banco de dados como arquivos dentro do pipeline.
Ao habilitar a opção Blob As File ou Clob As File, você pode especificar um caminho de arquivo para essas operações:
Ao usar INSERT
, fornecer um caminho de arquivo do pipeline armazena o arquivo no banco de dados.
Ao usar SELECT
, o conteúdo BLOB ou CLOB recuperado é convertido em um arquivo dentro do pipeline.
Para ler o arquivo, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Step Name: Nomeie como “Ler Arquivo” ou algo similar.
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do seu banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Insira a instrução SQL, por exemplo SELECT blob FROM CLIENTES WHERE id=78
.
Blob As File / Clob As File: Habilite uma ou ambas as opções. Se Clob As File for habilitado, o parâmetro Charset aparecerá para definir a codificação do arquivo.
{
"data": [
{
"blob": "E4G17F.file",
"clob": "H2K89G.file"
}
],
"updateCount": 0,
"rowCount": 1
}
Dois arquivos, E4G17F.file
e H2K89G.file
, foram gerados e disponibilizados no pipeline.
Para gravar o arquivo, conecte outro DB V2 ao conector “Ler Arquivo” e configure-o da seguinte forma:
Aba General:
Step Name: Nomeie como “Gravar Arquivo” ou algo similar.
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Insira a URL do seu banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Insira a instrução SQL, por exemplo INSERT INTO CLIENTES (blob, clob) VALUES ( {{ message.data.blob }}, {{ message.data.clob }} )
.
Blob As File / Clob As File: Habilite uma ou ambas as opções. Se Clob As File for habilitado, o parâmetro Charset aparecerá para definir a codificação do arquivo.
Type Properties: Clique em Add e informe os seguintes dados:
Key: 0
(cada expressão com Double Braces tem um índice; 0
se refere à primeira)
Type: BLOB
Out Parameter Name: (deixe em branco)
Parameter Type: IN
{
"data": null,
"updateCount": 1,
"rowCount": 0
}
Entendendo a saída
O resultado indica que uma linha da tabela foi afetada. Primeiro, o conector Ler Arquivo recuperou o conteúdo BLOB e CLOB do banco de dados e gerou arquivos. Em seguida, o conector Gravar Arquivo usou esses arquivos do pipeline e os inseriu no banco de dados como um novo registro.
Use o DB V2 para chamar e executar uma procedure armazenada no seu banco de dados e recuperar o resultado.
Exemplo
Neste exemplo, o banco de dados contém a seguinte procedure:
CREATE PROCEDURE `proc_sum_one` (INOUT `num` INTEGER)
BEGIN
SET `num` = `num` + 1;
END;
Para executar esse procedimento no seu pipeline, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione PROCEDURE
.
Database URL: Informe a URL do seu banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, como call proc_sum_one({{ message.num }})
.
Type Properties: Clique em Add e informe os seguintes dados:
Key: 0
(cada expressão com Double Braces tem um índice; 0
se refere à primeira)
Type: INTEGER
Out Parameter Name: result
(define o nome do parâmetro de saída da procedure)
Parameter Type: INOUT
{
"num": 3
}
Após executar o pipeline, a saída será:
{
"data": {
"result": 4
},
"success": true
}
Use o DB V2 para definir propriedades personalizadas de conexão, personalizando como o conector interage com seu banco de dados.
Para isso, conecte o DB V2 ao trigger e configure-o da seguinte forma:
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do seu banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Informe a instrução SQL, como SELECT * FROM CLIENTES
.
Custom Connection Properties: Informe as propriedades personalizadas de conexão. Por exemplo: { "connectTimeout": 1 }
{
"success": false,
"message": "Could not establish connection to the database",
"error": "java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=xxxxx)(port=XXX)(type=master) : null"
}
Neste caso, a propriedade de conexão connectTimeout
foi definida como 1 (um segundo) para demonstrar que foi aplicada e resultou em um erro de conexão.
Use o DB V2 para ler tipos de dados personalizados de um banco de dados Oracle quando uma tabela configurada contém esse tipo de dado.
Exemplo:
Suponha que você tenha uma tabela criada com a seguinte estrutura:
CREATE TABLE project (
name VARCHAR2(50),
coordinator OWNER
);
E o tipo personalizado OWNER
seja definido como:
CREATE TYPE OWNER AS OBJECT (
name VARCHAR2(50),
email VARCHAR2(30)
);
Ao executar a seguinte consulta:
SELECT * FROM projeto
O resultado será:
{
"data": [
{
"name": "Example Project",
"owner": [
"Coordinator Name",
"Coordinator Email"
]
}
],
"updateCount": 0,
"rowCount": 1
}
Se o tipo personalizado incluir outros tipos personalizados em sua estrutura, os dados retornados serão aninhados, como mostrado no exemplo abaixo:
{
"data": [
{
"name": "Example Project",
"owner": [
"Coordinator Name",
"Coordinator Email",
[
"Campo de um segundo tipo personalizado",
[
"Campo de um terceiro tipo personalizado"
]
]
]
}
],
"updateCount": 0,
"rowCount": 1
}
Tipos personalizados não expõem os nomes dos campos definidos em sua estrutura; apenas a ordem desses campos é preservada.
No exemplo acima, o primeiro elemento do array "owner"
corresponde ao campo "name"
e o segundo ao campo "email"
, conforme definido no tipo OWNER
.
Ao trabalhar com tipos personalizados em consultas do tipo PROCEDURE
, é necessário definir o Out Parameter Name com o mesmo nome do tipo personalizado. Neste caso, seria OWNER
.
Use o conector DB V2 para inserir tipos de dados personalizados (structs) em uma tabela de um banco de dados Oracle.
Exemplo
Os seguintes tipos personalizados e tabela são criados no banco de dados:
Tipos personalizados:
CREATE OR REPLACE TYPE CONTACT AS OBJECT (
NAME VARCHAR2(50),
PHONE VARCHAR2(15)
);
CREATE OR REPLACE TYPE PERSON AS OBJECT (
ID NUMBER(10,0),
NAME VARCHAR2(50),
CONTACT_INFO CONTACT
);
CREATE OR REPLACE TYPE DEPARTMENT AS OBJECT (
ID NUMBER(10,0),
NAME VARCHAR2(50)
);
Tabela:
CREATE TABLE EMPLOYEE (
PERSON PERSON,
DEPT DEPARTMENT,
SALARY NUMBER(12,2)
);
Para inserir dados na tabela EMPLOYEE
, você pode usar as abordagens a seguir:
Exemplo de entrada:
{
"personName": "John A.",
"contactName": "John",
"contactPhone": "99999",
"departmentName": "IT"
}
Usando um comando INSERT
a partir de uma consulta SELECT
:
INSERT INTO EMPLOYEE
SELECT
PERSON(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ message.personName }},
CONTACT({{ message.contactName }}, {{ message.contactPhone }})
),
DEPARTMENT(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ UPPERCASE(message.departmentName) }}
),
3030.67
FROM DUAL;
Usando uma PROCEDURE
previamente criada:
CREATE OR REPLACE PROCEDURE MY_PROC(DEPT IN DEPARTMENT, EMP IN OUT PERSON) IS
SAL NUMBER(12,2);
BEGIN
SAL := 4567.89 * 1.10;
INSERT INTO EMPLOYEE VALUES (EMP, DEPT, SAL);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'An error was encountered - ' || SQLCODE || ' - ERROR: ' || SQLERRM);
END;
DECLARE
CONT CONTACT;
EMP PERSON;
DEPT DEPARTMENT;
BEGIN
DEPT := DEPARTMENT(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ UPPERCASE(message.departmentName) }}
);
CONT := CONTACT(
{{ message.contactName }},
{{ message.contactPhone }}
);
EMP := PERSON(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ message.personName }},
CONT
);
MY_PROC(DEPT, EMP);
END;
Usando um script SQL completo:
DECLARE
CONT CONTACT;
EMP PERSON;
DEPT DEPARTMENT;
SAL EMPLOYEE.SALARY%TYPE;
BEGIN
DEPT := DEPARTMENT(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ UPPERCASE(message.departmentName) }}
);
CONT := CONTACT(
{{ message.contactName }},
{{ message.contactPhone }}
);
EMP := PERSON(
TRUNC(DBMS_RANDOM.VALUE(0,999999)),
{{ message.personName }},
CONT
);
SAL := 4567.89;
INSERT INTO EMPLOYEE VALUES (EMP, DEPT, SAL);
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001, 'An error was encountered - ' || SQLCODE || ' - ERROR: ' || SQLERRM);
END;
Suponha que seu fluxo de integração precise executar duas consultas SQL diferentes, dependendo da lógica de negócio:
Consulta 1:
SELECT * FROM TABLE_1
WHERE ID = 123
Consulta 2:
SELECT * FROM TABLE_2
WHERE CODE = 'ABC'
Adicione um Template Transformer e um conector DB V2 ao seu pipeline.
Preserve Original: Ative esta opção.
Body: Defina o seguinte corpo:
SELECT * FROM
${table}
WHERE
<#if id?? >
ID = {{ message._query.id }}
</#if>
<#if code??>
CODE = {{ message._query.code }}
</#if>
Aba General:
Account Type: Selecione o tipo de conta configurado.
Account: Escolha a conta usada para autenticar no banco de dados.
Aba Operation:
Type: Selecione QUERY
.
Database URL: Informe a URL do seu banco de dados, como jdbc:mysql://myserver/mydb
.
SQL Statement: Defina como: {{ message.query }}
Aba Advanced Settings:
Raw SQL Statement: Ative essa opção.
Payload para a Consulta 1:
{
"query": {
"table": "TABLE_1",
"id": 123
}
}
Payload para a Consulta 2:
{
"query": {
"table": "TABLE_2",
"code": "ABC"
}
}
Os resultados esperados para cada consulta são:
Resultado para a Consulta 1:
{
"data": [
{
"id": 123,
"name": "John",
"role": "Developer",
...
}
],
"updateCount": 0,
"rowCount": 1
}
Resultado para a Consulta 2:
{
"data": [
{
"code": "ABC",
"fullName": "Paul Smith",
"zipCode": "99999",
...
}
],
"updateCount": 0,
"rowCount": 1
}
Entendendo a saída
O resultado da consulta é retornado como um JSON com três propriedades principais:
data
: Um array de objetos representando cada linha retornada. Cada objeto contém as colunas selecionadas pela consulta.
Exemplo: Se sua consulta for SELECT name FROM TABLE_1 WHERE ID = 123
, cada objeto no array data
conterá apenas a propriedade name
.
updateCount
: Número de linhas afetadas pelo comando SQL. Para operações SELECT
, este valor é sempre 0
, já que nenhuma tabela é alterada.
rowCount
: Número de linhas retornadas pela consulta.
Usa a tecnologia FreeMarker para validar os dados antes de executar a consulta.
Ajuda a evitar SQL Injection: a declaração com Double Braces não é resolvida pelo próprio Template Transformer, mas sim pelo DB V2, que configura e valida os parâmetros da consulta com antecedência usando Prepared Statements.
Fornece uma maneira mais segura e fácil de criar consultas no seu pipeline.
Após a , a saída será:
Este exemplo usa ({{ message.data.blob }}
, {{ message.data.clob }}
) para referenciar o resultado da consulta do conector anterior. Essas expressões recuperam os nomes dos arquivos gerados (E4G17F.file
, H2K89G.file
) e passam seus caminhos para o comando INSERT
nos campos blob
e clob
.
Após a , a saída será:
Neste exemplo, usamos a expressão com Double Braces {{ message.num }}
para acessar um valor do conector anterior. Para mais detalhes, .
Depois que o conector estiver configurado e salvo, abra o e insira um valor de entrada na coluna Payload, como:
Após , a saída será:
O conector DB V2 não oferece suporte às para resolver tipos personalizados (struct) ao usar comandos INSERT
ou UPDATE
.
O conector DB V2 oferece suporte ao recurso Raw SQL Statement, permitindo que você referencie dinamicamente uma consulta inteira usando . Isso significa que você pode definir a consulta completa em um conector anterior e passá-la como uma variável para o DB V2, adaptando-a em tempo de execução.
Para usar esse recurso, você deve configurar a consulta SQL em um conector como o e então referenciá-la no DB V2.
No , teste os seguintes payloads de entrada:
Embora outros conectores como ou também possam ser usados para definir a string de consulta, o Template Transformer oferece algumas vantagens importantes: