Ir para conteúdo
Fórum Script Brasil

jc101b

Membros
  • Total de itens

    2
  • Registro em

  • Última visita

Posts postados por jc101b

  1. Ola pessoal...

    to começando com no postgree... eu não quero criar as primary key usando o tipo SERIAL, pois usa o tipo int...eu quero criar os meus codigo de clientes usando os digito verificador e para isso crio no tipo char...até poderia ser com int..mas teria que poder modificar o  CREATE SEQUENCE da coluna SERIAL da table... ainda não tentei criar uma modificada...claro não é só para cliente, é tb para funcionarios, titulos etc....então a minha duvida/dificuldade é criar uma funcao utilizada na trigger de cada table em que eu passaria a coluna que eu quero acessar na minha table de controle(ctl) :

    CREATE OR REPLACE FUNCTION seqDig(tab character, col character )   RETURNS trigger AS $$

    --- aqui nessa função eu estou acessando table clientes(cli) e a de controle(ctl) 

    -- cl01 eu passar como caracter na var de parametro col="cl01" 

    -- $1 é primeiro parametro contem o alias/table em uso , $2 é o segundo parametro, contem o nome da coluna da primary key
      DECLARE
    --    c  ctl%ROWTYPE;
        ccl01 char(10);
      BEGIN
        IF (TG_OP = 'INSERT') THEN
          update ctl SET $2 = geraseq(cl01);
    --      update ctl SET cl01 = geraseq(cl01);
    --      SELECT cl01 INTO cli FROM ctl;
          SELECT $1  INTO $2 FROM ctl;
    --      NEW.$1 := ccl01;
          NEW.cl01 := ccl01;
        END IF;
        RETURN NEW;
      END;
    $$  LANGUAGE plpgsql 
    o quero é não reescrever essa trigger para cada table onde eu uso primary key SERIAL...

    estudando mais cheguei nisso, mas da erro na linha assinalada, se alguém tiver uma dica ... eu agradeço a gentileza...

    CREATE OR REPLACE FUNCTION codSeq() RETURNS trigger AS $codSeq$
      DECLARE
        c  ctl%ROWTYPE;
        tb character(20);
        cl character(20);
      BEGIN
        tb:=TG_ARGV[0]; -- nome da table
        cl:=TG_ARGV[1]; -- nome da coluna/campo
        IF (TG_OP = 'INSERT') THEN
          EXECUTE 'update ctl SET '||cl||' = geraseq('||cl||')';
          SELECT *  INTO c FROM ctl;
          EXECUTE 'NEW.'||cl||':= c.'||cl; --- aqui da erro quando no insert  na table cli
        END IF;
        RETURN NEW;
      END;
    $codSeq$ LANGUAGE plpgsql;

    -- CREATE  TRIGGER cli_seq BEFORE INSERT ON cli  FOR EACH ROW  EXECUTE PROCEDURE codSeq('cli','cl01');

  2. Ola Amigo...

    eu tb to começando no postgre... eu tive essa dificuldade em criar uma trigger para gerar um sequencial em caracter de uma primary key...

    -mas vai o a minha trigger...tem 2 trigger em q eu posso gerar/alterar o meu serial que tenho no minha table de controle(ctl) 

    espero ter ajudado... eu vou criar um tópico de uma dificuldade que eu tenho espero q você me de tb uma dica...

    --- primeira trigger

    CREATE OR REPLACE FUNCTION cli_seq() RETURNS trigger AS $cli_seq$
      DECLARE
        c  ctl%ROWTYPE; -- aqui eu crio a variavel local que vai armazenar o registro todo da table ctl
      BEGIN
        IF (TG_OP = 'INSERT') THEN
          update ctl SET cl01 = geraseq(cl01);
          SELECT *  INTO c FROM ctl;
          NEW.cl01 := c.cl01;
        END IF;
        RETURN NEW;
      END;
    $cli_seq$ LANGUAGE plpgsql;

    --segunda trigger
    CREATE OR REPLACE FUNCTION cli_seq() RETURNS trigger AS $cli_seq$
      DECLARE
    --    c  ctl%ROWTYPE;
        ccl01 char(10); -- aqui eu crio uma  var local
      BEGIN
        IF (TG_OP = 'INSERT') THEN
          update ctl SET cl01 = geraseq(cl01);
          SELECT cl01  INTO ccl01 FROM ctl; -- aqui eu passo o conteudo do registro/coluna ctl.cl01 para a variavel local "ccl01"
          NEW.cl01 := ccl01; 
        END IF;
        RETURN NEW;
      END;
    $cli_seq$ LANGUAGE plpgsql;

    CREATE  TRIGGER cli_seq BEFORE INSERT ON cli  FOR EACH ROW  EXECUTE PROCEDURE cli_seq();

×
×
  • Criar Novo...