ホームページ  >  記事  >  データベース  >  Mysqlでのカスタム関数の作成と実行方法は何ですか

Mysqlでのカスタム関数の作成と実行方法は何ですか

WBOY
WBOY転載
2023-04-17 16:07:031520ブラウズ

    Mysql カスタム関数の作成と実行

    Students テーブルに id と name の 2 つのフィールドが含まれていると仮定し、関数を作成します。関数は ID 検索名に基づいています

    1. テーブルを作成し、データを挿入します

    create table students(id int,name varchar(100));
    insert into students(id,name) values(1,'annie'),(2,'bell'),(3,'danny');

    2. 関数を作成します

    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 データを変更するには

    • ##5 CONTAINS SQL には SQL ステートメントが含まれます

    • そこで、READS 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カスタム関数作成失敗問題

    Case

    現在プロジェクト内でmysqlを作成する関数を実行するとエラーが発生します。

    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)
    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

    これは、セキュリティ パラメータがオンになっていないためです。log_bin_trust_function_creators のデフォルト値は次のとおりです。 0 (関数の同期は許可されません)。このパラメータをオンにすると、作成は成功します。

    有効かどうかを確認します:

    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でのカスタム関数の作成と実行方法は何ですか

    以上がMysqlでのカスタム関数の作成と実行方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。