MariaDBで「CREATE FUNCTION DELIMITER doesn't work. has error near ''」エラーが発生した時の解決方法

2024-04-02

MariaDBで「CREATE FUNCTION DELIMITER doesn't work. has error near ''」エラーが発生する原因と解決方法

MariaDBでストアドファンクションを作成しようとすると、「CREATE FUNCTION DELIMITER doesn't work. has error near ''」というエラーが発生する場合があります。このエラーは、デリミタ設定に問題があることが原因です。

原因

このエラーが発生する主な原因は、以下の2つです。

  1. デリミタが正しく設定されていない
  2. デリミタが認識されない場所に設定されている

解決方法

デリミタの確認

まず、デリミタが正しく設定されていることを確認する必要があります。デフォルトのデリミタは;ですが、別の文字に設定することも可能です。デリミタを確認するには、以下のコマンドを使用します。

SHOW VARIABLES LIKE 'sql_mode';

出力結果にDELIMITERという項目があり、その後に設定されている文字がデリミタです。

デリミタの設定場所の確認

デリミタは、ストアドファンクションの定義の中で設定する必要があります。以下の例のように、CREATE FUNCTIONステートメントの後にDELIMITERキーワードとデリミタ文字を記述します。

CREATE FUNCTION my_function() RETURNS INT
DELIMITER $$
BEGIN
  RETURN 1;
END $$
DELIMITER ;

その他の解決方法

上記の方法で解決できない場合は、以下の方法も試してみてください。

  • MariaDBのバージョンを確認し、最新バージョンにアップデートする。
  • 使用しているクライアントソフトの設定を確認する。
  • エラーメッセージの詳細を確認し、問題箇所を特定する。

補足

  • デリミタは、ストアドファンクション内で使用する特殊文字を区別するために使用されます。
  • デリミタは、ストアドファンクションの定義内だけでなく、ストアドプロシージャの定義内でも使用できます。
  • デリミタは、セッションごとに設定されます。



-- デリミタを `//` に設定
DELIMITER //

-- ストアドファンクションを作成
CREATE FUNCTION my_function(a INT, b INT) RETURNS INT
BEGIN
  -- 引数の合計を返す
  RETURN a + b;
END //

-- デリミタを元に戻す
DELIMITER ;

-- ストアドファンクションを実行
SELECT my_function(1, 2);

このコードを実行すると、以下の結果が出力されます。

3

このサンプルコードでは、DELIMITERキーワードを使用してデリミタを//に設定しています。その後、CREATE FUNCTIONステートメントを使用して、my_functionという名前のストアドファンクションを作成しています。このストアドファンクションは、2つの整数を受け取り、その合計を返します。最後に、DELIMITERキーワードを使用してデリミタを元に戻しています。

  • 文字列の長さを返すストアドファンクション
CREATE FUNCTION my_function(s VARCHAR(255)) RETURNS INT
BEGIN
  -- 文字列の長さを返す
  RETURN LENGTH(s);
END
CREATE FUNCTION my_function() RETURNS DATETIME
BEGIN
  -- 現在の日時を返す
  RETURN CURRENT_TIMESTAMP();
END

ストアドファンクションは、さまざまな処理をデータベース内で実行するために使用できます。




MariaDBでストアドファンクションを作成するその他の方法

SQLyogなどのGUIツールを使用すると、GUI操作で簡単にストアドファンクションを作成できます。

MySQL Workbenchは、MySQLおよびMariaDBの管理ツールです。MySQL Workbenchを使用して、ストアドファンクションを作成することもできます。

事前に作成されたストアドファンクションを使用する

インターネット上には、さまざまなストアドファンクションが公開されています。これらのストアドファンクションをダウンロードして、自分のデータベースで使用することができます。

各方法のメリットとデメリット

方法メリットデメリット
CREATE FUNCTIONステートメントを使用する柔軟性が高い記述が複雑になる
GUIツールを使用する簡単操作ツールが必要
MySQL Workbenchを使用する機能が豊富インストールが必要
事前に作成されたストアドファンクションを使用する簡単導入必要な機能が必ずしも見つからない

mariadb


PDO、MySQL固有関数、エラーメッセージ、拡張機能、情報スキーマ:MariaDBとMySQLを判別する多様な手法

PDO ドライバを使用するPDO (PHP Data Objects) は、データベースとの接続と操作を簡潔に行うための拡張機能です。PDO ドライバを使用すると、データベースの種類に関係なく、同じコードでデータベースに接続できます。このコードでは、PDO::ATTR_DRIVER_NAME 属性を使用して、接続しているデータベースの種類を取得しています。...


SonarQubeとMariaDB 10のパフォーマンスチューニング:より高速な静的コード分析を実現

原因: MariaDB 10 のデフォルトの認証方式である caching_sha_256_password は、SonarQube が使用する mysql_native_password と互換性がありません。解決策:MariaDB 10 の認証方式を mysql_native_password に変更する。...


MySQL/MariaDBで列変更エラー「Cannot modify a column which is used as a foreign key reference」を解決する方法

これは、変更対象の列が参照制約(FOREIGN KEY)に参照されている場合に発生するエラーです。参照制約とは、あるテーブルの列が別のテーブルの列を参照する関係性を定義するものです。このエラーが発生する理由は、以下の2つです。データの一貫性保護: 列の型を変更すると、列の値の表現方法が変わります。そのため、参照制約を持つ列を変更すると、参照している側の列とのデータの一貫性が損なわれる可能性があります。...


MariaDBでREGEXP_SUBSTRが'pcre_exec: match limit exceeded'エラーを発生させる原因と解決策

MariaDBの REGEXP_SUBSTR 関数は、正規表現に基づいて文字列から部分一致を抽出する関数です。しかし、複雑な正規表現や長すぎる文字列を使用すると、pcre_exec: match limit exceeded エラーが発生することがあります。...


MariaDBでSET列を含むトリガーが動作しない問題を解決する2つの方法

MariaDBにおいて、SET列を含むテーブルに対してトリガーを設定する場合、予期しない動作が発生することがあります。具体的には、トリガー内でSET列の値を更新しようとすると、以下のエラーが発生する可能性があります。このエラーは、トリガーが実行される際に、SET列を含む同じテーブルが既に読み書きされていることが原因です。MariaDBは、トリガー内で同じテーブルを更新することを許可していないため、このエラーが発生します。...


SQL SQL SQL SQL Amazon で見る



MariaDBで関数作成エラーが発生?5つの解決策で徹底トラブルシューティング

MySQLからMariaDBへ移行した際に、関数作成エラーが発生することが稀にあります。このエラーは、MariaDBとMySQLの構文の違いが原因で発生することが多いです。本記事では、このエラーの原因と解決策について分かりやすく解説します。