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?