Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Inserir mais de uma venda

Entendo que o comando 'EXECUTE' serve para executar a procedure, no caso, para eu incluir uma venda, que foi proposto em aula. Agora, como eu faria para inserir dados em um só comando, para não ter que ficar repetindo a instrução 'EXECUTE'? Existe algum tratamento que precisamos fazer ou ajustar a procedure, que permita receber mais de um dado, para inserir no banco?

2 respostas
solução!

Olá, Alexandre, tudo bem?

Para inserir múltiplas vendas de uma só vez sem precisar repetir o comando EXECUTE para cada venda, você pode considerar algumas abordagens. Uma solução é ajustar a sua procedure para aceitar um tipo de dados composto, como uma tabela PL/SQL ou um array, que contenha todos os registros que você deseja inserir. Vou te dar um exemplo:

  1. Primeiro, você precisa criar um tipo de dados que represente uma linha da sua tabela de vendas.

    CREATE OR REPLACE TYPE VendaTipo AS OBJECT (
        ID NUMBER,
        COD_PRODUTO NUMBER,
        DATA DATE,
        QUANTIDADE NUMBER,
        PRECO NUMBER,
        VALOR NUMBER,
        IMPOSTO NUMBER
    );
    
  2. Em seguida, crie um tipo de tabela que possa armazenar múltiplas vendas.

    CREATE OR REPLACE TYPE TabelaVendas AS TABLE OF VendaTipo;
    
  3. Modifique a sua procedure para receber esse tipo de tabela como parâmetro e iterar sobre ele para inserir cada venda.

    CREATE OR REPLACE PROCEDURE INCLUINDO_DADOS_VENDA(vendas IN TabelaVendas) AS
    BEGIN
        FOR i IN 1..vendas.COUNT LOOP
            INSERT INTO PRODUTO_VENDA_EXERCICIO (ID, COD_PRODUTO, DATA, QUANTIDADE, PRECO, VALOR, IMPOSTO)
            VALUES (vendas(i).ID, vendas(i).COD_PRODUTO, vendas(i).DATA, vendas(i).QUANTIDADE, vendas(i).PRECO, vendas(i).VALOR, vendas(i).IMPOSTO);
        END LOOP;
    END;
    
  4. Finalmente, você pode chamar a procedure passando uma coleção de vendas.

    DECLARE
        vendas TabelaVendas := TabelaVendas();
    BEGIN
        vendas.EXTEND(2); -- Supondo que você quer inserir duas vendas
        vendas(1) := VendaTipo(1, 41232, TO_DATE('01/01/2022', 'DD/MM/YYYY'), 100, 10, 1000, 10);
        vendas(2) := VendaTipo(2, 41233, TO_DATE('02/01/2022', 'DD/MM/YYYY'), 150, 15, 2250, 15);
    
        INCLUINDO_DADOS_VENDA(vendas);
    END;
    

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito bom. Gostei da solução. Obrigado, Monalisa!