VALUES (NEXTVAL('idlcto')

2 respostas
juniorsatanas

Pessoal to fazendo um gatilho no postgres, e to pegando um erro louco.. segue código e erro :

-- deleta o campo sequence
-- DROP SEQUENCE idlcto;

-- cria o campo sequence
CREATE SEQUENCE teste.idlcto;

-- apaga e cria a tabela cliente
-- DROP TABLE cliente;
CREATE TABLE teste.cliente (
   codcli    smallint NOT NULL,
   nome      varchar(30) NOT NULL,
   saldo     numeric(10,2) NOT NULL DEFAULT 0.0,
   CONSTRAINT pk_cliente PRIMARY KEY (codcli) );

-- apaga e cria a tabela lancamento
-- DROP TABLE lancamento;
CREATE TABLE teste.lancamento (
   idlcto    integer NOT NULL,
   codcli    smallint NOT NULL,
   dtentrada date NOT NULL default now(),
   valor     numeric(10,2) NOT NULL DEFAULT 0.0,
   historico varchar(100) NOT NULL,
   CONSTRAINT pk_lancamento PRIMARY KEY (idlcto) );

-- cria e/ou recria a funcao do tipo TRIGGER
CREATE OR REPLACE FUNCTION teste.atualiza_saldo() RETURNS trigger AS
$BODY$
DECLARE
  percentual numeric(10,2);
BEGIN
  percentual := 10;
  NEW.valor := NEW.valor + (NEW.valor * percentual * 0.01);
  UPDATE cliente SET saldo = saldo + NEW.valor WHERE codcli = NEW.codcli;
  NEW.historico := 'LCTO: ' || NEW.historico;
  RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

-- cria a TRIGGER que utiliza a funcao criada acima
-- DROP TRIGGER tg_lancamento ON lancamento;
CREATE TRIGGER tg_lancamento
  BEFORE INSERT ON teste.lancamento
  FOR EACH ROW EXECUTE PROCEDURE teste.atualiza_saldo();


INSERT INTO teste.cliente (codcli,nome,saldo) VALUES (1,'JOAO DA SILVA',0);
INSERT INTO teste.cliente (codcli,nome,saldo) VALUES (2,'MARIA JOAQUINA DA SILVA',0);
INSERT INTO teste.cliente (codcli,nome,saldo) VALUES (3,'CARLOS ROBERTO SOUZA',0);


INSERT INTO teste.lancamento (idlcto,codcli,dtentrada,valor,historico)           VALUES (NEXTVAL('idlcto'),1,now(),25.0,'LANCAMENTO VALOR POSITIVO');
INSERT INTO teste.lancamento (idlcto,codcli,dtentrada,valor,historico)           VALUES (NEXTVAL('idlcto'),1,now(),-28.0,'LANCAMENTO VALOR NEGATIVO');
INSERT INTO teste.lancamento (teste.idlcto,codcli,dtentrada,valor,historico)     VALUES (NEXTVAL('idlcto'),2,now(),-125.0,'LANCAMENTO VALOR POSITIVO');
INSERT INTO teste.lancamento (idlcto,codcli,dtentrada,valor,historico)           VALUES (NEXTVAL('idlcto'),2,now(),265.0,'LANCAMENTO VALOR NEGATIVO');


SELECT * FROM teste.cliente;
SELECT * FROM teste.lancamento;

to pegando este erro:

NOTA:  CREATE TABLE / PRIMARY KEY criará índice implícito "pk_cliente" na tabela "cliente"
NOTA:  CREATE TABLE / PRIMARY KEY criará índice implícito "pk_lancamento" na tabela "lancamento"
ERRO:  relação "idlcto" não existe
LINHA 53: ...ntrada,valor,historico)           VALUES (NEXTVAL('idlcto'),...
                                                               ^

********** Erro **********

ERRO: relação "idlcto" não existe
SQL state: 42P01
Caracter: 1685

2 Respostas

O

faz um teste assim

NEXTVAL(‘teste.idlcto’);

juniorsatanas
RESOLVIDO OBRIGADO !
-- deleta o campo sequence
-- DROP SEQUENCE idlcto;

-- cria o campo sequence
CREATE SEQUENCE idlcto;

-- apaga e cria a tabela cliente
-- DROP TABLE cliente;
CREATE TABLE cliente (
   codcli    smallint NOT NULL,
   nome      varchar(30) NOT NULL,
   saldo     numeric(10,2) NOT NULL DEFAULT 0.0,
   CONSTRAINT pk_cliente PRIMARY KEY (codcli) );

-- apaga e cria a tabela lancamento
-- DROP TABLE lancamento;
CREATE TABLE lancamento (
   idlcto    integer NOT NULL,
   codcli    smallint NOT NULL,
   dtentrada date NOT NULL default now(),
   valor     numeric(10,2) NOT NULL DEFAULT 0.0,
   historico varchar(100) NOT NULL,
   CONSTRAINT pk_lancamento PRIMARY KEY (idlcto) );

-- cria e/ou recria a funcao do tipo TRIGGER
CREATE OR REPLACE FUNCTION atualiza_saldo() RETURNS trigger AS
$BODY$
DECLARE
  percentual numeric(10,2);
BEGIN
  percentual := 10;
  NEW.valor := NEW.valor + (NEW.valor * percentual * 0.01);
  UPDATE cliente SET saldo = saldo + NEW.valor WHERE codcli = NEW.codcli;
  NEW.historico := 'LCTO: ' || NEW.historico;
  RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

-- cria a TRIGGER que utiliza a funcao criada acima
-- DROP TRIGGER tg_lancamento ON lancamento;
CREATE TRIGGER tg_lancamento
  BEFORE INSERT ON lancamento
  FOR EACH ROW EXECUTE PROCEDURE atualiza_saldo();


INSERT INTO cliente (codcli,nome,saldo) VALUES (1,'JOAO DA SILVA',0);
INSERT INTO cliente (codcli,nome,saldo) VALUES (2,'MARIA JOAQUINA DA SILVA',0);
INSERT INTO cliente (codcli,nome,saldo) VALUES (3,'CARLOS ROBERTO SOUZA',0);


INSERT INTO lancamento (idlcto,codcli,dtentrada,valor,historico) VALUES (NEXTVAL('idlcto'),1,now(),25.0,'LANCAMENTO VALOR POSITIVO');
INSERT INTO lancamento (idlcto,codcli,dtentrada,valor,historico) VALUES (NEXTVAL('idlcto'),1,now(),-28.0,'LANCAMENTO VALOR NEGATIVO');
INSERT INTO lancamento (idlcto,codcli,dtentrada,valor,historico) VALUES (NEXTVAL('idlcto'),2,now(),-125.0,'LANCAMENTO VALOR POSITIVO');
INSERT INTO lancamento (idlcto,codcli,dtentrada,valor,historico) VALUES (NEXTVAL('idlcto'),2,now(),265.0,'LANCAMENTO VALOR NEGATIVO');


SELECT * FROM cliente;
SELECT * FROM lancamento;



********************************

-- Table: logins

-- DROP TABLE logins;

CREATE TABLE logins
(
  nome character varying,
  senha character varying,
  status bigint DEFAULT 0,
  pkid serial NOT NULL,
  CONSTRAINT pkidserial PRIMARY KEY (pkid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE logins OWNER TO postgres;

-- Trigger: tg_logado on logins

-- DROP TRIGGER tg_logado ON logins;


CREATE OR REPLACE FUNCTION proc_func_logado()
  RETURNS trigger AS
$BODY$
DECLARE
  nao_logado integer;
  sim_logado integer;
  
BEGIN
 -- nao_logado := 0;
  sim_logado := 1;
  NEW.status := (sim_logado);
  UPDATE logins SET status = status + NEW.status WHERE pkid = NEW.pkid;
  RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
  

CREATE TRIGGER tg_logado
  BEFORE INSERT ON UPDATE ON logins
  FOR EACH ROW EXECUTE PROCEDURE proc_func_logado();
Criado 23 de julho de 2010
Ultima resposta 24 de jul. de 2010
Respostas 2
Participantes 2