Erro ao executar a procedure !
Colegas..
tenho a seguinte procedure :
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.
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:
can´t format message 13:99 -- message file C:\AQUIVOS DE PROGRAMAS\HK-SOFTWARE\firebird.msg not found
lock conflict on no wait transaction
violation of PRIMARY or UNIQUE KEY constraint ´PK_TE0300´ on table ´TE0300´.
Alguém sabe me dizer o que estou fazendo errado..
obs : estou usando o software IBExpert.
Cabelo
Curtidas 0
Respostas
Cabelo
03/10/2006
sobe... :(
GOSTEI 0
Catunda
03/10/2006
Cabelo,
ta acusando violação de chave primaria na tabela TE0300.
Experimenta colocar um SUSPEND após a linha do INSERT INTO.
ta acusando violação de chave primaria na tabela TE0300.
Experimenta colocar um SUSPEND após a linha do INSERT INTO.
GOSTEI 0
Cabelo
03/10/2006
Colega..
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???
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
Acacio
03/10/2006
Não entendi direito para que tu queres esta procedure mas vamos lá.
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
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
Cabelo
03/10/2006
Não entendi direito para que tu queres esta procedure mas vamos lá.
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..
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
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
Acacio
03/10/2006
Não que eu saiba o suspende não funciona como commit;
Ele só joga o valor recebido na tela;
Ele só joga o valor recebido na tela;
GOSTEI 0
Cabelo
03/10/2006
Não que eu saiba o suspende não funciona como commit;
Ele só joga o valor recebido na tela;
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