Olá! Meu nome é Óscar, e vamos falar sobre o projeto de pipeline de dados na AWS.
Audiodescrição: Sou um homem de pele clara, visto uma camiseta preta. Ao fundo do vídeo há uma guitarra e algumas decorações, como mangás e figuras de ação. Uso óculos de armação quadrada, tenho barba e cabelo curto.
Tenho mais de 12 anos de atuação no mercado, trabalhando com projetos de dados. Já atuei como DBA, trabalhei como gerente de dados e, atualmente, sou arquiteto de soluções em nuvem. No dia a dia, meu trabalho é resolver problemas de negócio utilizando a AWS e serviços de dados. Tenho a certificação de especialista em Analytics da AWS e atuo em diversos setores empresariais, em diversas vertentes comerciais, como manufatura e finanças, realizando consultoria e entregando valor por meio de dados.
Meu objetivo aqui com você é apresentar um projeto de dados baseado no dia a dia real, no papel de pessoa engenheira de dados, para que você tenha uma experiência trabalhando junto comigo, como se eu fosse uma pessoa colega de trabalho ao seu lado.
Agora, vamos apresentar o que você vai aprender neste projeto e como vamos proporcionar uma experiência real. Ao considerar o contexto de uma pessoa engenheira de dados, precisamos entender o negócio. Precisamos vincular nosso dia a dia de entregas técnicas a valor de negócio.
Um dos temas que vamos abordar aqui é como identificar problemas de negócio nas demandas apresentadas pela pessoa cliente ou colega de trabalho, para compreendermos quais são os problemas de dados e como aplicar a tecnologia que conhecemos para resolvê-los. Também vamos entender uma arquitetura técnica. Analisaremos o desenho de uma arquitetura técnica que será o nosso projeto e vamos ajudar a identificar, do início ao fim, quais são os serviços, para que servem, os componentes e a estrutura da arquitetura e, obviamente, como implementar tudo isso.
Em seguida, partiremos para a execução — mãos à obra. Nesta etapa, vamos fazer com que tudo aconteça de fato, entendendo como realizar o deploy (implantação) do serviço, como utilizá-lo, quanto custa, como funciona e, principalmente, quais são os pontos de atenção, além de alguns conselhos rápidos para proporcionar uma experiência real.
Eu dou as boas-vindas ao projeto e tenho absoluta certeza de que você vai gostar muito de trabalhar comigo aqui. A ideia é que você sinta como se fôssemos colegas de trabalho, com orientação desde o primeiro dia e, ao longo do projeto, possamos realizar uma entrega alinhada aos programas de negócios da empresa fictícia que vamos apresentar.
No próximo vídeo, conheceremos esses programas de negócios, os pontos que tentaremos resolver e faremos uma breve revisão de conceitos fundamentais para aplicar este projeto na vida real. Venha conosco na próxima aula. [♪]
Olá.
Agora vamos falar sobre o contexto de negócio. Como mencionamos, no dia a dia de quem trabalha com engenharia, um dos aspectos mais importantes é conectarmo-nos ao negócio e entender o problema que precisamos resolver. Ao final, isso sempre está vinculado a algo que queremos melhorar na empresa ou a algum indicador ausente.
Neste cenário, temos uma empresa chamada Lumarte, uma empresa fictícia, que utiliza um ERP (planejamento de recursos empresariais) genérico implementado às pressas, o que costuma trazer diversos problemas. Enfrentamos problemas de nomenclatura de tabelas, colunas abreviadas que não são intuitivas, dados armazenados com tipos incorretos, entre outros. A pessoa CTO (diretoria de tecnologia) da Lumarte nos contratou para resolver esses problemas. A Lumarte é uma empresa de e-commerce (comércio eletrônico) com diversos canais de entrada. Aqui trabalharemos com um banco de dados PostgreSQL para leitura desses dados.
Em conversas com a pessoa CTO e com as equipes de negócio, identificamos cinco pontos como as principais dores, nos quais devemos focar ao resolver o problema:
Considerando o contexto de negócio, estes são os problemas que devemos buscar resolver. Como vamos resolver? Como responsáveis pela arquitetura do time, vamos explicar como endereçaremos o problema no time de engenharia de dados.
Depois de completar todo o pipeline (fluxo de processamento) de dados desde a origem até que se convertam em dados analíticos, nós o orquestraremos usando AWS Step Functions, monitoraremos com ferramentas nativas da AWS, como Amazon CloudWatch, e consumiremos esses dados posteriormente, seja por meio de uma ferramenta de visualização, seja por uma consulta ad hoc (pontual), por exemplo, usando uma IDE (ambiente de desenvolvimento integrado) SQL.
Ao observar a arquitetura, temos um diagrama cujo entendimento é fundamental, sobretudo para identificar os pontos principais dentro de uma arquitetura. No contexto, vemos primeiro um quadro grande chamado AWS Cloud. No canto superior esquerdo do diagrama há um retângulo maior chamado AWS Cloud. Isso indica que tudo o que está dentro desse retângulo pertence a uma conta da AWS.
Mais ao centro, o segundo retângulo mais amplo representa a região onde essa arquitetura será provisionada. Poderíamos adotar uma estratégia multirregião, mas não é o caso aqui; estamos usando uma única região, Ohio, o que indica que todos os serviços estão nessa região.
Em seguida, há outra estrutura que agrupa vários serviços da AWS, chamada AWS Step Functions Workflow. Esse processo é o de orquestração. É o serviço que utilizaremos para orquestrar cada função Lambda que compõe o processo, possibilitando executar e disponibilizar automaticamente quando necessário, além de lidar com erros e acompanhar tudo de forma organizada.
O primeiro serviço da arquitetura, o bloco chamado Amazon RDS, é nossa base de dados de origem. Estamos simulando onde o processo se encontra hoje. As tabelas de origem estarão nessa base, que nós provisionaremos para que, posteriormente, possamos realizar a extração na etapa de ingestão.
O segundo componente é o AWS Lambda Extractor. Utilizaremos AWS Lambda, serviço de execução de código sem servidor da AWS, no qual podemos inserir um script (roteiro) em Python, por exemplo, para executar algum processo programático. No nosso caso, usaremos Lambda para extrair os dados do e-commerce (comércio eletrônico) e armazená-los no Amazon S3, no nosso Data Lake (lago de dados), em formato Parquet (formato de arquivo colunar).
Depois, teremos outra função Lambda responsável pela camada Silver. Ela consumirá os dados deixados no Amazon S3, na camada Bronze, aplicará transformações, governança e um processo de qualidade, e entregará na Silver, que é nossa camada de qualidade no ambiente.
Em seguida, criaremos outra função Lambda, chamada Lambda Gold, que consumirá os dados da Silver e os transformará para o modelo OLAP (processamento analítico on-line), isto é, fatos e dimensões, oferecendo um modelo fácil de ser consumido pela pessoa usuária de negócio ou pela ferramenta de visualização.
Por fim, teremos o AWS Athena, ferramenta da AWS que lerá esses dados do nosso Data Lake (lago de dados) e permitirá consultas em SQL.
Ao redor de todo esse ecossistema, teremos as ferramentas de governança e observabilidade, que envolverão o ambiente para possibilitar acompanhamento, logging (registro de logs) e notificação de falhas por e-mail (correio eletrônico) por meio do Amazon SNS. Nós veremos isso passo a passo conforme formos implementando.
A proposta é entendermos como o dado nasce e como é consumido ao final.
É muito importante prestar atenção aos custos da AWS, pois este projeto pode gerar despesas que precisam ser controladas para evitar problemas ao receber a fatura e a geração de cobranças indesejadas. Como referência, o custo pode variar entre 8 e 15 dólares, a depender de como está a conta, mas é sempre essencial monitorar. Tudo o que utilizarmos durante o projeto deve ser desativado após os testes. Devemos iniciar a base de dados para uso e desligá-la em seguida, a fim de não gerar consumo desnecessário. Não devemos deixar nada executando automaticamente para evitar custos, e, ao final do projeto, é recomendável excluir todos os serviços provisionados para não incorrer em cobranças por itens que não serão mais utilizados.
Falaremos bastante sobre isso ao longo do curso. Sempre que houver algum ponto de atenção relativo a custos, nós avisaremos para que seja possível executar o projeto com tranquilidade e sem problemas de gastos.
Alguns serviços na AWS podem estar disponíveis com o nível gratuito de 12 meses, o free tier (nível gratuito), mas isso depende de nunca ter tido uma conta na AWS ou de nunca a ter utilizado anteriormente. É importante que, ao provisionar recursos, verifiquemos se a AWS indica a possibilidade de uso do free tier (nível gratuito).
Na próxima aula, nós falaremos sobre o setup (preparação) do ambiente da base de dados RDS e veremos a primeira execução prática no ambiente. Acompanhe a próxima aula para provisionarmos o ambiente e iniciarmos nosso projeto.
Vamos preparar a parte prática. Usaremos o ambiente da AWS para executar a primeira etapa do nosso projeto diretamente na console. A primeira ação necessária para conseguirmos executar o projeto é levantar uma base de dados RDS para simular o ambiente de e-commerce (comércio eletrônico) da empresa Alumart.
Retomando: Alumart é um e-commerce (comércio eletrônico) que temos como cliente. Possui alguns canais de venda, utiliza um sistema próprio e esse sistema armazena os dados em uma base de dados PostgreSQL. Nossa arquitetura no ambiente de engenharia de dados começa com o consumo do dado para o Data Lake (repositório de dados).
No dia a dia, não vamos provisionar uma base RDS para uma aplicação. Isso é parte do trabalho da equipe de pessoas desenvolvedoras que cuidam do sistema do ambiente. Porém, aqui, para conseguirmos realizar o projeto, precisamos levantar essa base de dados da empresa que estamos usando como referência e como estudo de caso. Para trazer esses dados, vamos provisionar um RDS, serviço da AWS que permite criar uma base de dados PostgreSQL. Usaremos a região de Ohio, Estados Unidos, que é onde os cursos foram simulados.
Ao acessar a console, vemos a distribuição dos serviços usados com frequência. No menu superior direito, visualizamos nosso usuário, o ID da conta AWS e a região. Para alterar a região para Ohio, clicamos no nome da região atual (por exemplo, Norte da Virgínia), abrimos o menu e selecionamos Ohio na lista de regiões AWS no mundo. A região é onde provisionamos o ambiente do datacenter que será usado pelos serviços da AWS. Ao clicar em Ohio, a página recarrega. Curiosidade: na Virgínia costumam aparecer primeiro os lançamentos de novos serviços da AWS; em seguida, chegam a Ohio. Além disso, essas regiões tendem a ser mais baratas do que a região de São Paulo. Após selecionar Ohio, a console é atualizada conforme a região escolhida. É importante verificar se estamos em Ohio para evitar custos maiores.
Em seguida, pesquisamos pelo serviço RDS na barra de busca. Digitamos RDS e clicamos no primeiro resultado, com o símbolo azul, Amazon Aurora and Amazon RDS. O serviço Amazon RDS será carregado.
Ao carregar o Amazon RDS, vemos no menu lateral esquerdo opções como painel, bancos de dados e editor de consultas; no centro, há um resumo do que já está provisionado no ambiente. No nosso caso, e provavelmente no seu também, estará vazio, pois ainda não temos nenhuma base provisionada. Para provisionar a primeira base, podemos clicar em Instância de banco de dados no centro da tela ou, no menu lateral esquerdo, em Bancos de dados. Em ambos os casos, chegamos à lista de bancos de dados instanciados na AWS.
Vamos criar nossa primeira base clicando no botão Criar banco de dados (laranja). Serão exibidas várias opções de configuração. Em Método de criação, podemos escolher Fácil ou Completo; seguiremos com Completo inicialmente.
Na escolha do mecanismo de banco de dados, selecionamos PostgreSQL, pois o e-commerce (comércio eletrônico) da Alumart utiliza PostgreSQL. A versão pode ser mantida como a mais recente disponível; aqui, usaremos 17.6-R2. Deixe desmarcada a opção Mostrar apenas versões compatíveis. Deixe desabilitada a opção RDS Extended Support.
Em Modelos de uso, temos Produção, Desenvolvimento e Nível Gratuito. Neste cenário, clicamos em Nível Gratuito. Lembrando: o Nível Gratuito funciona por 12 meses a partir do primeiro uso. Se já tiver passado esse período para sua conta, a opção Nível Gratuito não estará disponível; nesse caso, selecione Desenvolvimento e Teste, o que limita as configurações ao mínimo possível (instância menor e pouco armazenamento). Há uma seção de Informações que explica o Nível Gratuito, caso queira consultar.
Na seção Disponibilidade e durabilidade, definimos o tipo de provisionamento: uma zona, duas zonas, multi-AZ. Isso determina se haverá réplica disponível em caso de incidente. Neste cenário, deixamos instância em única zona (single-AZ). No Nível Gratuito, a opção multi-AZ não está disponível, então single-AZ atende bem por se tratar de base de teste.
Em Identificador da instância de banco de dados (nome da instância), escolhemos um identificador para a instância — não é o nome do esquema do banco; é o nome do serviço que vamos provisionar. O nome do banco de dados será definido depois. Vamos usar Alura-pipeline-alu-mart para facilitar a identificação do propósito dessa instância no ambiente.
No nome do usuário principal, deixamos postgres, que é o usuário com maior nível de permissões no ambiente. Em gerenciamento de credenciais, mantemos autogerenciado. Definimos a senha como Alura com A maiúscula, seguida de #12, e confirmamos a mesma senha. No método de autenticação, deixamos autenticação por senha.
Em Configuração da instância, mantemos o padrão. Como estamos no Nível Gratuito, há apenas uma classe de instância disponível: db.t4g.micro, com 2 vCPUs e 1 GB de RAM, adequada para testes.
No armazenamento, mantemos SSD de uso geral (gp2). No tamanho de armazenamento, deixamos 20 GB, suficiente para nosso exemplo com RDS da Alumart.
Em Conectividade, mantemos a opção padrão de não conectar a um recurso de computação do EC2. Na VPC, deixamos a padrão. No grupo de sub-redes, também deixamos o padrão. Em Acesso público, selecionamos Não. No grupo de segurança (security group) da VPC, selecionamos o existente padrão. Em Zona de disponibilidade, deixamos Sem preferência. Mantemos desabilitado o RDS Proxy. Em Autoridade de certificação, deixamos o padrão.
Em Marcas (tags), configuramos uma tag (etiqueta) de identificação — prática importante ao desenvolver um recurso na AWS. Isso ajuda quem não conhece o que foi provisionado a entender do que se trata o serviço e permite uso posterior em monitoramento de custos. Por exemplo, podemos criar a tag (etiqueta) com chave Projeto e valor Pipeline AWS, o que facilita verificar quanto está custando esse projeto.
Em Monitoramento, mantemos o Performance Insights desabilitado para evitar custo adicional. Mantemos Enhanced Monitoring desabilitado. Em logs (registros), deixamos desabilitados os três tipos de exportação. A função (role) do IAM permanece a padrão/fixa. Deixamos o DevOps Guru desabilitado.
Na parte inferior, a console mostra uma estimativa de custo. Se não estivermos usando o Nível Gratuito, será exibido o custo estimado de manter a base ligada 24 horas por dia, todos os dias do mês. No nosso caso, está dentro do Nível Gratuito e não teremos custo.
Clicamos no botão laranja Criar banco de dados. A AWS iniciará o provisionamento da base. Aguardamos alguns minutos e a base ficará disponível.
Com a base criada, agora temos um RDS disponível para trabalhar. Vamos revisar: o identificador ficou Alura-pipeline-alu-mart; o status está como disponível; o mecanismo é PostgreSQL; a região é Ohio; e a classe é db.t4g.micro. Isso significa que já temos uma base PostgreSQL para conectar e carregar os dados.
Teremos agora um script (roteiro de código) SQL disponível junto com os materiais do curso. São dois scripts (roteiros de código) principais:
Lembrando que essa base é a base do sistema ERP, não faz parte da arquitetura de dados em si. Ela é a fonte de dados que estamos levantando para viabilizar a execução do projeto.
No primeiro script (roteiro de código), há as tabelas que, mais adiante, vamos avaliar para entender seus contextos e o que podemos analisar em seus dados. O material contém comentários para revisão autônoma e para compreensão da estrutura da base, incluindo notas com problemas simulados, como uma linha com e-mail nulo e outra com CPF nulo. Todos os dados são fictícios: não há nomes, e-mails ou CPFs reais; são dados gerados por uma inteligência artificial.
Para inserir esses dados, precisamos nos conectar ao banco usando alguma IDE (ambiente de desenvolvimento integrado). Dentro da console, no painel lateral esquerdo, há um editor de consultas, mas para RDS PostgreSQL não há suporte nativo. Portanto, não podemos usar esse editor interno da AWS; precisamos utilizar um externo. Pode ser algo dentro de uma EC2 ou outro contexto. No nosso caso, vamos usar o DBeaver, que é uma ferramenta para executar scripts SQL, utilizada para realizar INSERT, SELECT e DELETE em um banco de dados.
Para nos conectarmos, abrimos a console da AWS e clicamos no nome do banco de dados que criamos: Alura Pipeline Alumart. No centro da tela, há um link com esse nome; ao clicar, abriremos os detalhes. Fechamos a mensagem de sucesso (a barra verde) para deixar a visualização mais limpa. Veremos os detalhes do banco. Descendo um pouco a janela, aparecem várias abas no centro: Segurança, Conexão, Monitoramento, Logs e Eventos. Em Segurança e Conexão, há a opção de como conectar. A AWS oferece três maneiras:
Neste cenário, usaremos o endpoint (ponto de acesso). Depois de clicar em Endpoint, role a tela. Veremos o nome de usuário, a porta e o tipo. Mantemos o tipo Endpoint de instância. Abaixo, teremos a URL necessária para conectar e a porta. Clique no Endpoint. No ícone de cópia (um pequeno quadrado), ao clicar, o Endpoint será copiado para a área de transferência do nosso equipamento. Também podemos selecionar e pressionar Ctrl+C; funciona da mesma forma. Será exibida a mensagem Endpoint copiado.
Abrimos o DBeaver. Ao abrir, temos as opções de conexão. No menu superior esquerdo, clique no ícone com um sinal de mais, para Nova Conexão. Nessa nova conexão, aparecem os tipos de conectores possíveis. Observe no menu lateral esquerdo que temos: Todos, Popular, SQL, NoSQL, Analítica, entre outros; o DBeaver é compatível com muitos mecanismos do mercado. Pesquisamos por “Postgre” na caixa de busca. Aparecerá PostgreSQL; damos clique duplo nele, e as configurações serão exibidas.
Veremos o método de conexão: por host ou por URL. Nosso cenário será conectar usando URL; selecione a opção URL. Aqui podemos colar a URL. Em vez de localhost, ela já traz o domínio interno da AWS, os dois-pontos, a porta e a barra com o banco de dados — tudo estruturado. Se selecionarmos a opção Host, o DBeaver basicamente monta essa URL para nós a partir do host, porta e nome do banco. Na URL de conexão JDBC, é utilizado o driver JDBC como mecanismo de conexão. O Database é o banco ao qual queremos conectar inicialmente. Podemos também marcar a opção de mostrar todos os bancos quando não soubermos o nome.
Na autenticação, escolhemos o método Username/Password. No nome de usuário, se voltarmos para a tela da AWS, podemos ver o nome do banco que já está lá e o nome do usuário principal. Podemos clicar no ícone de cópia para copiar o nome de usuário e, em seguida, voltar ao DBeaver e colar no campo Nome de usuário. A senha é a que registramos ao provisionar: Alura com A maiúscula, hashtag, 1, 2. Podemos marcar a caixa para que o DBeaver não solicite a senha sempre.
Depois de inserir usuário, senha e host/URL, nosso próximo passo é testar a conexão. Na parte inferior da janela de configuração, há um botão chamado Testar conexão. Ao clicar, o DBeaver identificará se há drivers necessários. Se já tiver sido usado anteriormente, o driver estará disponível; se não, o DBeaver fará o download. Neste caso, permitimos que ele faça o download. Se já estiver instalado, não será necessário mais nada. Em seguida, o DBeaver tentará acessar o host da nossa base RDS e conectar. Se tudo estiver correto com as informações fornecidas, será exibido um teste bem-sucedido; caso contrário, surgirá algum erro.
Houve um erro aqui. Vamos verificar o que ocorreu. Clicamos em OK e voltamos à console da AWS. No painel do banco de dados, clicamos no nome. No canto superior direito, há um botão chamado Modificar; clicamos nele. Aqui podemos ver todas as configurações que fizemos. Muito provavelmente há algum ponto que passou despercebido. Quando ocorre esse erro, geralmente é um timeout (estouro de tempo de conexão), que indica lentidão para conectar. A tentativa de conexão foi feita, a base demorou a responder, e isso provavelmente está relacionado à disponibilidade pública da base na internet. Pode ser a porta, entre outros fatores.
Há uma configuração muito importante relacionada ao acesso público. Descendo até o menu Conectividade, clicamos em Configuração adicional (retraída). Essa parte de configuração adicional foi deixada como “Não acessível publicamente”. Isso quer dizer que só se pode acessar essa base dentro do ambiente da AWS, não pela internet. Marcamos “Público acessível”. Em seguida, descemos até o final da página e clicamos em Continuar.
Depois de clicar em Continuar, aparecerá a tela “Modificar a instância de banco de dados”, com o nome da instância e as opções para Programar modificações. Em Programar modificações, escolhemos “Aplicar imediatamente”, para que possamos realizar o ajuste agora, sem esperar. Depois disso, clicamos em “Modificar instância de banco de dados”, o botão laranja no canto inferior direito. Ao clicar, a modificação começará a ser aplicada. Em seguida, clicamos em Atualizar e aguardamos. O estado mostrará “Modificando”. Continuamos clicando em Atualizar até que o estado fique “Disponível”. Agora está “Disponível”.
Voltamos ao DBeaver e testamos a conexão novamente. Clicamos em Testar conexão. Agora, a expectativa é que funcione. A barra avançou e apareceu a tela “Teste de conexão com sucesso”. Clicamos em OK e concluímos.
Com isso, no menu lateral esquerdo, expandimos nossa base. Clicamos para desdobrá-la (na seta para baixo). A base de dados será carregada. Expandimos o menu de bases, e aparecerá um database chamado postgre. Clicamos em postgre e, com o botão esquerdo, selecionamos Editor > Abrir Script SQL. Será aberta uma tela conectada à base postgre.
Pegamos nosso Create Tables SQL. Selecionamos tudo com Ctrl+A, copiamos com Ctrl+C e colamos aqui no DBeaver. Com isso, temos um script de criação. Clicamos no botão Executar instrução SQL (no topo, em laranja). Vamos verificar o que ocorreu. Testamos aqui o CREATE TABLE inicial. Perfeito. Selecionando apenas a primeira tabela para criar e executando, conseguimos criá-la.
Para refletir esse primeiro teste de criação, o script da tabela de clientes é:
-- Tabela de Clientes
-- Nome legado: ERP_HP_CLIE (Head de Pessoa - Cliente)
CREATE TABLE IF NOT EXISTS erp_hp_clie (
cod_clie SERIAL PRIMARY KEY, -- nome do cliente
nm_clie VARCHAR(200), -- nome do cliente
ds_email VARCHAR(200), -- email
nr_cpfcnpj VARCHAR(20), -- cpf ou cnpj
tp_pessoa CHAR(1), -- F-física, J-jurídica
dt_cad VARCHAR(20), -- data de cadastro (armazenada como texto!)
cd_uf CHAR(2), -- estado
nm_cidade VARCHAR(100), -- cidade
st_ativo INTEGER DEFAULT 1 -- 1-ativo, 0-inativo
);
Esse primeiro CREATE confirma que a conexão está funcionando e estabelece a estrutura para a entidade de clientes do ERP.
Para validar, expandimos postgre, depois esquema, depois public e, em seguida, tabelas. Podemos atualizar pressionando F5 sobre postgre para atualizar e verificar se algo apareceu. Vemos que a tabela executada erp_hp_clie foi criada. Agora vamos à tabela seguinte e executamos. Sem erros. Em seguida, a próxima, e seguimos assim sucessivamente para cada um dos objetos que vamos criar na base.
Seguindo a criação das demais tabelas do ERP, executamos os scripts abaixo:
-- Tabela de Produtos
-- Nome legado: ERP_IT_PROD (Item de Produto)
CREATE TABLE IF NOT EXISTS erp_it_prod (
cod_prod SERIAL PRIMARY KEY,
ds_prod VARCHAR(300), -- descrição do produto
cd_categ VARCHAR(50), -- código da categoria
ds_categ VARCHAR(100), -- descrição da categoria
vl_preco NUMERIC(12,2), -- preço unitário
vl_custo NUMERIC(12,2), -- custo unitário
qt_estq INTEGER, -- quantidade em estoque
cd_sku VARCHAR(50), -- SKU
dt_cad VARCHAR(20), -- data de cadastro (texto!)
st_ativo INTEGER DEFAULT 1 -- 1-ativo, 0-inativo
);
-- Tabela de Pedidos (Cabeçalho)
-- Nome legado: ERP_OV_CABE (Ordem de Venda - Cabeçalho)
CREATE TABLE IF NOT EXISTS erp_ov_cabe (
nr_ov SERIAL PRIMARY KEY,
cod_clie INTEGER REFERENCES erp_hp_clie(cod_clie),
dt_ov VARCHAR(20), -- data do pedido (texto!)
vl_tot NUMERIC(12,2), -- valor total
vl_desc NUMERIC(12,2) DEFAULT 0, -- valor desconto
vl_frete NUMERIC(12,2), -- valor frete
cd_status VARCHAR(20), -- status (PAGO, CANCELADO, PENDENTE, DEVOLVIDO)
cd_canal VARCHAR(50), -- canal de venda
cd_pgto VARCHAR(50), -- forma de pagamento
dt_pgto VARCHAR(20), -- data pagamento (texto!)
nr_parcelas INTEGER DEFAULT 1 -- numero de parcelas
);
-- Tabela de Itens do Pedido
-- Nome legado: ERP_OV_ITEM (Ordem de Venda - Item)
CREATE TABLE IF NOT EXISTS erp_ov_item (
id_item SERIAL PRIMARY KEY,
nr_ov INTEGER REFERENCES erp_ov_cabe(nr_ov),
cod_prod INTEGER REFERENCES erp_it_prod(cod_prod),
qt_item INTEGER, -- quantidade
vl_unit NUMERIC(12,2), -- valor unitário no momento da venda
vl_tot_item NUMERIC(12,2), -- valor total do item
vl_desc_item NUMERIC(12,2) DEFAULT 0, -- desconto do item
nr_seq INTEGER -- sequencia do item no pedido
);
-- Tabela de Pagamentos
-- Nome legado: ERP_FN_PGTO (Financeiro - Pagamento)
CREATE TABLE IF NOT EXISTS erp_fn_pgto (
id_pgto SERIAL PRIMARY KEY,
nr_ov INTEGER REFERENCES erp_ov_cabe(nr_ov),
cd_pgto VARCHAR(50), -- tipo (PIX, CARTAO_CREDITO, BOLETO, CARTAO_DEBITO)
vl_pgto NUMERIC(12,2), -- valor pago
dt_pgto VARCHAR(20), -- data pagamento (texto!)
cd_status_pgto VARCHAR(100), -- APROVADO, RECUSADO, PENDENTE, ESTORNADO
cd_nsu VARCHAR(100), -- NSU da transação
nr_parcela INTEGER DEFAULT 1 -- parcela atual
);
Essas tabelas modelam o domínio central do ERP: catálogo de produtos, cabeçalho e itens de pedidos e seus pagamentos.
Em seguida, criamos os índices dentro das tabelas, executando cada um deles. Perfeito. Agora as tabelas estão criadas com seus respectivos índices.
-- Índices para performance
CREATE INDEX IF NOT EXISTS idx_ov_cabe_clie ON erp_ov_cabe(cod_clie);
CREATE INDEX IF NOT EXISTS idx_ov_cabe_dt ON erp_ov_cabe(dt_ov);
CREATE INDEX IF NOT EXISTS idx_ov_item_ov ON erp_ov_item(nr_ov);
CREATE INDEX IF NOT EXISTS idx_ov_item_prod ON erp_ov_item(cod_prod);
CREATE INDEX IF NOT EXISTS idx_fn_pgto_ov ON erp_fn_pgto(nr_ov);
Agora vamos ao script 2, que é para inserir os dados no ambiente. Damos Ctrl+A no script 2, Ctrl+C e, aqui no DBeaver, Ctrl+A para selecionar tudo; pressionamos Delete para apagar e, depois, Ctrl+V para colar. Agora executaremos a parte de popular os dados.
Primeiro, vamos popular clientes. Colocamos o cursor no INSERT e vamos até o seu final. Clicamos em Executar. Perfeito. Foi executado; os dados foram inseridos.
INSERT INTO erp_hp_clie (nm_clie, ds_email, nr_cpfcnpj, tp_pessoa, dt_cad, cd_uf, nm_cidade, st_ativo) VALUES
('Maria Silva Santos', 'maria.silva@email.com', '123.456.789-00', 'F', '2023-01-15', 'SP', 'São Paulo', 1),
('João Pedro Oliveira', 'joao.pedro@email.com', '234.567.890-11', 'F', '2023-01-20', 'RJ', 'Rio de Janeiro', 1),
('Ana Carolina Souza', 'ana.souza@email.com', '345.678.901-22', 'F', '2023-01-10', 'MG', 'Belo Horizonte', 1),
('Tech Solutions Ltda', 'contato@techsolutions.com', '12.345.678/0001-90', 'J', '2023-03-05', 'SP', 'Campinas', 1),
('Carlos Eduardo Lima', 'carlos.lima@email.com', '456.789.012-33', 'F', '15/04/2023', 'RS', 'Porto Alegre', 1),
('Fernanda Costa', 'fernanda.costa@email.com', '567.890.123-44', 'F', '2023-05-12', 'PR', 'Curitiba', 1),
('Digital Commerce SA', 'vendas@digitalcommerce.com', '23.456.789/0001-01', 'J', '2023-02-28', 'SP', 'São Paulo', 1),
('Roberto Almeida', 'roberto.almeida@email.com', '678.901.234-55', 'F', '2023-06-01', 'BA', 'Salvador', 1),
('Patricia Mendes', 'patricia.mendes@email.com', '789.012.345-66', 'F', '2023-03-15', 'SC', 'Florianópolis', 1),
('Lucas Ferreira', 'lucas.ferreira@email.com', '890.123.456-77', 'F', '01-07-2023', 'PE', 'Recife', 1),
('Empresa ABC Comércio', 'compras@empresaabc.com', '34.567.890/0001-12', 'J', '2023-04-10', 'SP', 'Guarulhos', 1),
('Juliana Barbosa', 'juliana.barbosa@email.com', '901.234.567-88', 'F', '2023-07-20', 'GO', 'Goiânia', 1),
('Marcos Vinicius Rocha', 'marcos.rocha@email.com', '012.345.678-99', 'F', '2023-05-25', 'CE', 'Fortaleza', 1),
('Camila Rodrigues', 'camila.rodrigues@email.com', '111.222.333-44', 'F', '2023-08-01', 'DF', 'Brasília', 1),
('Distribuidora Norte Ltda', 'contato@distnorte.com', '45.678.901/0001-23', 'J', '2023-06-15', 'AM', 'Manaus', 1),
('Rafael Santos', 'rafael.santos@email.com', '222.333.444-55', 'F', '2023-07-10', 'RJ', 'Niterói', 1),
('Gabriela Martins', 'gabriela.martins@email.com', '333.444.555-66', 'F', '2023-08-20', 'SP', 'Santos', 1),
('Thiago Nascimento', 'thiago.nasc@email.com', '444.555.666-77', 'F', '2023-10-05', 'MG', 'Uberlândia', 1),
('Larissa Campos', 'larissa.campos@email.com', '555.666.777-88', 'F', '2023-08-20', 'SP', 'Ribeirão Preto', 1),
('Pedro Henrique Dias', 'pedro.dias@email.com', '666.777.888-99', 'F', '2023-11-12', 'RS', 'Caxias do Sul', 1),
('MegaStore Digital', 'sac@megastore.com', '56.789.012/0001-34', 'J', '2023-09-15', 'SP', 'São Paulo', 1),
('Bianca Teixeira', 'bianca.teixeira@email.com', '777.888.999-00', 'F', '2023-10-15', 'PR', 'Londrina', 1),
('Andre Gomes', 'andre.gomes@email.com', '888.999.000-11', 'F', '2023-11-20', 'BA', 'Feira de Santana', 1),
('Isabela Cardoso', 'isabela.cardoso@email.com', '999.000.111-22', 'F', '2023-12-01', 'SC', 'Joinville', 1),
('Ricardo Pereira', 'ricardo.pereira@email.com', '000.111.222-33', 'F', '2024-01-05', 'PE', 'Caruaru', 1),
('Startup Inovacao', 'admin@startupinovacao.com', '67.890.123/0001-45', 'J', '2024-01-05', 'SP', 'São José dos Campos', 1),
('Vanessa Araujo', 'vanessa.araujo@email.com', '111.000.999-48', 'F', '2024-02-01', 'GO', 'Anápolis', 1),
('Leticia Fonseca', 'leticia.fonseca@email.com', '222.111.000-66', 'F', '2024-03-01', 'DF', 'Brasília', 1),
('Gustavo Ribeiro', 'gustavo.ribeiro@email.com', '333.222.555-55', 'F', '2024-03-10', 'SP', 'Sorocaba', 1),
('Aline Carvalho', 'aline.carvalho@email.com', 'NULL', 'F', '2024-04-01', 'RJ', 'Petrópolis', 1),
('Daniel Machado', 'daniel.machado@email.com', '555.666.444-33', 'F', '2024-04-15', 'MG', 'Juiz de Fora', 1),
('Renata Lopes', 'renata.lopes@email.com', '666.777.555-22', 'F', '2024-05-15', 'RS', 'Pelotas', 1),
('Bruno Azevedo', 'bruno.azevedo@email.com', '777.888.666-11', 'F', '2024-05-10', 'PA', 'Belém', 1),
('Natalia Castro', 'natalia.castro@email.com', '888.777.666-00', 'F', '2024-01-01', 'BA', 'Vitória da Conquista', 1),
('Comércio Global Eireli', 'financeiro@comercioglobal.com', '78.901.234/0001-56', 'J', '2024-01-20', 'SP', 'Osasco', 1),
('Vinicius Pinto', 'vinicius.pinto@email.com', '100.300.200-40', 'F', '2024-05-10', 'SC', 'Blumenau', 1),
('Mariana Correia', 'mariana.correia@email.com', '200.300.400-50', 'F', '2024-07-01', 'PE', 'Olinda', 1),
('Rodrigo Freitas', 'rodrigo.freitas@email.com', '300.400.500-60', 'F', '2024-07-10', 'GO', 'Aparecida de Goiânia', 1),
('Tatiana Nogueira', 'tatiana.nogueira@email.com', '400.500.600-70', 'F', '2024-08-01', 'CE', 'Juazeiro do Norte', 1),
('Empresa Nacional SA', 'contato@nacional.com', '89.012.345/0001-67', 'J', '2024-02-10', 'DF', 'Brasília', 1),
('Ananda Prado', 'amanda.prado@email.com', '500.600.700-80', 'F', '2024-08-15', 'DF', 'Brasília', 1),
('Diego Moura', 'diego.moura@email.com', '600.700.800-90', 'F', '2024-09-01', 'SP', 'Jundiaí', 1),
('Priscila Ramos', 'priscila.ramos@email.com', '700.800.900-01', 'F', '2024-09-10', 'RJ', 'Volta Redonda', 1),
('Eduardo Siqueira', 'eduardo.siqueira@email.com', '800.900.100-12', 'F', '2024-10-01', 'MG', 'Montes Claros', 1),
('Logística Express Ltda', 'ops@logisticaexpress.com', '90.123.456/0001-78', 'J', '2024-03-05', 'RS', 'Novo Hamburgo', 1),
('Claudia Monteiro', 'claudia.monteiro@email.com', '900.100.200-23', 'F', '2024-10-15', 'PR', 'Ponta Grossa', 1),
('Fábio Cunha', 'fabio.cunha@email.com', '100.300.500-34', 'F', '2024-11-01', 'BA', 'Ilhéus', 1),
('Simone Batista', 'simone.batista@email.com', '200.400.600-45', 'F', '2024-11-10', 'SC', 'Chapecó', 1),
('Henrique Duarte', 'NULL', '300.500.700-56', 'F', '2024-12-01', 'PE', 'Garanhuns', 1); -- email nulo!
Em seguida, vamos a produtos. Selecionamos o INSERT até o final e Executar, para inserir os produtos.
INSERT INTO erp_it_prod (ds_prod, cd_categ, ds_categ, vl_preco, vl_custo, qt_estq, cd_sku, dt_cad, st_ativo) VALUES
('Smartphone Galaxy S24 Ultra 256GB', 'ELET', 'Eletrônicos', 6999.00, 4500.00, 150, 'SKU-ELET-001', '2023-01-15', 1),
('Notebook Dell Inspiron 15 16GB', 'ELET', 'Eletrônicos', 4299.00, 2800.00, 80, 'SKU-ELET-002', '2023-01-15', 1),
('Fone Bluetooth JBL Tune 520BT', 'ELET', 'eletronicos', 249.90, 120.00, 500, 'SKU-ELET-003', '2023-02-15', 1), -- categoria lowercase
('Smart TV LG 55" 4K', 'ELET', 'ELETRÔNICOS', 3199.00, 2100.00, 60, 'SKU-ELET-004', '2023-01-01', 1), -- categoria uppercase
('Câmera Canon EOS R50', 'ELET', 'Eletrônicos', 5499.00, 3600.00, 30, 'SKU-ELET-005', '2023-01-01', 1),
('Camiseta Basica Algodão P', 'MODA', 'Moda', 49.90, 15.00, 1000, 'SKU-MODA-001', '2023-03-01', 1),
('Calca Jeans Slim Fit 42', 'MODA', 'moda', 159.90, 55.00, 400, 'SKU-MODA-002', '2023-03-01', 1), -- categoria lowercase
('Tênis Nike Air Max 90', 'MODA', 'Moda', 799.90, 350.00, 200, 'SKU-MODA-003', '2023-02-01', 1),
('Jaqueta Couro Sintético M', 'MODA', 'Moda', 299.90, 120.00, 150, 'SKU-MODA-004', '2023-03-01', 1),
('Relógio Casio Digital Vintage', 'MODA', 'Moda', 189.90, 70.00, 300, 'SKU-MODA-005', '2023-01-01', 1),
('Geladeira Brastemp Frost Free 375L', 'ELED', 'Eletrodomésticos', 3299.00, 2200.00, 40, 'SKU-ELED-001', '2023-01-15', 1),
('Lavadora de Roupa Electrolux 12kg', 'ELED', 'eletrodomesticos', 2199.00, 1600.00, 50, 'SKU-ELED-002', '2023-02-10', 1), -- sem acento!
('Aspirador Robô iRobot Roomba', 'ELED', 'Eletrodomésticos', 2499.00, 1600.00, 50, 'SKU-ELED-003', '2023-01-01', 1),
('Micro-ondas Panasonic 32L', 'ELED', 'Eletrodomésticos', 699.00, 350.00, 100, 'SKU-ELED-004', '2023-02-01', 1),
('Cafeteira Nespresso Vertuo', 'ELED', 'Eletrodomésticos', 899.00, 450.00, 120, 'SKU-ELED-005', '2023-05-01', 1),
('Livro - O Poder do Hábito', 'LIVR', 'Livros', 39.90, 12.00, 800, 'SKU-LIVR-001', '2023-01-01', 1),
('Livro - Python para Análise de Dados', 'LIVR', 'livros', 99.90, 30.00, 300, 'SKU-LIVR-002', '2023-01-01', 1), -- categoria lowercase
('Livro - Clean Code', 'LIVR', 'Livros', 79.90, 25.00, 250, 'SKU-LIVR-003', '2023-02-01', 1),
('Kindle Paperwhite 16GB', 'LIVR', 'Livros', 599.90, 350.00, 100, 'SKU-LIVR-004', '2023-03-01', 1),
('Livro - Engenharia de Dados', 'LIVR', 'Livros', 94.90, 32.00, 200, 'SKU-LIVR-005', '2023-01-01', 1),
('Whey Protein Isolado 900g', 'SAUD', 'Saúde', 149.90, 60.00, 400, 'SKU-SAUD-001', '2023-01-01', 1),
('Creatina Monohidratada 300g', 'SAUD', 'Saúde', 89.90, 30.00, 500, 'SKU-SAUD-002', '2023-02-01', 1),
('Vitamina D3 2000UI 60 caps', 'SAUD', 'Saúde', 34.90, 10.00, 1000, 'SKU-SAUD-003', '2023-01-01', 1),
('Colchão Ortobom Queen', 'CASA', 'Casa e Decoração', 1899.90, 900.00, 25, 'SKU-CASA-001', '2023-01-01', 1),
('Jogo de Panelas Tramontina 10pc', 'CASA', 'casa e decoração', 1099.00, 500.00, 100, 'SKU-CASA-002', '2023-01-01', 1), -- categoria lowercase
('Luminária LED de Mesa', 'CASA', 'Casa e Decoração', 129.90, 40.00, 250, 'SKU-CASA-003', '2023-02-01', 1),
('Cadeira Gamer ThunderX3', 'CASA', 'Casa e Decoracao', 1299.90, 650.00, 60, 'SKU-CASA-004', '2023-04-01', 1), -- sem acento!
('Bicicleta Caloi Aro 29', 'ESPT', 'Esportes', 1599.90, 850.00, 45, 'SKU-ESPT-001', '2023-01-01', 1),
('Esteira Elétrica Movement', 'ESPT', 'esportes', 2799.00, 1500.00, 20, 'SKU-ESPT-002', '2023-05-01', 1), -- categoria lowercase
('Kit Halteres Emborrachados 20kg', 'ESPT', 'Esportes', 199.90, 80.00, 200, 'SKU-ESPT-003', '2023-02-01', 1);
Agora a parte de itens de pagamentos. Há uma função para gerar os dados de pedidos. Clicamos no trecho da função, do CREATE até o final. Perfeito. Foi executado corretamente.
CREATE OR REPLACE FUNCTION gerar_dados_pedidos() RETURNS void AS $$
DECLARE
v_nr_ov INTEGER;
v_cod_clie INTEGER;
v_dt_pedido TEXT;
v_canal TEXT;
v_pgto TEXT;
v_status TEXT;
v_num_items INTEGER;
v_cod_prod INTEGER;
v_qt INTEGER;
v_vl_unit NUMERIC;
v_vl_tot_item NUMERIC;
v_vl_tot_pedido NUMERIC;
v_vl_desc NUMERIC;
v_vl_frete NUMERIC;
v_dt_pgto TEXT;
v_seq INTEGER;
v_parcelas INTEGER;
v_vl_parcela NUMERIC;
i INTEGER;
j INTEGER;
v_canais TEXT[] := ARRAY['website', 'website', 'website', 'app_mobile', 'App Mobile', 'APP_MOBIL'];
v_pgtos TEXT[] := ARRAY['pix', 'Pix', 'PIX', 'cartao_credito', 'Cartao Credito', 'CARTAO_CREDITO', 'boleto', 'BOLETO', 'cartao_debito', 'Cartao Debito', 'CARTAO_DEBITO'];
v_status_list TEXT[] := ARRAY['PAGO', 'PAGO', 'PAGO', 'PAGO', 'PAGO', 'PAGO', 'CANCELADO', 'PENDENTE', 'DEVOLVIDO'];
v_meses TEXT[];
v_dia INTEGER;
v_ano INTEGER;
BEGIN
-- Gerar 500 pedidos distribuidos entre 2023-06 e 2024-12
FOR i IN 1..500 LOOP
-- Selecionar cliente aleatório
v_cod_clie := (floor(random() * 50) + 1)::INTEGER;
-- Gerar data aleatória entre 2023-06 e 2024-12
v_ano := CASE WHEN random() < 0.4 THEN 2023 ELSE 2024 END;
IF v_ano = 2023 THEN
v_mes := (floor(random() * 7) + 6)::INTEGER; -- jun-dez 2023
ELSE
v_mes := (floor(random() * 12) + 1)::INTEGER; -- jan-dez 2024
END IF;
v_dia := (floor(random() * 28) + 1)::INTEGER;
-- Formatar data (intencionalmente em formatos variados!)
IF random() < 0.7 THEN
v_dt_pedido := v_ano || '-' || lpad(v_mes::TEXT, 2, '0') || '-' || lpad(v_dia::TEXT, 2, '0');
ELSIF random() < 0.85 THEN
v_dt_pedido := lpad(v_mes::TEXT, 2, '0') || '/' || lpad(v_dia::TEXT, 2, '0') || '/' || v_ano;
ELSE
v_dt_pedido := lpad(v_dia::TEXT, 2, '0') || '/' || lpad(v_mes::TEXT, 2, '0') || '/' || v_ano;
END IF;
-- Canal e pagamento aleatórios (com inconsistências propositais)
v_canal := v_canais[floor(random() * array_length(v_canais, 1)) + 1];
v_pgto := v_pgtos[floor(random() * array_length(v_pgtos, 1)) + 1];
v_status := v_status_list[floor(random() * array_length(v_status_list, 1)) + 1];
-- Numero de items por pedido (1-5)
v_num_items := (floor(random() * 5) + 1);
-- Desconto e frete
v_vl_desc := CASE WHEN random() < 0.3 THEN round((random() * 100)::NUMERIC, 2) ELSE 0 END;
v_vl_frete := CASE WHEN random() < 0.4 THEN 0 ELSE round((random() * 50 + 10)::NUMERIC, 2) END;
-- Parcelas
v_parcelas := CASE
WHEN v_pgto ILIKE '%pix%' OR v_pgto ILIKE '%debito%' THEN 1
WHEN v_pgto ILIKE '%boleto%' THEN (floor(random() * 3) + 1)::INTEGER
ELSE (floor(random() * 12) + 1)::INTEGER
END;
-- Data de pagamento
IF v_status IN ('PAGO', 'pago', 'Pago') THEN
v_dt_pgto := v_dt_pedido;
ELSIF v_status = 'DEVOLVIDO' THEN
v_dt_pgto := v_dt_pedido;
ELSE
v_dt_pgto := NULL;
END IF;
-- Inserir cabeçalho (valor total será atualizado depois)
INSERT INTO erp_ov_cabe (cod_clie, dt_ov, vl_tot, vl_desc, vl_frete, cd_status, v_canal, cd_pgto, dt_pgto, nr_parcelas)
VALUES (v_cod_clie, v_dt_pedido, 0, v_vl_desc, v_vl_frete, v_status, v_canal, v_pgto, v_dt_pgto, v_parcelas)
RETURNING nr_ov INTO v_nr_ov;
v_vl_tot_pedido := 0;
-- Inserir itens
FOR j IN 1..v_num_items LOOP
v_cod_prod := (floor(random() * 30) + 1)::INTEGER;
v_qt := (floor(random() * 3) + 1)::INTEGER;
SELECT vl_preco INTO v_vl_unit FROM erp_it_prod WHERE cod_prod = v_cod_prod;
v_vl_tot_item := v_qt * v_vl_unit;
v_vl_tot_pedido := v_vl_tot_pedido + v_vl_tot_item;
v_seq := j;
INSERT INTO erp_ov_item (nr_ov, cod_prod, qt_item, vl_unit, vl_tot_item, vl_desc_item, nr_seq)
VALUES (v_nr_ov, v_cod_prod, v_qt, v_vl_unit, v_vl_tot_item, 0, v_seq);
END LOOP;
-- Atualizar total do pedido
v_vl_tot_pedido := v_vl_tot_pedido - v_vl_desc + v_vl_frete;
UPDATE erp_ov_cabe SET vl_tot = v_vl_tot_pedido WHERE nr_ov = v_nr_ov;
-- Inserir pagamento(s)
-- Alguns pedidos sem pagamento (~3%) para gerar inconsistência
IF random() > 0.03 THEN
IF v_parcelas = 1 THEN
INSERT INTO erp_fn_pgto (nr_ov, vl_pgto, cd_pgto, dt_pgto, cd_status_pgto, cd_nsu, nr_parcela)
VALUES (v_nr_ov, v_vl_tot_pedido, v_pgto, dt_pgto,
CASE v_status
WHEN 'CANCELADO' THEN 'RECUSADO'
WHEN 'PENDENTE' THEN 'PENDENTE'
WHEN 'DEVOLVIDO' THEN 'ESTORNADO'
ELSE 'APROVADO'
END,
'NSU-' || lpad(v_nr_ov::TEXT, 8, '0') || '-001',
1);
ELSE
v_vl_parcela := round(v_vl_tot_pedido / v_parcelas, 2);
FOR k IN 1..v_parcelas LOOP
INSERT INTO erp_fn_pgto (nr_ov, vl_pgto, cd_pgto, dt_pgto, cd_status_pgto, cd_nsu, nr_parcela)
VALUES (v_nr_ov, v_vl_parcela, v_pgto, dt_pgto,
CASE v_status
WHEN 'CANCELADO' THEN 'RECUSADO'
WHEN 'PENDENTE' THEN 'PENDENTE'
WHEN 'DEVOLVIDO' THEN 'ESTORNADO'
ELSE 'APROVADO'
END,
'NSU-' || lpad(v_nr_ov::TEXT, 8, '0') || '-' || lpad(k::TEXT, 3, '0'),
k);
END LOOP;
END IF;
END IF;
END LOOP;
-- Inserir ~5 pedidos com nr_ov referenciando itens com order_id NULL simulado
-- (não podemos ter FK null, mas inserimos itens com valores zerados)
IF i IN (10, 50, 100, 200, 350) THEN
INSERT INTO erp_ov_item (nr_ov, cod_prod, qt_item, vl_unit, vl_tot_item, vl_desc_item, nr_seq)
VALUES (v_nr_ov, NULL, 0, 0, 0, 0, 99);
END IF;
END LOOP;
END;
$$ LANGUAGE plpgsql;
Essa função gera 500 pedidos distribuídos em 2023 e 2024, criando cabeçalhos, itens e pagamentos com variações propositais para simular dados reais e inconsistências comuns.
Agora executamos o SELECT para disparar a geração dos pedidos.
-- Executar geração
SELECT gerar_dados_pedidos();
Em seguida, vamos eliminar a função: fazemos o DROP da função.
-- Limpar function
DROP FUNCTION IF EXISTS gerar_dados_pedidos();
E aqui fazemos uma verificação básica para ver os dados das tabelas.
-- Verificações básicas
SELECT 'Clientes' as tabela, count(*) as registros FROM erp_hp_clie
UNION ALL
SELECT 'Produtos', count(*) FROM erp_it_prod
UNION ALL
SELECT 'Pedidos', count(*) FROM erp_ov_cabe
UNION ALL
SELECT 'Itens', count(*) FROM erp_ov_item
UNION ALL
SELECT 'Pagamentos', count(*) FROM erp_fn_pgto;
Perfeito. Temos 50 registros na tabela de clientes, 30 registros na tabela de produtos, 500 registros na tabela de pedidos, itens na tabela de itens e 1276 itens na tabela de pagamentos.
Com isso, nosso banco de dados agora está corretamente populado com todos os dados de que precisamos para implementar a arquitetura de dados, fazendo a ingestão desses dados e continuando nosso projeto, que é a parte principal de tratamento e resolução dos problemas. Em seguida, poderemos analisar esses dados e verificar o que está adequado e o que precisa de correção.
Eu te espero na próxima aula, em que iremos à execução direta do projeto, criando a primeira AWS Lambda para ingerir os dados no nosso Amazon S3. Muito obrigado. Nos vemos lá.
O curso Engenharia de Dados: Pipeline de Dados Básico na AWS possui 411 minutos de vídeos, em um total de 66 atividades. Gostou? Conheça nossos outros cursos de Engenharia de Dados em Data Science, ou leia nossos artigos de Data Science.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
O Plano Plus evoluiu: agora com Luri para impulsionar sua carreira com os melhores cursos e acesso à maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Programação, Data Science, Front-end, DevOps, Mobile, Inovação & Gestão, UX & Design, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
Acesso à inteligência artificial da Alura.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri Vision chegou no Plano Pro: a IA da Alura que enxerga suas dúvidas, acelera seu aprendizado e conta também com o Alura Língua que prepara você para competir no mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Chat, busca, exercícios abertos, revisão de aula, geração de legenda para certificado.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Para quem quer atingir seus objetivos mais rápido: Luri Vision ilimitado, vagas de emprego exclusivas e mentorias para acelerar cada etapa da jornada.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Catálogo de tecnologia para quem é da área de Marketing
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais de forma ilimitada.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.