Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Weverton N

O que há de errado na chamada da minha Stored Procedure?

Recommended Posts

Alow galera.. tenho uma procedure no firebird assim:

 

SET TERM ^;CREATE PROCEDURE FECHANDO_SESSAO (	MAX_OF_DATA TIMESTAMP,	IDVISITA INTEGER,	DATA_SAIDA TIMESTAMP,	ID INTEGER)ASBEGIN  FOR	SELECT DISTINCT TBLCONTADOR.ID, TBLCONTADOR.DATA_SAIDA, TBLVISITAS.IDVISITA, MAX( TBLVISITAS.DATA ) MAX_OF_DATA	FROM TBLCONTADOR,	TBLVISITAS	WHERE 	   (		  (tblcontador.data_saida = tblcontador.data)	   and 		  (tblcontador.id = tblvisitas.idvisita)	   and (tblcontador.data < 'now')	   )	GROUP BY TBLCONTADOR.ID, TBLCONTADOR.DATA_SAIDA, TBLVISITAS.IDVISITA	INTO :ID,		 :DATA_SAIDA,		 :IDVISITA,		 :MAX_OF_DATA  DO  BEGIN  update tblcontador set data_saida = :MAX_OF_DATA;	SUSPEND;  ENDEND^SET TERM; ^GRANT SELECT,UPDATE ON TBLCONTADOR TO PROCEDURE FECHANDO_SESSAO;GRANT SELECT ON TBLVISITAS TO PROCEDURE FECHANDO_SESSAO;GRANT EXECUTE ON PROCEDURE FECHANDO_SESSAO TO SYSDBA;

Ela não precisa de nenhum valor externo pra funcionar, já que pega os valores do próprio banco de dados.

Eu nunca fiz uma procedure antes.. e não to conseguindo chamar ela no asp:

 

set objCommand = Server.CreateObject("ADODB.Command")objCommand.ActiveConnection = cStringobjCommand.CommandText = "FECHANDO_SESSAO"objCommand.CommandType = adCmdStoredProc '*** Executando a stored procedureobjCommand.Execute

A conexão cString está ok, eu inclui o arquivo adovbs.inc para a constante adCmdStoredProc funcione.

E dá o seguinte erro:

 

Tipo de erro:

Microsoft OLE DB Provider for ODBC Drivers (0x80004005)

COUNT field incorrect

/pagina/teste.asp, line 19

 

Alguém me ajude!!!!!!!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

rntao vééééio...sua procedure ta executando beleza pelo "query anlizer" ???você tem certeza deq ela esta funcionando ???bom, você pode executar uma procedure assim, axo até mais facil, sem frescura de criar um objeto command:objConn.execute "exec sp_nomeProcedure"faloooow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz uns testes no query analizer e tá rolando certo... como que eu faço esse esquema ae??? do execute direto...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa.. consegui fazer o negócio funcionar..rrsrsDeu certo.. do nada a Stored Procedure deu certo.Mas no Query analizar da o seguinte erro:Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.lock conflict on no wait transaction.deadlock.update conflicts with concurrent update.Li na net que isso acontece quando tenta se fazer um update antes de dar um commint no upadate anterior.É pq na minha SP, ele dá um update para cada registro retornado.. dae eu tentei usar o commit work; e não dá certo. pq commit é bloqueado em stored procerures..Será que tem solução??? Uma forma de confirmar um update para ele poder dar sequencia ao outro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa@!@! Mechendo a gente aprende.. fiz um jeito aqui que parece dar certo.

 

Como ele não dá commit nos updates dentro de procedures... fiz a minha procedure principal chamar uma procedure externa, que faz o upadate:

 

SET TERM ^;CREATE PROCEDURE FECHANDO_SESSAO ASDECLARE VARIABLE IDVISITA INTEGER;DECLARE VARIABLE MAX_OF_DATA TIMESTAMP;DECLARE VARIABLE ID INTEGER;DECLARE VARIABLE DATA_SAIDA TIMESTAMP;BEGIN  FOR	SELECT DISTINCT TBLCONTADOR.ID, TBLCONTADOR.DATA_SAIDA, TBLVISITAS.IDVISITA, MAX( TBLVISITAS.DATA ) MAX_OF_DATA	FROM TBLCONTADOR,	TBLVISITAS	WHERE 	   (		  (tblcontador.data_saida = tblcontador.data)	   and 		  (tblcontador.id = tblvisitas.idvisita)	   and (tblcontador.data < 'now')	   )	GROUP BY TBLCONTADOR.ID, TBLCONTADOR.DATA_SAIDA, TBLVISITAS.IDVISITA	INTO :ID,		 :DATA_SAIDA,		 :IDVISITA,		 :MAX_OF_DATA  DO  BEGIN  EXECUTE PROCEDURE ATUALIZANDO_SESSAO(:ID,:max_of_data);  SUSPEND;  ENDEND^SET TERM; ^GRANT SELECT ON TBLCONTADOR TO PROCEDURE FECHANDO_SESSAO;GRANT SELECT ON TBLVISITAS TO PROCEDURE FECHANDO_SESSAO;GRANT EXECUTE ON PROCEDURE ATUALIZANDO_SESSAO TO PROCEDURE FECHANDO_SESSAO;GRANT EXECUTE ON PROCEDURE FECHANDO_SESSAO TO FECHANDO_SESSAO;GRANT EXECUTE ON PROCEDURE FECHANDO_SESSAO TO SYSDBA;

E a segunda procedure, que faz o update:

SET TERM ^;CREATE PROCEDURE ATUALIZANDO_SESSAO (	IDVISITA INTEGER,	MAX_OF_DATA TIMESTAMP)ASbegin  /* Procedure Text */  update tblcontador set data_saida = :MAX_OF_DATA where id = :IDVISITA;  suspend;end^SET TERM; ^GRANT SELECT,UPDATE ON TBLCONTADOR TO PROCEDURE ATUALIZANDO_SESSAO;GRANT EXECUTE ON PROCEDURE ATUALIZANDO_SESSAO TO SYSDBA;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.