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');
Pergunta
jc101b
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');
Editado por jc101bLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.