3
respostas

erro aqo criar a função da aula - undeclared variavel

Olá, gostaria de saber onde estou errando, eu transcrevi o código escrito pelo prof deu o Undeclared variavel e se eu tentar copiar e colar o código, do Consolidando conhecimento que há algumas diferenças em relação ao código da aula também ocorre erro.

========================

Com código contido na aula , seguinte erro:

Operation failed: There was an error while applying the SQL script to the database. Executing: USE sucos_vendas; DROP function IF EXISTS f_numero_aleatorio;

DELIMITER $$ USE sucos_vendas$$ CREATE FUNCTION f_numero_aleatorio (min int, max int)

RETURNS INTEGER BEGIN declare vRetorno int; SELECT floor(( RAND()* (max-min + 1)) + min) into vreturno; return vretorno; END$$

DELIMITER ;

ERROR 1327: Undeclared variable: vreturno SQL Statement: CREATE FUNCTION f_numero_aleatorio (min int, max int)

RETURNS INTEGER BEGIN declare vRetorno int; SELECT floor(( RAND()* (max-min + 1)) + min) into vreturno; return vretorno; END

========================

Com código contido no Consolidando conhecimento, seguinte erro:

Executing: USE sucos_vendas;

DROP function IF EXISTS f_numero_aleatorio;

DELIMITER $$

USE sucos_vendas$$

CREATE FUNCTION f_numero_aleatorio(min INT, max INT) RETURNS int(11)

BEGIN

DECLARE vRetorno INT;

SELECT FLOOR((RAND() * (max-min+1)) + min) INTO vRetorno;

RETURN vRetorno;

END$$

DELIMITER ;

Operation failed: There was an error while applying the SQL script to the database. ERROR 1418: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable) SQL Statement: CREATE FUNCTION f_numero_aleatorio(min INT, max INT) RETURNS int(11)

BEGIN

DECLARE vRetorno INT;

SELECT FLOOR((RAND() * (max-min+1)) + min) INTO vRetorno;

RETURN vRetorno;

END

3 respostas

Olá Thiego, tudo bem? Esse erro que está acontecendo no primeiro código, provavelmente é por os nomes estão diferentes, note que na linha:

declare vRetorno int;

Você declarou a váriavel com o "R" maiúsculo, no caso "vRetorno", já nas linhas seguintes em que você faz o uso dessa variável você usa com o "R" minusculo, no caso "vreturno":

SELECT floor(( RAND()* (max-min + 1)) + min) into vreturno; 
return vretorno;

Então deixa ambas com "R" maiúsculo: vRetorno. O código completo deve ser:

CREATE FUNCTION `f_numero_aleatorio_admin`(min INT, max INT) RETURNS int(11)
BEGIN
DECLARE vRetorno INT;
    SELECT FLOOR((RAND() * (max - min + 1) + min)) INTO vRetorno;
RETURN vRetorno;
END

Porém você ainda pode encontrar o erro:

Operation failed: There was an error while applying the SQL script to the database. ERROR 1418: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

Para resolver você precisa executar o seguinte comando de forma isolada:

SET GLOBAL log_bin_trust_function_creators = 1;

E fala se funcionou!

Realmente pesquisando em forum encontrei esta solução que você disse acima, mas não encontrei uma explicação. Você poderia explicar porque este erro ocorre as vezes ? Para na prox eu saber quado/como corrigir.

Certo Thiego! Bem essa configuração diz respeito aos logs binários do MySQL, e isso geralmente é fundamental quando criamos ou restauramos bancos de dados com Procedures, ou funções, porque elas podem resultar em dados diferentes de saída mesmo usando os mesmos dados de entrada, e quando indicamos log_bin_trust_function_creators = 1 estamos deixando explicito para o MySQL que ele não precisa se preocupar com essas rotinas e funções e que vão elas vão sempre gerar os resultados esperados.

Espero ter esclarecido sua dúvida!