Procedure in MySql to clone products, using CURSOR FOR SELECT

0

I need to clone the data from a table EST_PROD_PRECO_CUSTO_EMPRESA of the company of id x to the same table but of the company with id and. in Pl / Sql I did it that way.

DECLARE

  CURSOR v_precos IS SELECT ID_PRODUTO, PRECO_CUSTO, PRECO_CUSTO_FINAL FROM erp.EST_PROD_PRECO_CUSTO_EMPRESA where id_empresa = x and PRECO_CUSTO>0;

BEGIN   

FOR v_preco IN v_precos LOOP

  UPDATE erp.EST_PROD_PRECO_CUSTO_EMPRESA SET PRECO_CUSTO = v_preco.PRECO_CUSTO, PRECO_CUSTO_FINAL = v_preco.PRECO_CUSTO_FINAL
  WHERE ID_PRODUTO = v_preco.ID_PRODUTO AND ID_EMPRESA = y;

  END LOOP;

END;

but in mySql I'm not able to use mySql 5.7 and I think I'm limited in the solutions.

I tried with a strange way but as I could not do a foreach as in oracle I could only use variables without having access to the object itself.

CREATE PROCEDURE preco_test() 
BEGIN   
    DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE v_id_produto INT ;
    DECLARE v_preco_custo double(15,5) ;
    DECLARE v_preco_custo_final double(15,5) ;

    DECLARE v_produto CURSOR  FOR SELECT ID_PRODUTO FROM EST_PROD_PRECO_CUSTO_EMPRESA where id_empresa = x  and PRECO_CUSTO>0;
    DECLARE v_p_custo CURSOR  FOR SELECT PRECO_CUSTO FROM EST_PROD_PRECO_CUSTO_EMPRESA where id_empresa = x  and PRECO_CUSTO>0;
    DECLARE v_p_custo_final CURSOR  FOR SELECT PRECO_CUSTO_FINAL  FROM EST_PROD_PRECO_CUSTO_EMPRESA where id_empresa = x  and PRECO_CUSTO>0;


-- declare NOT FOUND handler
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

    OPEN v_produto;
    OPEN v_p_custo;
    OPEN v_p_custo_final;

        get_precos: LOOP

            FETCH v_produto INTO v_id_produto;
            FETCH v_p_custo INTO v_preco_custo;
            FETCH v_p_custo_final INTO v_preco_custo_final;


             IF v_finished =0 THEN 
             LEAVE get_precos;
             END IF;

                    UPDATE erp.EST_PROD_PRECO_CUSTO_EMPRESA SET PRECO_CUSTO = v_preco_custo, PRECO_CUSTO_FINAL = v_preco_custo_final
                    WHERE ID_PRODUTO = v_id_produto AND ID_EMPRESA = y ;


        END LOOP get_precos;

    CLOSE v_produto;
CLOSE v_p_custo;
CLOSE v_p_custo_final;
END; 

run without error but n would change anything.

Then I found a way I think plays the role of ForEach

CREATE PROCEDURE preco_test() 
BEGIN   
DECLARE done INT DEFAULT 0;

    DECLARE v_precos CURSOR FOR SELECT ID_PRODUTO, PRECO_CUSTO, PRECO_CUSTO_FINAL FROM EST_PROD_PRECO_CUSTO_EMPRESA where id_empresa = x and PRECO_CUSTO>0;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
  DECLARE v_preco CURSOR FOR v_precos OPEN v_preco;

    FETCH v_preco INTO ;
    WHILE done=0
            DO

                    UPDATE EST_PROD_PRECO_CUSTO_EMPRESA SET PRECO_CUSTO = v_preco.PRECO_CUSTO, PRECO_CUSTO_FINAL = v_preco.PRECO_CUSTO_FINAL 
                    WHERE ID_PRODUTO = v_preco.ID_PRODUTO AND ID_EMPRESA = y ;

                FETCH v_precos INTO;
        END WHILE;

 CLOSE
 FETCH v_precos INTO v_preco;
 END; 

but the syntax error

  

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'v_precos OPEN v_preco;

SUMMARY: I am changing data from a table to the data of the same table but from different parameters. I'm not inserting!

Update with Inner join would be a good practice?

Can anyone help?

    
asked by anonymous 07.12.2018 / 19:29

1 answer

0

Solution: UPDATE EST_PROD_PRECO_CUSTO_EMPRESA p1 INNER JOIN (SELECT ID_PRODUTO, PRECO_CUSTO, PRECO_CUSTO_FINAL FROM EST_PROD_PRECO_CUSTO_EMPRESA where ID_EMPRESA = X and PRECO_CUSTO>0) x1 ON p1.ID_PRODUTO = x1.ID_PRODUTO and p1.ID_EMPRESA = Y SET p1.PRECO_CUSTO = x1.PRECO_CUSTO , p1.PRECO_CUSTO_FINAL = x1.PRECO_CUSTO_FINAL

    
07.12.2018 / 20:08