Alterar colunas da tabela

2 respostas
V

bom dia galera,

Podem me ajudar com uso de cursor?

Estou tentando fazer uma funçao no postgresql para alterar os valores de uma coluna da tabela, mas gostaria de usar um cursor para aprender a lidar com eles.

Tenho uma tabela de empregados que tem como pk empno e uma fk (na mesma tabela emp) é mgr.

Gostaria de alterar os valores da coluna mgr e para isso comecei a fazer a funçao.

-----------------------------------------------------------------------------------------------------------------

CREATE TABLE emp 
    ( 
      empno int4 NOT NULL, 
      ename varchar(30) NOT NULL, 
      job varchar(30) NOT NULL, 
      deptno int4 NOT NULL, 
      mgr int4); 
     
    ALTER TABLE emp 
      ADD CONSTRAINT "PKemp" PRIMARY KEY(empno);

-----------------------------------------------------------------------------------------------------------------

----------------------------------------------
empno | ename | job | deptno | mgr |
-------+---------+-----------+--------+------+
7839 | KING | P | 10 | |
7698 | BLAKE | M | 30 | 7839 |
7900 | JAMES | CL | 30 | 7698 |
7990 | JOHNSON | S | 30 | 7698 |
7654 | MARTIN | S | 30 | 7698 |
7844 | TURNER | S | 30 | 7900 |

Gostaria de quando solicitar para alterar o diretor (coluna mgr) 7698 para 7900 ... alterar todos os valores 7698 para 7900.
-----------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION mudar_diretor(diretor_novo IN INTEGER , diretor_velho IN INTEGER) 
    RETURNS VOID  
    AS $$ 
     
    DECLARE 
     
    modificar CURSOR IS SELECT * FROM emp WHERE mgr = diretor_velho; 
     
    BEGIN 
     
    UPDATE emp 
    SET mgr=diretor_novo; 
     
    END; 
    $$ LANGUAGE 'plpgsql';

-----------------------------------------------------------------------------------------------------------------
ONde eu vou manipular o cursor dentro dessa funçao?

OBRIGADA,
veronica

2 Respostas

A

olá, voce vai ter que explicar um pouco melhor,
sinceramente ficou meio dificil de entender o que voce quer.

esta pensando em uma sintaxe SQl ou em um Procedure?
voce quer alterar uma chave primaria ou estrangeira?

V

Ola e obrigada por responder.

Ja avancei um pouco na funçao, mas ela tem alguns erros:

CREATE OR REPLACE FUNCTION modificar(diretorNovoIN INTEGER , diretorVelho IN INTEGER)
RETURNS VOID 
AS $$

DECLARE
V_TOT_UPD   integer:=0;
ligne emp%rowtype;

--cursor
modificar CURSOR IS SELECT * FROM EMP WHERE mgr = diretorVelho;

BEGIN
V_TOT_UPD :=0;
OPEN modificar;


LOOP
        FETCH modificar INTO ligne;
        EXIT WHEN NOT FOUND;

IF (diretorNovo!= emp.empno) THEN
RAISE NOTICE 'Diretor nao existe';
END IF;

IF (diretorVelho != emp.empno) THEN
RAISE NOTICE 'Diretor nao existe';
END IF;

UPDATE emp SET mgr=diretorNovo WHERE mgr=ligne.mgr;

--Contador
     V_TOT_UPD := V_TOT_UPD + 1;
	IF V_TOT_UPD > 0 THEN	
          RAISE NOTICE 'Registros Atualizados.: %', V_TOT_UPD; 
       END IF;

END LOOP;
CLOSE modificar;
END;
$$ LANGUAGE 'plpgsql';

Gostaria de atualizar os valores da coluna de diretor (mgr).
Se eu tenho mgr = 7900, gostaria de mudar para 7782 usando a funçao.
select modificar(7782,7900);

Fiz a funçao acima, mas atualiza somente 1 ocorrencia de diretor (mgr)
Quando tento atualizar diretor (mgr) com 2 ocorrencias, da erro.

Gostaria também de checar se os valores de diretor existem na tabema de empregado (emp).

OBRIGADA,
veronica

Criado 7 de abril de 2013
Ultima resposta 7 de abr. de 2013
Respostas 2
Participantes 2