ホームページ >データベース >mysql チュートリアル >Mysqlでのカスタム関数の作成と実行方法は何ですか
Students テーブルに id と name の 2 つのフィールドが含まれていると仮定し、関数を作成します。関数は 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) デリミタを変更するには DELIMITER// を使用します
Mysql のデフォルトのステートメント終了記号はセミコロンです。mysql がセミコロンを検出すると、現在のステートメントが自動的に実行されます。関数定義には複数の SQL ステートメントが含まれているため、最初に DELIMITER // を使用して区切り文字を // に設定し、関数作成ステートメントが完了したら区切り文字をセミコロンに戻します。
2) READS SQL DATA
この文は以前に書きませんでしたが、作成時に mysql がエラーを報告し、エラー コード: 1418 が表示されました。この関数の宣言には DETERMINISTIC、NO SQL、または READS SQL DATA のいずれも含まれておらず、バイナリ ログが有効になっています (安全性の低い log_bin_trust_function_creators 変数を使用することをお勧めします)
オンラインで確認したところ、次のことが意味されます。 mysql 関数が宣言されていません タイプ:
mysql は bin-log をオンにします。関数のタイプを指定する必要があります:
1 DETERMINISTIC Uncertain
2 NO SQL SQL ステートメントはありません。もちろんデータは変更されません。
3 READS SQL DATA データを読み取るだけです。もちろん変更されます。データは変更しないでください
4 MODIFIES SQL DATA データを変更するには
3) ローカル変数を使用します
変数定義:declare sname varchar(100) を使用します。デフォルト ‘ ’;ローカル変数 sname が定義されています。変数の使用法:
select students.name into sname from students where students.id= を使用できます。 id; 変数に値を割り当てる また、set sname=‘test’3 のように、set ステートメントを直接使用して値を割り当てることもできます。関数の実行: 関数名を選択します。 (パラメータ値);select find_student(3);
Mysql 作成関数のエラー メッセージは次のとおりです:
原因: java.sql.SQLException: この関数には、宣言とバイナリ ログに DETERMINISTIC、NO SQL、または READS SQL DATA のいずれもありません。が有効になっています (安全性の低い log_bin_trust_function_creators 変数を使用することもできます)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)at com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:3976)
これは、セキュリティ パラメータがオンになっていないためです。log_bin_trust_function_creators のデフォルト値は次のとおりです。 0 (関数の同期は許可されません)。このパラメータをオンにすると、作成は成功します。
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2373)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2739)
で com.mysql.jdbc.ConnectionImpl.execSQL( ConnectionImpl.java:2482)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2440)
com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
... 35 more
有効かどうかを確認します:
show variables like '%func%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin_trust_function_creators | ON | +---------------------------------+-------+ 1 row in set (0.00 sec)
オンの場合、有効であることを意味します。
set global log_bin_trust_function_creators = 1;
はこのコマンドで設定できますが、MySQL が有効になると無効になります。再開した。
MySQL データベースの構成ファイルを変更することで、最終的にすべてが完了します。
[mysqld] 構成ファイル /etc/my.cnf
# で log_bin_trust_function_creators=1 を構成します。
#変更後に MySQL を再起動します。
以上がMysqlでのカスタム関数の作成と実行方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。