lucasiigd
-
Total de itens
5 -
Registro em
-
Última visita
Posts postados por lucasiigd
-
-
Olá pessoal,
Estou com uma dúvida e gostaria de saber se alguém pode me dar uma ajuda.
Tenho o seguinte cenário na minha modelagem de contas bancárias :Conta, Movimento_conta, Salda_contas. Eu tenho o cadastro de contas corrente(Tabela CONTA), Os lançamentos(MOVIMENTO_CONTA) e a tabela onde quero controlar os Saldos(SALDO_CONTAS). O minha dúvida é como fazer e controle de concorrência/Transação da tabela SALDO_CONTAS, na hora que eu inserir um lançamento em MOVIMENTO_CONTA de forma que se dois usuários diferentes realizarem a operação no mesmo instante, os saldos não fique inconsistente.
Basicamente a sequencia é a seguinte:
1 - Insiro um lançamento em MOVIMENTO CONTA e depois;
2 - Atualizo o SALDO_CONTAS
Att;
Boa tarde Romário, eu sou bem novato no postgre sql, mas eu creio que esse link vai te ajudar.
http://pgdocptbr.sourceforge.net/pg80/triggers.html
Este link vai te levar até a documentação do Postgre, onde fala sobre as funções Triggers (gatilhos), essas funções podem executar determinadas ações ANTES ou DEPOIS de haver inserções, atualizações ou exclusões, ou seja quando os comandos insert, update e/ou delete forem executados. Dessa forma você poderá criar um gatilho onde o postgre vai executar a atualização da tabela SALDO_CONTAS logo depois que você inserir ou alterar um dado na tabela MOVIMENTO_CONTA.
Espero ter ajudado, forte abraço
-
Ola Josieli, eu fiz dessa forma e deu certo, espero que ajude
create trigger verifica_sem_municipio AFTER insert on cidade -- troquei o before pelo after, porque pra mim fica estranho deletar um registro que ainda não foi inserido. For Each Row execute procedure apaga_estado(); CREATE OR REPLACE FUNCTION public.apaga_estado() RETURNS trigger AS $BODY$ declare cd_cidade integer; cd_estado integer; begin cd_cidade := new.id_cidade; -- atribui o novo ID da cidade na variável cd_estado := new.id_estado; -- mantive o seu código if not exists(select * from cidade where id_estado = cd_estado) then delete from public."cidade" where cidade.id_cidade = cd_cidade; -- Fiz isso pra apagar o ultimo --registro inserido no banco. Esse "public.cidade" que coloquei é pra referenciar a tabela cidade, no --PgAdmin III é necessario fazer isso. end if; return null; End; $BODY$ LANGUAGE plpgsql
-
Olá amigos, estou tentando inserir dados em uma tabela através de uma função (que eu chamo de lancar_nota), a minha ideia é inserir o numero inicial, final e a empresa e então a função alimentaria o meu banco de dados automaticamente, por exemplo: SELECT lancar_nota(1,20,'LUCAS'); Essa função lançaria 20 notas na empresa LUCAS, o problema é que estou tendo os mesmos valores (o resultado está em anexo). Se eu executar a função manualmente várias vezes (ou seja SELECT lancar_nota(1,1,'LUCAS'), depois rodar novamente SELECT lancar_nota(2,2,'LUCAS') e assim por diante) eu obtenho valores diferentes (que é o meu objetivo), portanto eu presumo que a minha função está correta, eu acho. Por favor se alguém puder me ajudar, desde já eu agradeço.
Segue abaixo o código da função escrito em PLPGSQL
CREATE OR REPLACE FUNCTION public.lancar_nota(
numero_inicial integer,
numero_final integer,
apelido character varying)
RETURNS void AS
$BODY$
DECLAREdesconto numeric(10,2);
val_cont numeric(10,2);BEGIN
IF numero_final < numero_inicial
THEN RAISE NOTICE 'Numero Final não pode ser maior que o inicial, FIM DO PROCESSAMENTO';
END IF;FOR X IN numero_inicial..numero_final LOOP
desconto := public.gerar_valor(); -- Função para gerar valor de 0 a 1999,99
val_cont := public.gerar_valor();IF desconto >= val_cont -- Desconto não pode ser maior que o valor contábil
THEN desconto := 0.00;
END IF;INSERT INTO public.notas_icms(numero, dia, mes, tipo, apelido_empresa, valor_contabil, serie, desconto)
VALUES (X, public.escolher_dia(), public.escolher_mes(),'S', apelido, val_cont,1,desconto); -- a função escolher dia e mês, geram dias e meses aleatóriosEND LOOP;
RETURN;
END;PS: Sou novo no assunto ainda, estou aprendendo.
-
Ola ubiratan, estou iniciando no postgre sql também, se estiver usando o PgAdmin III, então a referenciação das tabelas é um pouco diferente, tente usar o "public." na frente da sua tabela.
Ficaria mais ou menos assim: insert into public."ad_mestre values" ('01','123','123')
PS: Não esqueça de usar a aspa dupla e o ponto.
Lo_export com select
em PostgreSQL
Postado · Editado por lucasiigd
Boa tarde Edmilton, sou novo no postgre, então eu vou tentar ajudar. Pelo que vejo "lo_export" parece ser uma função, certo ?
Se for o caso, então quando se executa ela no pgadmin, ela vai funcionar mesmo pois a consulta retornará um valor e será mostrado logo em seguida.
Quando se chama uma função dentro de outra, o resultado precisa ser armazenado em uma variável, portanto eu creio que foi por isso que o sistema emitiu esse erro pra você. Se estiver tentando apenas EXECUTAR a função lo_export, eu recomendo que tente trocar o SELECT por PERFORM, o comando PERFORM descarta o resultado da consulta. Agora se estiver tentando SALVAR ou RETORNAR o resultado dessa consulta, eu recomendo criar uma variável do tipo RECORD e usar o comando SELECT acrescentando a clausula INTO para que o postgre jogue o resultado dessa consulta dentro dessa variável. Ficaria mais ou menos assim.
DECLARE resultado record; BEGIN SELECT lo_export(Clinha,'//sicsistemas/c/testeexport.r' ) INTO resultado FROM tremessa WHERE nid_tremessa = 480 ; RETURN resultado; END
Espero ter ajudado, forte abraço