In PL-SQL how to partially sum a value?

0

I have to add the value partially the values of a category (goes the code in below)

DECLARE
--VARAVEIS
CURSOR CPRODUTO IS SELECT * FROM PRODUTO_TESTE2;
VPRODUTO PRODUTO_TESTE2%ROWTYPE;
Vsoma real;
BEGIN

Vsoma := 0;

  FOR VPRODUTO IN CPRODUTO LOOP

    /*Valor somente da categoria A*/ 
     IF VPRODUTO.CATEGORIA='A' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 0.5;
     END IF;

    /*Valor somente da categoria B*/ 
     IF VPRODUTO.CATEGORIA='B' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 1.0;
     END IF;

     /*Valor somente da categoria C*/ 
     IF VPRODUTO.CATEGORIA='C' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 2.0;
     END IF; 

     /* Valor Total de todos */
     SELECT sum(VALOR) INTO Vsoma from PRODUTO_TESTE2;

  END LOOP;

  DBMS_OUTPUT.put_line('Soma Total: ' || Vsoma);
  DBMS_OUTPUT.put_line('Categoria A: ' || VCatA);
  DBMS_OUTPUT.put_line('Categoria B: ' || VCatB);
  DBMS_OUTPUT.put_line('Categoria C: ' || VCatC);
END;
/

Error message:

  

Error Reporting - ORA-06550: line 21, column 19: PLS-00201:   identifier 'VALUE' must be declared ORA-06550: line 21, column 10:   PL / SQL: Statement ignored   06550. 00000 - "line% s, column% s: \ n% s"   * Cause: Usually a PL / SQL compilation error.   * Action:

    
asked by anonymous 24.01.2018 / 14:51

1 answer

2

By understanding the question it is necessary to remove the totalizer inside the loop.

Make some logic adjustments such as:

  • Separate the business rule into a specific block
  • No need for variables for each category if use is visual only.

The ideal template with comments in the code follows:

DECLARE
   --CURSORES
   CURSOR CPRODUTO IS SELECT * FROM PRODUTO_TESTE2;
   --VARIAVEIS
   VPRODUTO PRODUTO_TESTE2%ROWTYPE;
   Vsoma real;
BEGIN

Vsoma := 0;

  -- <REGRA DE NEGÓCIO>
  -- DENTRO LAÇO DE REPETIÇÃO NÃO PODE HAVER TOTALIZADORES,
  -- ENQUANTO HOUVER POSSIBILIDADE DE ALTERAÇÃO DE VALORES

  FOR VPRODUTO IN CPRODUTO LOOP

    /*Valor somente da categoria A*/ 
     IF VPRODUTO.CATEGORIA='A' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 0.5;
     END IF;

    /*Valor somente da categoria B*/ 
     IF VPRODUTO.CATEGORIA='B' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 1.0;
     END IF;

     /*Valor somente da categoria C*/ 
     IF VPRODUTO.CATEGORIA='C' THEN
        UPDATE PRODUTO_TESTE2 SET VALOR = VALOR * 2.0;
     END IF;         

  END LOOP;
  -- FINAL DA REGRA DE NEGÓCIO

  -- INICIO DOS TOTALIZADORES

  /* Valor Total de todos */
  SELECT sum(VALOR) INTO Vsoma from PRODUTO_TESTE2;
  DBMS_OUTPUT.put_line('Soma Total: ' || Vsoma);

  /*Valor somente da categoria A*/ 
  SELECT sum(VALOR) INTO Vsoma from PRODUTO_TESTE2 WHERE CATEGORIA = 'A'; 
  DBMS_OUTPUT.put_line('Categoria A: ' || Vsoma);

  /*Valor somente da categoria B*/ 
  SELECT sum(VALOR) INTO Vsoma from PRODUTO_TESTE2 WHERE CATEGORIA = 'B';
  DBMS_OUTPUT.put_line('Categoria B: ' || Vsoma);

  /*Valor somente da categoria C*/ 
  SELECT sum(VALOR) INTO Vsoma from PRODUTO_TESTE2 WHERE CATEGORIA = 'C';
  DBMS_OUTPUT.put_line('Categoria C: ' || Vsoma);

END;

I just did not understand the use of UPDATES without WHERE ...

[OFF TOPIC]

link

    
24.01.2018 / 17:28