Maison >base de données >tutoriel mysql >Quelles sont les méthodes de création et d'exécution de fonctions personnalisées dans Mysql
Supposons que la table des étudiants contient deux champs, id et name, et créez une fonction. La fonction est de trouver un nom en fonction de l'id
create table students(id int,name varchar(100)); insert into students(id,name) values(1,'annie'),(2,'bell'),(3,'danny');
DELIMITER // create function find_student(id int) returns varchar(100) READS SQL DATA begin declare sname varchar(100) default ''; select students.name into sname from students where students.id=id; return sname; end // DELIMITER ;
:
1) Utilisez DELIMITER// pour modifier le délimiteur
Le symbole de fin d'instruction par défaut de MySQL est un point-virgule. , il exécutera automatiquement l'instruction actuelle. Étant donné que la définition de fonction contient plusieurs instructions SQL, utilisez DELIMITER // Définissez d'abord le séparateur sur //, puis redéfinissez le séparateur en point-virgule une fois l'instruction de création de fonction terminée.
2) LIT LES DONNÉES SQL
Je n'ai pas écrit cette phrase auparavant, mais MySQL a signalé une erreur lors de sa création, demandant le code d'erreur : 1418. Cette fonction n'a aucun DETERMINISTIC, NO SQL ou READS SQL DATA dans sa déclaration et la journalisation binaire est activée (vous souhaiterez peut-être utiliser la variable log_bin_trust_function_creators la moins sûre)
J'ai vérifié en ligne, ce qui signifie que le type de fonction mysql n'est pas déclaré :
mysql a bin-log activé, nous devons précisez si notre fonction De quel type s'agit-il :
1 DÉTERMINISTE Incertain
2 PAS DE SQL Il n'y a pas d'instruction SQL, et bien sûr elle ne modifiera pas les données
3 LIT LES DONNÉES SQL Il lit simplement les les données, et bien sûr, cela ne modifiera pas les données
4 MODIFIE LES DONNÉES SQL Pour modifier les données
5 CONTIENT SQL contient des instructions SQL
J'ai donc ajouté READS SQL DATA
3) Utiliser des variables locales
Définition de la variable : j'utilise declare sname varchar(100) default ‘’; pour définir la variable locale sname
Utilisation de la variable :
Vous pouvez utiliser select Students.name dans sname from Students. où étudiants.id=id; pour attribuer une valeur à la variable
Vous pouvez également utiliser directement l'instruction set pour attribuer des valeurs, telles que set sname=‘test’
select find_student(3);
Actuellement, dans le projet, une erreur s'est produite lors de l'exécution de la fonction qui a créé mysql. Le message d'erreur pour la fonction de création mysql est le suivant :
Causé par : java.sql.SQLException : cette fonction n'a aucun DETERMINISTIC, NO SQL ou READS SQL DATA dans sa déclaration et la journalisation binaire est activée (vous *pourriez* vouloir utiliser la variable log_bin_trust_function_creators la moins sûre)sur com.mysql.jdbc. SQLError.createSQLException(SQLError.java:965)sur com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO. java:3976)
Cela est dû au fait qu'un paramètre de sécurité n'est pas activé. ce qui ne permet pas la synchronisation des fonctions. Si ce paramètre est activé, la création sera réussie.
sur com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
sur com. mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
sur com.mysql.jdbc MysqlIO readAllResults(MysqlIO.java:2373)
sur com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739).
sur com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)
sur com mysql.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
sur com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl. java:845)
sur com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
.. 35 de plus
Vérifiez s'il est activé :
show variables like '%func%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin_trust_function_creators | ON | +---------------------------------+-------+ 1 row in set (0.00 sec)
S'il est activé, cela signifie qu'il est activé.
set global log_bin_trust_function_creators = 1;
peut être défini via cette commande, mais il deviendra invalide après le redémarrage de MySQL.
La dernière étape consiste à modifier le fichier de configuration de la base de données MySQL
Configurez log_bin_trust_function_creators=1 dans [mysqld] du fichier de configuration /etc/my.cnf
Redémarrez MySQL après modification.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!