multiple rows in a singleton selection
Pessoal, estou tendo esse erro (citado no título) quando minha trigger é disparada. Vejam o SQL:
A intençao nesse caso, é saber o código (PK) do registro deletado.
O que está errado nesta trigger?
CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO ACTIVE BEFORE DELETE POSITION 0 AS declare cod integer = 0; begin SELECT OLD.COD FROM ITENSMOVIMENTO INTO :COD; end
A intençao nesse caso, é saber o código (PK) do registro deletado.
O que está errado nesta trigger?
Kopcheski
Curtidas 0
Respostas
Sremulador
09/02/2007
Amigo vc deve especificar com um where apenas um registro, pois desta formar estar[a fazendo um select na tabela toda.
CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO ACTIVE BEFORE DELETE POSITION 0 AS declare cod integer = 0; begin SELECT OLD.COD FROM ITENSMOVIMENTO WHERE NEW.COD=??? INTO :COD DO SUEPEND; end
GOSTEI 0
Emerson Nascimento
09/02/2007
uma coisa está redundante: se você está excluindo os registros da tabela ITENSMOVIMENTO, porque você está tentando executar o select nessa mesma tabela?
não é necessário, visto que OLD é uma tabela temporária com os registros da tabela ITENSMOVIMENTO que estão sendo excluídos.
explique melhor o que você deseja fazer que talvez possamos dar alguma dica que te ajude na solução do seu problema.
não é necessário, visto que OLD é uma tabela temporária com os registros da tabela ITENSMOVIMENTO que estão sendo excluídos.
explique melhor o que você deseja fazer que talvez possamos dar alguma dica que te ajude na solução do seu problema.
GOSTEI 0
Kopcheski
09/02/2007
Ok, explicarei melhor. :)
Quando eu excluo um item da tabela ITENSMOVIMENTO, eu gostaria de saber qual registro foi deletado. Por isso eu usei old.cod. Sabendo qual item foi deletado, eu faço algumas outras operaçoes. Mas em resumo, eu preciso saber qual registro da tabela ITENSMOVIMENTO foi excluído. E de preferencia, através de triggers, já que o uso de procedures com hibernate é bem complicado. Muito complicado.
Quando eu excluo um item da tabela ITENSMOVIMENTO, eu gostaria de saber qual registro foi deletado. Por isso eu usei old.cod. Sabendo qual item foi deletado, eu faço algumas outras operaçoes. Mas em resumo, eu preciso saber qual registro da tabela ITENSMOVIMENTO foi excluído. E de preferencia, através de triggers, já que o uso de procedures com hibernate é bem complicado. Muito complicado.
GOSTEI 0
Emerson Nascimento
09/02/2007
certo... old.cod é uma PK na tabela ITENSMOVIMENTO?
publique a estrutura dessa tabela
publique a estrutura dessa tabela
GOSTEI 0
Kopcheski
09/02/2007
CREATE TABLE ITENSMOVIMENTO ( COD INTEGER NOT NULL, QUANT FLOAT, PRC DOUBLE PRECISION, OPERACAO VARCHAR(1), ORCAMENTO_CODORC INTEGER, SERVICO_COD INTEGER ); ALTER TABLE ITENSMOVIMENTO ADD PRIMARY KEY (COD); ALTER TABLE ITENSMOVIMENTO ADD CONSTRAINT FKFAA9E71D155A10C2 FOREIGN KEY (ORCAMENTO_CODORC) REFERENCES ORCAMENTO (CODORC); ALTER TABLE ITENSMOVIMENTO ADD CONSTRAINT FKFAA9E71D3C3160B2 FOREIGN KEY (SERVICO_COD) REFERENCES SERVICO (COD);
GOSTEI 0
Emerson Nascimento
09/02/2007
certo. então trabalhe diretamente com OLD.COD
supondo que sua tabela de itens comportasse produtos de uma nota fiscal de saida/venda, o saldo em estoque poderia ser realimentado assim:
você não precisa selecionar os dados. você já está com eles no registro temporário OLD. basta trabalhar com os campos que você deseja.
supondo que sua tabela de itens comportasse produtos de uma nota fiscal de saida/venda, o saldo em estoque poderia ser realimentado assim:
CREATE TRIGGER VOLTAR_ESTOQUE_VENDA FOR ITENSMOVIMENTO ACTIVE BEFORE DELETE POSITION 0 AS begin update ProdutoSaldo set Saldo = Saldo + OLD.Quant where Produto = OLD.COD end
GOSTEI 0
Kopcheski
09/02/2007
vlw emerson..
enquanto postava aqui, estive tentanto dar um jeito nisso..
Muito obrigado pela ajuda! :)
enquanto postava aqui, estive tentanto dar um jeito nisso..
Muito obrigado pela ajuda! :)
GOSTEI 0