O gênio azul saindo da lâmpada dourada numa espiral de fumaça: a metáfora do Select AI, você pede em português e o SQL aparece

Todo mundo está falando de agente de IA, de MCP, de ligar um chat no banco. Eu mesmo testei isso há duas semanas (está aqui) e funcionou, mas precisava de um servidor no meio, de um cliente, de um monte de peça. Enquanto isso a Oracle fez diferente: botou a IA dentro do banco. No 26ai voce escreve SELECT AI e a pergunta em português, e o próprio Oracle monta o prompt, manda pro modelo, recebe o SQL, valida e executa. É o gênio da lâmpada: esfrega, pede, e o SQL aparece. A pergunta é o que ele entende, e o que ele faz quando não entende.

Isso se chama Select AI. Era exclusivo do Autonomous Database, e desde janeiro de 2026 roda no 26ai on-premises, o que mudou tudo: agora dá pra ter no banco da empresa, no servidor da empresa, sem Autonomous. Como exemplo usei um Protheus de desenvolvimento, porque é o ERP que mais vejo em cima de Oracle e porque o modelo de dados dele é o teste perfeito: nome de coluna de seis letras, data gravada como texto, exclusão lógica. Se a IA entende isso, entende qualquer banco.

Vou mostrar o que foi preciso pra instalar, os quatro erros que apareceram antes da primeira resposta (nenhum está na documentação do jeito que aparece), o que o banco manda pra fora, e onde a IA acertou e errou. Adianto o final: ela acerta o que está escrito em qualquer lugar da internet, e erra justamente o que só o seu financeiro sabe. E isso tem conserto, dentro do próprio banco.

O que é o Select AI, em duas linhas

É um pacote PL/SQL, o DBMS_CLOUD_AI, e uma palavra reservada nova. A sintaxe é SELECT AI ação pergunta. As ações que usei: showsql só mostra o SQL gerado, runsql gera e executa (é o padrão, dá pra omitir), narrate executa e pede pro modelo contar o resultado em texto, explainsql explica o SQL, e showprompt mostra o que o banco mandou pro modelo. Essa última foi a mais útil do teste.

Documentação da Oracle: a tabela das ações do SELECT AI, runsql executa o SQL, showsql só mostra, explainsql explica em linguagem natural e narrate manda o resultado da consulta pro modelo
As ações do SELECT AI na documentação do 26ai. Repare no narrate: ele manda o resultado da consulta pro modelo, as outras mandam só metadado.

A própria Oracle avisa, no mesmo manual, o que todo mundo que usa IA já sabe mas esquece na hora de confiar num número:

LLMs are subject to hallucinations and results are not always correct.

Oracle AI Database Select AI User’s Guide, Use AI Keyword to Enter Prompts, Usage Notes

Funciona fora do Autonomous?

Funciona, e isso é novo. Até o 23.7 o Select AI era coisa de Autonomous Database. A Oracle publicou uma matriz de capacidades (Select AI Capability Matrix, documento G50041) com uma coluna “Oracle AI Database 23.26.1”, que é o 26ai on-premises que saiu em janeiro de 2026. Nessa coluna, NL2SQL é Y, e a lista de provedores tem OpenAI, Anthropic, Google, Cohere, Azure, OCI Generative AI, Hugging Face, Amazon, provedores compatíveis com a API da OpenAI e “Private LLM”.

Tabela da Select AI Capability Matrix da Oracle: OCI GenAI, OpenAI, Azure OpenAI, Cohere, Google, Anthropic, Hugging Face, Amazon, provedores compatíveis com OpenAI e Private LLM, todos com Y na coluna Oracle AI Database 23.26.1
Select AI Capability Matrix: a coluna do meio é o 26ai on-premises. A coluna “23.7+” ao lado mostra o que não existia antes.

Só que a doc inteira do Select AI foi escrita pensando no Autonomous, onde o DBMS_CLOUD já vem instalado e a rede já está configurada. On-premises nada disso vem. Tem até uma pergunta no fórum da Oracle, de fevereiro, de alguém com o 26ai Enterprise instalado procurando o script de instalação. É exatamente o buraco que eu caí.

Pergunta no fórum da Oracle de 12 de fevereiro de 2026: usuário com Oracle AI Database 26ai Enterprise 23.26.1 on-premises não acha o catcloud.sql e pergunta como habilitar o Select AI
Fórum da Oracle, 12 de fevereiro de 2026. A pergunta ficou marcada como respondida em março, mas a resposta só aparece logado.

Instalando no 26ai Free (a imagem lite não serve)

Usei o 26ai Free em container, versão 23.26.3, numa máquina ARM. Primeira pegadinha: a imagem free:latest-lite, que é a que todo mundo usa porque tem 1,6 GB, vem com a pasta rdbms/admin praticamente vazia. Um arquivo. A imagem completa tem 2.445, e entre eles os três que interessam: catclouduser.sql, dbms_cloud_install.sql e dbms_cloud_ai.sql.

Terminal: na imagem lite do 26ai Free a pasta rdbms/admin tem um único arquivo; na imagem completa tem 2445, entre eles catclouduser.sql, dbms_cloud_install.sql e dbms_cloud_ai.sql
Em cima a imagem lite, embaixo a completa. O dbms_cloud_ai.sql é o Select AI.

A instalação em si são dois comandos com o catcon.pl, o primeiro cria o usuário C##CLOUD$SERVICE e o segundo instala os pacotes. É o mesmo procedimento do 23.7 em diante, não tem segredo:

$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \
  -u sys/senha --force_pdb_mode 'READ WRITE' \
  -b dbms_cloud_user -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql

$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \
  -u sys/senha --force_pdb_mode 'READ WRITE' \
  -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
Terminal: os dois comandos catcon.pl que instalam o DBMS_CLOUD no 26ai, catclouduser.sql e depois dbms_cloud_install.sql, os dois terminando com completed successfully e zero ORA- nos logs
Menos de um minuto os dois. Zero ORA- nos logs.
SQL*Plus como SYS: DBMS_CLOUD e DBMS_CLOUD_AI com PACKAGE, PACKAGE BODY e SYNONYM VALID, zero objetos inválidos no C##CLOUD$SERVICE e o banner Oracle AI Database 26ai Free 23.26.3
DBMS_CLOUD e DBMS_CLOUD_AI válidos, com sinônimo público, num Free. Não precisa de Enterprise pra testar.

Depois disso criei dois usuários: PROTHEUS, dono das tabelas, e FINANCEIRO, que é quem vai perguntar. O FINANCEIRO recebeu EXECUTE no DBMS_CLOUD_AI e no DBMS_CLOUD, CREATE CREDENTIAL, e por enquanto nenhum GRANT nas tabelas. De propósito, voce vai ver por quê.

Quatro erros antes da primeira resposta

Criei a credencial com a chave da Anthropic, o perfil apontando pro claude-sonnet-5-5, dei a ACL de rede pro FINANCEIRO como manda a doc, e fiz a primeira pergunta. Daí começou.

Erro 1. ORA-20000: Database property SSL_WALLET not found. O DBMS_CLOUD exige uma wallet SSL configurada como propriedade do banco, mesmo que ela esteja vazia. Criei uma com orapki, auto-login, e apontei a propriedade. Detalhe: o ALTER DATABASE PROPERTY só funciona no CDB$ROOT, na PDB dá ORA-65040. Também dei o privilégio de uso da wallet pro FINANCEIRO e pro C##CLOUD$SERVICE.

orapki wallet create -wallet /opt/oracle/wallet_ssl -pwd "senha" -auto_login

-- como SYS, no CDB$ROOT
ALTER DATABASE PROPERTY SET SSL_WALLET='/opt/oracle/wallet_ssl';

-- na PDB
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE(
    wallet_path => 'file:/opt/oracle/wallet_ssl',
    ace => xs$ace_type(privilege_list => xs$name_list('use_client_certificates','use_passwords'),
                       principal_name => 'C##CLOUD$SERVICE', principal_type => xs_acl.ptype_db));
END;
/

Erro 2. ORA-20401: Authorization failed for URI (e a URI da Anthropic no fim da mensagem). Esse me tomou mais de uma hora, porque a mensagem diz que a Anthropic recusou a chave, e a chave estava certa (testei com curl, respondeu 200). Botei um tcpdump na interface do container e descobri que o banco nem abria conexão. O erro era de ACL, mas disfarçado. A doc do Select AI manda dar a ACL de rede pro usuário que pergunta, e eu tinha dado. Mas o DBMS_CLOUD roda com direitos do dono, o C##CLOUD$SERVICE, que é um usuário comum (C##), e a ACL que ele checa é a do CDB$ROOT. Ou seja: on-premises, tem uma ACL a mais, no container raiz, pro dono do pacote. A doc não fala disso porque no Autonomous isso já vem feito.

-- como SYS, no CDB$ROOT (a da PDB sozinha nao resolve)
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => '*',
    ace  => xs$ace_type(privilege_list => xs$name_list('http','http_proxy','connect'),
                        principal_name => 'C##CLOUD$SERVICE', principal_type => xs_acl.ptype_db));
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => '*',
    ace  => xs$ace_type(privilege_list => xs$name_list('resolve'),
                        principal_name => 'C##CLOUD$SERVICE', principal_type => xs_acl.ptype_db));
END;
/

-- na PDB, pro usuario que pergunta (essa a doc fala)
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => 'api.anthropic.com',
    ace  => xs$ace_type(privilege_list => xs$name_list('http'),
                        principal_name => 'FINANCEIRO', principal_type => xs_acl.ptype_db));
END;
/

Erro 3. ORA-20011: Invalid object uri (SSL validation failed). Agora o banco chegou na Anthropic e não confiou no certificado. Aqui tem uma coisa curiosa do 26ai: o UTL_HTTP puro valida o certificado pelo cert store do sistema operacional, e funciona sem wallet nenhuma. Eu testei antes de tudo e recebi um 401 limpo, que é o TLS fechando e a API reclamando que não tinha chave. Mas o DBMS_CLOUD valida pela wallet. Então a wallet vazia do erro 1 precisa dos certificados da cadeia da api.anthropic.com, que hoje é GlobalSign Root CA, GTS Root R4 e WE1 (Google Trust Services). Peguei com openssl s_client e importei os três com orapki.

SQL*Plus: bloco PL/SQL com UTL_HTTP chamando https://api.anthropic.com de dentro do banco e recebendo HTTP 401 Unauthorized, prova de que o TLS fechou sem wallet
UTL_HTTP sem wallet: 401 é bom sinal, o TLS fechou. O DBMS_CLOUD não usa esse caminho.
echo | openssl s_client -connect api.anthropic.com:443 -servername api.anthropic.com -showcerts
# salvei os certificados da cadeia e a raiz (GlobalSign Root CA, do ca-bundle do SO)
orapki wallet add -wallet /opt/oracle/wallet_ssl -trusted_cert -cert root.pem   -pwd "senha"
orapki wallet add -wallet /opt/oracle/wallet_ssl -trusted_cert -cert chain1.pem -pwd "senha"
orapki wallet add -wallet /opt/oracle/wallet_ssl -trusted_cert -cert chain2.pem -pwd "senha"

Erro 4. ORA-20400: Request failed with status HTTP 400, e a Anthropic explicando: temperature is deprecated for this model. O DBMS_CLOUD_AI manda o parâmetro temperature em toda chamada, mesmo quando voce não configura nada no perfil, e os modelos Claude 5.5 não aceitam mais. Troquei o modelo pro claude-sonnet-4-5 e passou. Se a Oracle não mudar isso num RU, quem usar Claude vai ficar preso nos modelos 4.x.

SQL*Plus: perfil com claude-sonnet-5-5 devolve ORA-20400, HTTP 400, temperature is deprecated for this model, porque o DBMS_CLOUD_AI sempre manda temperature na chamada
Esse erro pelo menos traz o corpo da resposta. O ORA-20401 do erro 2 não trazia nada, porque não tinha resposta nenhuma.

E uma pegadinha que não é erro: o Select AI guarda a resposta da mesma pergunta no mesmo perfil. Repeti uma pergunta e ela voltou em 0,00 segundo, com o mesmo SQL, em outra sessão. Isso me atrapalhou depois do GRANT, porque a pergunta continuou devolvendo o erro antigo. Apagar e recriar o perfil zera.

O que sai do banco

Antes de perguntar qualquer coisa eu queria ver o pacote que o Oracle manda pra fora, porque é isso que o jurídico vai perguntar. Fiz um servidor HTTPS falso respondendo como api.anthropic.com, apontei o DNS do container pra ele e botei o certificado dele na wallet. O banco mandou isso:

Captura HTTPS do que o 26ai envia pra api.anthropic.com: x-api-key, anthropic-version 2023-06-01, user-agent DBMS_CLOUD PLSQL Client/1.0.0 e, no corpo, o prompt com a lista de tabelas vazia porque o usuário ainda não tinha GRANT
A chave vai no x-api-key, o user-agent é “DBMS_CLOUD PLSQL Client/1.0.0” e, curioso, vai junto uma assinatura no formato da AWS que a Anthropic ignora. Repare na lista de tabelas: vazia.

Vazia porque o FINANCEIRO ainda não tinha GRANT em tabela nenhuma. O Select AI só manda o metadado das tabelas que o usuário consegue ler. Isso é a melhor notícia do teste: a segurança continua sendo o GRANT, não é um filtro novo de IA. Depois do GRANT, a ação showprompt mostra o pacote completo:

SQL*Plus: SELECT AI showprompt mostra o que o banco manda pro modelo: um CREATE TABLE de cada tabela com nome e tipo das colunas, as instruções fixas da Oracle e a pergunta; nenhuma linha de dado
Um CREATE TABLE por tabela, só nome e tipo das colunas, as instruções fixas da Oracle e a pergunta. Nenhuma linha de dado, nenhum nome de cliente.

Então: nome de tabela, nome de coluna, tipo, e os comentários se voce ligar. Dado mesmo só sai no narrate, porque ele manda o resultado da consulta pro modelo pra ganhar um texto. Existe um DISABLE_DATA_ACCESS no pacote justamente pra desligar isso pra todo mundo. A doc de boas práticas é direta sobre o metadado:

Object names, column names, annotations, and comments may be sent to the AI provider. Avoid sensitive metadata content in the object list.

Oracle AI Database Select AI User’s Guide, Best Practices for SQL Generation with Select AI
POR ONDE A PERGUNTA PASSA Do português ao resultado, sem sair do Oracle 123 456 Pergunta em português SELECT AI monta o prompt Metadado, não dado Modelo devolve o SQL Oracle valida e executa Resultado “quanto tem vencido hoje?” quem pergunta é um usuário comum, com GRANT só de SELECT regras fixas da Oracle + lista de tabelas + a pergunta, tudo via DBMS_CLOUD_AI só tabelas que o usuário lê: nome, colunas, tipos e os COMMENT (se comments = true) HTTPS pro provedor, wallet com a cadeia de certificados, chave guardada na credencial o SQL roda com os privilégios de quem perguntou; DELETE morre com ORA-41900 linhas normais, ou texto no narrate (aí sim o resultado vai pro modelo) Fluxo observado no lab com showprompt e com um servidor HTTPS de captura. Nenhuma linha de dado sai no showsql e no runsql.

O lab: um Protheus de desenvolvimento

O banco do teste é um Protheus de desenvolvimento, pequeno, com dado de teste. Do lado do Oracle são as tabelas de sempre: SA1010, SA3010, SB1010, SB2010, SF2010, SD2010 e SE1010, com as colunas que todo mundo conhece (A1_COD, A1_LOJA, E1_VENCREA, E1_SALDO, F2_VALBRUT), as colunas de controle D_E_L_E_T_, R_E_C_N_O_ e R_E_C_D_E_L_, data gravada como texto AAAAMMDD, texto preenchido com espaço à direita. E o dicionário no banco, como fica desde a 12.1.2210: SX2010, SX3010 e SIX010 com X3_TITULO, X3_DESCRIC e as chaves. Nessa base tem 60 clientes, 420 notas, 940 títulos, 25 deles com D_E_L_E_T_ marcado, e alguns NCC e RA com saldo, que é a pegadinha clássica de quem soma contas a receber sem conhecer o sistema. Pra quem não é do Protheus: troque esses nomes pelos do seu ERP, o problema é o mesmo.

O perfil de IA é isso. O object_list diz quais tabelas entram no prompt, e comments diz se os COMMENT ON das tabelas vão junto. Criei dois perfis iguais, um com comments false e outro true, pra medir a diferença.

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(credential_name => 'ANTHROPIC_CRED',
                               username => 'ANTHROPIC', password => 'sk-ant-...');
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'PROTHEUS_CRU',
    attributes   => '{"provider": "anthropic",
                      "credential_name": "ANTHROPIC_CRED",
                      "model": "claude-sonnet-4-5",
                      "comments": "false",
                      "object_list": [{"owner": "PROTHEUS", "name": "SA1010"},
                                      {"owner": "PROTHEUS", "name": "SA3010"},
                                      {"owner": "PROTHEUS", "name": "SB1010"},
                                      {"owner": "PROTHEUS", "name": "SB2010"},
                                      {"owner": "PROTHEUS", "name": "SF2010"},
                                      {"owner": "PROTHEUS", "name": "SD2010"},
                                      {"owner": "PROTHEUS", "name": "SE1010"}]}');
END;
/
EXEC DBMS_CLOUD_AI.SET_PROFILE('PROTHEUS_CRU');

As quatro perguntas foram sempre as mesmas, do jeito que chegam: quantos clientes ativos a empresa tem, qual o total em reais de títulos a receber vencidos e ainda em aberto, quais os 5 clientes com maior valor vencido em aberto, e total faturado por vendedor em outubro de 2026. Antes de perguntar eu escrevi o SQL de cada uma na mão, pra ter gabarito.

Primeira rodada: sem GRANT, a IA inventa

SQL*Plus: perfil PROTHEUS_CRU criado e, sem GRANT nas tabelas, o SELECT AI showsql inventa as tabelas vendedores e SCHEMA.CLIENTES com uma coluna STATUS, e o Oracle devolve ORA-00942
Sem nenhuma tabela no prompt, o modelo chuta “vendedores” e “CLIENTES” com coluna STATUS. O Oracle tenta validar o SQL e devolve ORA-00942.

Era esperado, mas vale o print porque explica o comportamento: o Select AI não dá erro de permissão, ele manda o prompt com a lista vazia e o modelo inventa um schema genérico. Quem barra é o parse do SQL depois. Se o usuário tiver GRANT em metade das tabelas, o modelo vai responder com metade, e vai parecer certo.

Segunda rodada: com GRANT e sem comentário nenhum

SQL*Plus como PROTHEUS: GRANT SELECT nas sete tabelas SA1010, SA3010, SB1010, SB2010, SF2010, SD2010 e SE1010 para o usuário FINANCEIRO, e a lista de privilégios concedidos
Só SELECT, só nas sete. Nada de SX3, nada de SRA.
SQL*Plus: as quatro perguntas em português no perfil sem comentários; a IA já filtra D_E_L_E_T_ e trata E1_VENCREA como texto AAAAMMDD, mas soma NCC e RA no vencido e não filtra F2_TIPO no faturamento
Perfil cru: só nome de tabela, nome de coluna e tipo. Três a cinco segundos por pergunta.

Aqui eu me surpreendi. Sem nenhuma dica, o modelo filtrou D_E_L_E_T_ = ‘ ‘ em todas, comparou E1_VENCREA com TO_CHAR(SYSDATE, ‘YYYYMMDD’) em vez de tratar como data, fez o join de cliente por A1_COD e A1_LOJA, e pra “ativo” usou A1_MSBLQL diferente de ‘1’. Tudo isso é conhecimento de Protheus que ele já tinha, porque esses nomes de coluna estão em fórum, em TDN, em milhares de scripts públicos. Não precisou do meu dicionário pra isso. Se o seu sistema for caseiro, sem nada publicado, essa rodada vai sair bem pior.

Errou duas coisas, e as duas são de dinheiro. No vencido somou todo título com saldo, incluindo NCC e RA, que são crédito do cliente e abatem. No faturamento somou toda SF2, sem filtrar F2_TIPO, então uma devolução entraria como venda. Nenhum erro de sintaxe, os dois SQLs rodam e devolvem número. É o pior tipo de erro.

Terceira rodada: o SX3 vira COMMENT

A doc de boas práticas do Select AI diz pra enriquecer o metadado com comentários de tabela e coluna, e ligar comments no perfil. Quem tem Protheus já tem esse texto pronto: X3_TITULO e X3_DESCRIC. Então em vez de escrever 112 comentários na mão, escrevi um bloco PL/SQL que lê o SX2 e o SX3 e gera os COMMENT ON:

Documentação da Oracle, Enhance Metadata with Comments: comentários de tabela e coluna entram no metadado do Select AI e ajudam o modelo a interpretar os objetos e gerar SQL mais relevante
O manual sugere até uma view com nomes legíveis por cima da tabela de nomes feios. No Protheus o nome feio é o padrão, e o dicionário já explica cada um.
-- roda como dono das tabelas. Le o SX2 e o SX3 e grava COMMENT ON TABLE / COLUMN
SET SERVEROUTPUT ON
DECLARE
  n NUMBER := 0;
  PROCEDURE cm(p_obj VARCHAR2, p_txt VARCHAR2) IS
  BEGIN
    EXECUTE IMMEDIATE 'COMMENT ON '||p_obj||' IS '''||REPLACE(p_txt,'''','''''')||'''';
    n := n + 1;
  END;
BEGIN
  FOR t IN (SELECT x2_chave, x2_arquivo, x2_nome FROM sx2010 WHERE d_e_l_e_t_ = ' ') LOOP
    cm('TABLE '||t.x2_arquivo, t.x2_nome||' (alias '||t.x2_chave||' do Protheus). Registro valido so quando D_E_L_E_T_ = '' '' (espaco)');
    FOR c IN (SELECT x3_campo, x3_titulo, x3_descric, x3_tipo, x3_relacao
                FROM sx3010 WHERE x3_arquivo = t.x2_chave AND d_e_l_e_t_ = ' ' ORDER BY x3_ordem) LOOP
      cm('COLUMN '||t.x2_arquivo||'.'||c.x3_campo,
         TRIM(c.x3_titulo)||': '||TRIM(c.x3_descric)
         ||CASE c.x3_tipo WHEN 'D' THEN '. Data gravada como texto AAAAMMDD'
                           WHEN 'C' THEN '. Texto preenchido com espacos a direita'
                           ELSE '' END
         ||CASE WHEN TRIM(c.x3_relacao) IS NOT NULL THEN '. Relaciona com a tabela '||TRIM(c.x3_relacao)||'010' ELSE '' END);
    END LOOP;
    cm('COLUMN '||t.x2_arquivo||'.D_E_L_E_T_', q'[Marca de exclusao logica do Protheus: ' ' (espaco) = registro ativo, * = registro excluido. Sempre filtrar D_E_L_E_T_ = ' ']');
    cm('COLUMN '||t.x2_arquivo||'.R_E_C_N_O_', 'Numero sequencial interno do registro (chave fisica), sem significado de negocio');
    cm('COLUMN '||t.x2_arquivo||'.R_E_C_D_E_L_', 'Recno do registro no momento da exclusao, 0 quando ativo');
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(n||' comentarios gravados');
END;
/
SQL*Plus como PROTHEUS: bloco PL/SQL lê SX2010 e SX3010 e grava 112 COMMENT ON TABLE e COLUMN com o título e a descrição do dicionário, mais o aviso de data gravada como texto AAAAMMDD
112 comentários em 0,19 segundo. Num Protheus de verdade são dezenas de milhares, roda do mesmo jeito.

Num Protheus de produção voce ainda tem o SX5 (as tabelas genéricas, tipo os tipos de título na tabela 05) e o X3_CBOX com as opções dos combos, que dá pra concatenar no mesmo comentário. Eu parei no SX3 pra ficar simples. Criei o segundo perfil, PROTHEUS_SX3, igual ao primeiro mas com comments true, e repeti as quatro perguntas.

SQL*Plus: perfil PROTHEUS_SX3 com comments true; clientes ativos passa a usar A1_MSBLQL = 2 e o faturamento filtra F2_TIPO = N, mas o vencido ainda soma NCC e RA
Com o dicionário junto: “ativo” virou A1_MSBLQL = ‘2’ (que é o que o combo diz), e o faturamento ganhou F2_TIPO = ‘N’ porque a descrição do campo lista D=Devolucao.

Melhorou onde o dicionário explica. Ativo passou a ser exatamente o combo do campo, e o faturamento filtrou tipo N sozinho. Mas o vencido continuou somando NCC e RA. E faz sentido: o SX3 diz que NCC é “Nota de Credito Cliente”, não diz que isso abate do contas a receber. Isso não está no dicionário de ninguém, está na cabeça do financeiro.

Quarta rodada: a regra que não está no dicionário

Então escrevi dois comentários na mão, por cima dos gerados. Um no E1_TIPO dizendo quais tipos são abatimento, outro no F2_TIPO dizendo que faturamento é só N. É o tipo de coisa que o DBA senta com o financeiro meia hora e escreve.

SQL*Plus como PROTHEUS: COMMENT escrito à mão em E1_TIPO dizendo que NCC, RA e PA são abatimentos e nunca entram como vencido, e em F2_TIPO dizendo que só N é faturamento
Dois COMMENT ON COLUMN escritos em português, com a regra e até o jeito de aplicar (NOT IN, e o RA com espaço no fim).
SQL*Plus: depois do comentário de regra de negócio o SQL gerado traz E1_TIPO NOT IN NCC, RA, PA no total vencido e F2_TIPO = N no faturamento por vendedor
Recriei o perfil (por causa do cache) e perguntei de novo. Agora tem o NOT IN (‘NCC’, ‘RA ‘, ‘PA ‘) e o F2_TIPO = ‘N’. E ele trocou F2_VALBRUT por F2_VALMERC, e explica o porquê no explainsql mais abaixo.
AS MESMAS QUATRO PERGUNTAS O que mudou a cada degrau de metadado 1 · SEM GRANT 2 · SÓ O SCHEMA 3 · SX3 VIRA COMMENT 4 · REGRA DO FINANCEIRO lista de tabelas vazia inventa “CLIENTES” com coluna STATUS ORA-00942 no parse acerta D_E_L_E_T_ acerta data AAAAMMDD acerta join cod + loja soma NCC e RA no vencido devolução entra como venda “ativo” = A1_MSBLQL ‘2’ faturamento só F2_TIPO N datas e espaços certos vencido ainda soma NCC NOT IN (‘NCC’,’RA ‘,’PA ‘) F2_TIPO = ‘N’ 267.640,61 de vencido os 5 devedores certos não roda roda, número errado roda, vencido errado bate com o gabarito Mesmo modelo (claude-sonnet-4-5), mesmas perguntas, mesmo usuário. Só o metadado mudou.

Rodando de verdade: runsql, narrate e explainsql

Com o perfil final, tirei o showsql e deixei executar. O total vencido deu 267.640,61, que é o mesmo número do meu SQL escrito na mão. Os cinco maiores devedores também bateram, na mesma ordem.

SQL*Plus: SELECT AI sem ação executa e devolve 267.640,61 de vencido e os cinco maiores devedores; narrate responde em português com a lista; explainsql explica o SQL do faturamento linha por linha
runsql devolve linhas como qualquer SELECT. narrate devolve um texto em português, com R$ e tudo (esse mandou o resultado pro modelo). explainsql explica o SQL e justifica o F2_VALMERC.
SQL*Plus: as mesmas consultas escritas à mão por quem conhece Protheus: 53 clientes ativos, 267.640,61 de vencido, os cinco maiores devedores e o faturamento por vendedor de outubro
O gabarito, escrito antes de perguntar. 53 clientes ativos, 267.640,61 vencido, os mesmos cinco nomes.

Uma coisa que voce vê nos dois prints: o SQL que a IA gerou está cheio de aspas duplas e aliases, e usa TO_DATE em cima de E1_VENCREA numa das versões. Funciona, mas o TO_DATE na coluna mata o índice da SIX se a tabela for grande. É o mesmo problema de qualquer SQL gerado, por gente ou por máquina: alguem precisa olhar o plano antes de botar isso num relatório que roda toda hora. O Select AI gera, não otimiza.

E se pedir pra apagar?

Pedi: “apague todos os títulos vencidos do cliente 000012”. O modelo obedeceu e escreveu um DELETE bonito, até com o NOT IN dos abatimentos que ele aprendeu no comentário. O Oracle barrou antes de executar, com ORA-41900, porque o FINANCEIRO não tem DELETE. A palavra AI só aceita SELECT por definição, e mesmo assim quem segurou foi o privilégio.

SQL*Plus: o pedido apague todos os títulos vencidos do cliente 000012 vira um DELETE e o Oracle barra com ORA-41900 missing DELETE privilege; abaixo, o showprompt com os comentários do SX3 em cada coluna
O DELETE gerado e o ORA-41900. Embaixo, o showprompt do perfil com comentários: cada coluna vai com o texto do SX3 colado nela.

Repare no showprompt desse perfil, embaixo: agora cada coluna vai com o comentário ao lado. É mais texto por chamada, portanto mais token e mais custo. Com sete tabelas e 112 comentários ficou em uns 6 mil caracteres por pergunta. Num ERP inteiro, com o dicionário todo, não cabe, e nem faz sentido. A doc tem um object_list_mode automated que escolhe as tabelas relevantes por busca vetorial, mas o jeito mais simples é o que eu fiz: um perfil por assunto, com as dez ou quinze tabelas daquele assunto.

Quando chamar um especialista

Se voce tem Oracle e quer deixar o financeiro, o comercial ou a diretoria perguntar em português sem abrir o banco inteiro pra IA, esse lab é o roteiro: instalar o DBMS_CLOUD, acertar wallet e ACL (inclusive a do CDB$ROOT que a doc não fala), gerar os comentários a partir do dicionário do sistema, escrever as regras de negócio com quem conhece, e deixar o usuário de pergunta só com SELECT em views. A gente faz isso dentro do suporte de banco de dados Oracle, e se o seu ERP for Protheus, junto com a sustentação de Protheus. Se quiser começar vendo como está o seu banco hoje, o health check é gratuito, e se quiser só conversar sobre o seu caso, fala com a gente.

Capa: o gênio azul saindo da lâmpada, ilustração gerada com IA pra este post. Os prints de documentação são das páginas públicas da Oracle, reproduzidos para citação, com link na lista abaixo. Os prints de terminal são de um Oracle AI Database 26ai Free 23.26.3 de laboratório, em container, com um Protheus de desenvolvimento e dados de teste. O modelo usado foi o claude-sonnet-4-5 da Anthropic. A chave de API foi revogada depois do teste.

Referências

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *