In PL-SQL how to partially add a value?

Asked

Viewed 551 times

0

I have to add the value partially the values of a category (goes the code 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:

Bug report - ORA-06550: line 21, column 19: PLS-00201: Dentifier 'VALOR' 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:

  • Of shape ???

  • Fixed category s

  • was using Vcata := VALUE;

  • Bug report - ORA-06550: line 21, column 19: PLS-00201: Identifier 'VALOR' 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:

  • remove the java tag and insert sql

1 answer

2


By understanding the question it is necessary to remove the totalizer within the loop of repetition.

Make some logical adjustments such as:

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

Follow the ideal model with comments in the code:

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 don’t understand the use of UPDATES without WHERE...

[OFF TOPIC]

https://i.stack.Imgur.com/Yqcbj.jpg

  • Correct, insert the WHERE in each row

Browser other questions tagged

You are not signed in. Login or sign up in order to post.