Procedure in Mysql to clone products, Using CURSOR FOR SELECT

Asked

Viewed 1,299 times

-1

I need to clone the data from an EST_PROD_PRECO_CUSTO_EMPRESA table of id x company for the same table but of the company with id y. in Pl/Sql I did so.

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 can not use mysql 5.7 and I think I am limited to solutions.

I tried with a strange way but how n I managed to make a foreach as in oracle 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; 

ran without error but n changed nothing.

then I found a way that I think plays a Foreach role

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 from 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;

ABSTRACT: I am changing data from a table to data from the same table but from different parameters. I am not entering!

Update with Inner Jay would be a good practice ?

Someone can help out?

  • Solução: <code> UPDATE EST_PROD_PRECO_CUSTO_EMPRESA p1&#xA;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&#xA;ON p1.ID_PRODUTO = x1.ID_PRODUTO and p1.ID_EMPRESA = Y&#xA;SET P1.PRECO_CUSTO = X1.PRECO_CUSTO , P1.PRECO_CUSTO_FINAL = X1.PRECO_CUSTO_FINAL </code>

  • Dude, since you managed to get to the answer on your own, I advise you to write an answer to your own question and mark it as correct to help others who have the same problem. It is OK to answer the question itself, this is even encouraged.

  • OK, I answered my own question because I once wrote a new answer and one person told me the contrary that you kk.

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

Browser other questions tagged

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