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:
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
);
Em seguida, crie um tipo de tabela que possa armazenar múltiplas vendas.
CREATE OR REPLACE TYPE TabelaVendas AS TABLE OF VendaTipo;
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;
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!