Página 1 de 2
Como se define um tempo limite para o Execute
Enviado: 29 Abr 2021 21:11
por asimoes
Pessoal,
Como se define um tempo limite para o Execute de um command (ADODB.Command)
Como se define um tempo limite para o Execute
Enviado: 29 Abr 2021 21:14
por JoséQuintas
Nunca usei isso.
Mas se não me engano é na conexão.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 01:38
por alxsts
Olá!
Código: Selecionar todos
// Prepare the stored procedure
With Object oCmd := win_OleCreateObject("ADODB.Command")
:CommandText := "spMyStoredProcedure"
:CommandType := adCmdStoredProc
:CommandTimeout = 120 // default = 30 seconds
:parameters:append( :createParameter( 'cMarca', adVarChar, adParamInput, 1, 'V' ) )
:parameters:append( :createParameter( 'dtCotacao', adDate, adParamInput, 10, '2021-04-01' ) )
:parameters:append( :createParameter( 'cHrCotacao', adVarChar, adParamInput, 5, '00:00' ) )
:parameters:append( :createParameter( 'nIntervalo', adInteger, adParamInput, 4, 400 ) )
:ActiveConnection := oCn
End With
// Execute the stored procedure. This returns a recordset.
oRs := oCmd:Execute()
oCmd := NIL
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 10:52
por JoséQuintas
Tô pensando aqui uma coisa:
Não seria mais interessante alterar de procedure pra function?
Igual naquelas rotinas de extenso.
Ou a finalidade de procedure é diferente de function?
Ao invés disso tudo, seria
Código: Selecionar todos
cnMySQL:Execute( "function(" + param1 + ", " + Param2 + ", " + Param3 + ")" )
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 11:10
por asimoes
Estou testando o FOR UPDATE colocando o controle de transação
Inicia a transação BeginTrans
Faz select com for update
...
Grava com update
Finaliza com CommitTrans
ou
RollBackTrans em caso de erro
Quando faz o execute e se aquele registro está com lock, o execute demora muito na resposta, no meu caso estou usando MariaDB
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 11:29
por JoséQuintas
asimoes escreveu:Quando faz o execute e se aquele registro está com lock, o execute demora muito na resposta
Provavelmente fica aguardando até que seja desbloqueado.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 14:54
por JoséQuintas
Fiz um teste no MariaDB e deu certo.
Código: Selecionar todos
CREATE PROCEDURE ze_test( DtInicial DATE, dtFinal DATE )
BEGIN
SELECT * FROM jpfinan WHERE fidatemi BETWEEN dtinicial AND dtfinal;
END
Falta testar no MySQL 5.6
Assim fica padrão pra qualquer coisa, inclusive SQLMIX.
Ainda não uso STORED PROCEDURE, mas quando usar vou preferir assim.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 15:01
por JoséQuintas
Só NÃO deu certo algo assim
Código: Selecionar todos
SELECT * FROM
(
CALL ze_test( '2021-01-01', '2021-06-01' )
) as b
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 15:26
por JoséQuintas
E consultando o fonte "create" no HeidiSQL, aparece assim:
Código: Selecionar todos
CREATE DEFINER=`jpatecnologia`@`%` PROCEDURE `ze_test`(
IN `DtInicial` DATE,
IN `dtFinal` DATE
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SELECT * FROM jpfinan WHERE fidatemi BETWEEN dtinicial AND dtfinal;
END
Por default, quem criou é quem pode usar, então fica vinculado ao usuário.
Dependendo do caso, só o administrador vai conseguir cadastrar uma procedure/function pra uso geral.
Isso pode complicar, conforme o caso...
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 17:14
por JoséQuintas
Esqueci de dizer:
Código: Selecionar todos
// Prepare the stored procedure
With Object oCmd := win_OleCreateObject("ADODB.Command")
:CommandText := "spMyStoredProcedure"
:CommandType := adCmdStoredProc
:CommandTimeout = 120 // default = 30 seconds
:parameters:append( :createParameter( 'cMarca', adVarChar, adParamInput, 1, 'V' ) )
:parameters:append( :createParameter( 'dtCotacao', adDate, adParamInput, 10, '2021-04-01' ) )
:parameters:append( :createParameter( 'cHrCotacao', adVarChar, adParamInput, 5, '00:00' ) )
:parameters:append( :createParameter( 'nIntervalo', adInteger, adParamInput, 4, 400 ) )
:ActiveConnection := oCn
End With
// Execute the stored procedure. This returns a recordset.
oRs := oCmd:Execute()
oCmd := NIL
Se entendi direito, tudo acima pode ser substituído por:
Código: Selecionar todos
cSQL := "call spMyStoredProcedure( 'V', '2021-04-01', '00:00', 400 )"
oRs := oCn:Execute( cSQL )
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 17:28
por JoséQuintas
Funciona também no MySQL 5.6
Falta o teste prático, porque nunca se sabe se o HeidiSQL faz alguma modificação nisso, como por exemplo a necessidade do DELIMITER que não faz parte do comando.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 17:39
por JoséQuintas
Faltou dizer:
A conexão também tem essa configuração de timeout.
Não sei o que acontece ao definir diferente nesse outro ADODB.Command, já que faz uso da conexão.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 21:15
por asimoes
Descobri,
FOR UPDATE NOWAIT
O NOWAIT, resposta imediata.
Como se define um tempo limite para o Execute
Enviado: 30 Abr 2021 23:07
por JoséQuintas
A tradução de NO WAIT é sem espera.
Ou atualiza pulando os bloqueados, ou apenas envia o comando sem esperar resposta.
Nos dois casos, acho que a atualização vai ser incompleta.
Como se define um tempo limite para o Execute
Enviado: 01 Mai 2021 02:01
por alxsts
Olá!
Vai pegar a última versão estável do registro. Se este registro estiver sendo atualização por outro processo, vai pegar sem as atualizações deste processo.
Using skip locked and nowait to handle hot rows