Fórum Erro ao executar a procedure ! #57013
03/10/2006
0
tenho a seguinte procedure :
CREATE PROCEDURE CRIA_RELATORIO_OS_EM_ABERTO( I_DATA_PREVISAO DATE) RETURNS ( C_COD_OS CHAR(15)) AS begin delete from TE0300; for select distinct C_COD_OS from CM0100 where C_DATA_PREVISAO <= :I_DATA_PREVISAO and C_DATA_EXECUCAO is null into :C_COD_OS do begin insert into TE0300(C_COD_OS) values (:C_COD_OS); end end
fazendo o select separado resulta nos seguintes códigos :
[list:6c51f0e2dc]
00000000000007
00000000000008
[/list:u:6c51f0e2dc]
Mas quando executo a procedure inteira, dá o seguinte erro:
Alguém sabe me dizer o que estou fazendo errado..
obs : estou usando o software IBExpert.
Cabelo
Curtir tópico
+ 0Posts
26/10/2006
Cabelo
Gostei + 0
26/10/2006
Catunda
ta acusando violação de chave primaria na tabela TE0300.
Experimenta colocar um SUSPEND após a linha do INSERT INTO.
Gostei + 0
31/10/2006
Cabelo
Já coloquei e dá o mesmo erro..
O que parece estar acontecendo é que no comando da 1ª linha delete from... não está sendo sendo executado ou melhor não está comitando.. sei lá..
Mas não deveria se comportar assim.. pois estamos falando da mesma procedure..
não sei o que é...
Você tem idéia???
Gostei + 0
05/11/2006
Acacio
Tente Assim:
CREATE or Alter PROCEDURE CRIA_RELATORIO_OS_EM_ABERTO(
I_DATA_PREVISAO DATE)
RETURNS (
C_COD INTEGER)
AS
declare variable C_COD_OS INTEGER;
begin
delete from TE0300;
for select distinct C_COD_OS
from CM0100
where C_DATA_PREVISAO <= :I_DATA_PREVISAO and C_DATA_EXECUCAO is null
into :C_COD
do
begin
SUSPEND;
insert into TE0300(C_COD_OS) values (:C_COD);
C_COD = 0;
end
end
Gostei + 0
06/11/2006
Cabelo
Colega.. esta procedure seleciona em uma tabela Temporária no banco.. as OS´s que estão ´vencidas´ e ainda não foram executadas..
tenho que usá-las assim, pois o meu sistema é utilizado remotamente e se precisar selecionar as OS´s todas a svezes que utilizar o sistema... fica lento..
Fiz exatamente como você me disse e tive problemas pois o código da OS não é numérico.. e char(15), tirei a linha
C_COD = 0;
e assim funcionou :
CREATE PROCEDURE CRIA_RELATORIO_OS_EM_ABERTO( I_DATA_PREVISAO DATE) RETURNS (C_COD_OS CHAR(15)) begin delete from TE0300; for select distinct C_COD_OS from CM0100 where C_DATA_PREVISAO <= :I_DATA_PREVISAO and C_DATA_EXECUCAO is null into :C_COD_OS do begin SUSPEND; insert into TE0300(C_COD_OS) values (:C_COD_OS); end end
muito obrigado..
mas mais uma coisa..
qual é a diferença entre o suspend antes do insert e o suspend depois do insert como estava utilizando???
o suspend funciona como um commit no delphi dentro de uma procedure no firebird ????
valeu...
Gostei + 0
07/11/2006
Acacio
Ele só joga o valor recebido na tela;
Gostei + 0
07/11/2006
Cabelo
Exatamente... foi assim que eu aprendí..
mas se tirar o suspend antes do insert não executa e dá erro...
com o suspend funciona perfeitamente..
sei lá..
não entendí..
valeu
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)