Duvida de automatização no banco de dados Oracle

SQL

Oracle

Stored Procedures

Oracle PL SQL

29/05/2020

Pessoal, boa tarde.
Não sei se o titulo está certo, mais a questão que eu preciso resolver é a seguinte.
Tenho uma tabela de cadastro de parceiros, onde existem diversas informações onde uma delas é a região desse parceiro.
E eu preciso que ao realizar ou atualizar esse cadastro o campo região seja inserido automaticamente por valores pré definidos.
3 variáveis que são: se o cliente é contribuinte ou nao, se o cliente é cliente de representante ou não, e o estado.
essas 3 variáveis definem a região do cliente.

exemplo: se ao cadastrar um cliente ele for contribuinte, não for cliente de representante e é do estado de são paulo a região dele será definida automaticamente com 'xxxxx'.

Tentei realizar isso atravês de um Trigger, não sei se fiz de forma correta, porêm o funcionamento dela é bem inconsistente.
Então queria saber se existe outras possibilidades de realizar esse procedimento, e se não houver alguem poderia me dizer qual a melhor estrutura para a trigger?

Grato.
Gustavo Paula

Gustavo Paula

Curtidas 0

Respostas

Gustavo Paula

Gustavo Paula

29/05/2020

]CREATE OR REPLACE TRIGGER TRG_INC_UPD_REG_G
BEFORE INSERT OR UPDATE
ON SANKHYA_TESTE.TGFPAR 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
V_REPRESENTANTE VARCHAR2(1);
V_CONTRIBUINTE VARCHAR2(1);
V_ESTADO NUMBER;

BEGIN
  SELECT AD_REPRESENTANTE INTO V_REPRESENTANTE FROM TGFPAR WHERE CODPARC =:NEW.CODPARC;
  SELECT CLASSIFICMS INTO V_CONTRIBUINTE FROM TGFPAR WHERE CODPARC =:NEW.CODPARC;
  SELECT UF.CODUF INTO V_ESTADO FROM TSICID CID, TSIUFS UF WHERE CID.UF=UF.CODUF AND CODCID IN 
  (SELECT CODCID FROM TGFPAR WHERE CODPARC =:NEW.CODPARC);
 
        --CLIENTES NÃO CONTRIBUINTES, NÃO REPRESENTANTE, REGIAO MINAS
   IF 
    (V_ESTADO = 2 AND V_CONTRIBUINTE NOT IN (''''C'''',''''I'''',''''T'''') AND V_REPRESENTANTE = ''''N'''')
   THEN	
      :NEW.CODREG := 170000000;
   END IF;
      
      --CLIENTES CONTRIBUINTES, NÃO REPRESENTANTE, REGIAO MINAS
   IF 
    (V_ESTADO = 2 AND V_CONTRIBUINTE  IN (''''C'''',''''I'''',''''T'''') AND V_REPRESENTANTE = ''''N'''')
   THEN
      :NEW.CODREG := 090000000;
   END IF;
END;



Existem mais condições não somente essas duas, mais basicamente minha ideia inicial foi essa.
Como disse não sei se é a melhor opção ou ate mesmo a melhor estrutura.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/05/2020

veja se assim funciona.
CREATE OR REPLACE TRIGGER TRG_INC_UPD_REG_G
BEFORE INSERT OR UPDATE
ON SANKHYA_TESTE.TGFPAR 
FOR EACH ROW
DECLARE
	V_REPRESENTANTE VARCHAR2(1);
	V_CONTRIBUINTE VARCHAR2(1);
	V_ESTADO NUMBER;
BEGIN
	V_REPRESENTANTE := :NEW.AD_REPRESENTANTE;
	V_CONTRIBUINTE := :NEW.CLASSIFICMS;

	SELECT UF.CODUF
	INTO V_ESTADO
	FROM TSICID CID
	INNER JOIN TSIUFS UF ON UF.CODUF = CID.UF
	WHERE CID.CODCID = :NEW.CODCID;

	--CLIENTES REGIAO MINAS
	IF (V_ESTADO = 2) THEN
		--CLIENTES NÃO CONTRIBUINTES, NÃO REPRESENTANTE
		IF (V_CONTRIBUINTE NOT IN ('C','I','T')) AND (V_REPRESENTANTE = 'N') THEN
			:NEW.CODREG := 170000000; // AQUI É NUMÉRICO MESMO?
		END IF;

		--CLIENTES CONTRIBUINTES, NÃO REPRESENTANTE
		IF (V_CONTRIBUINTE IN ('C','I','T')) AND (V_REPRESENTANTE = 'N')
		THEN
			:NEW.CODREG := 090000000;
		END IF;
	END IF;
END;
GOSTEI 0
Gustavo Paula

Gustavo Paula

29/05/2020

Emerson, obrigado por responder.
Lá é numérico sim. Depois de analisar um pouco melhor percebi que não existia necessidade de realizar o select na mesma tabela em que a trigger estava atuando, então fiz basicamente o mesmo que você fez, e consegui executar o procedimento com sucesso.
Muito obrigado o forum tem me ajudado a evoluir bastante.
GOSTEI 0
POSTAR