mysqlデータベースにプロシージャまたは関数が存在するかどうかを確認するにはどうすればよいですか?


18

mysqlデータベースにプロシージャまたは関数が存在するかどうかを確認するにはどうすればよいですか?ディスカバリーオプションはありますか?のようなshow procedures;(例えばのようなshow tables;

回答:



26

このタイプの質問に対する一般的な答えは、すべてのMySQLデータベースにはinformation_schemaと呼ばれるデータベースが含まれており、クエリ可能なテーブルとしてすべてのメタデータが含まれているということです。

必要な情報はROUTINESというテーブルにあります。例えば:

SELECT ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE 
       ROUTINE_TYPE="PROCEDURE" 
   AND ROUTINE_SCHEMA="dbname"
;

4
これは、OracleおよびSQL Serverでも機能します。ANSI標準の一部だと思います
コンラッドフリックス

1
これは権限の影響を受ける可能性があることに注意してください。表示するアクセス権がある手順のリストが表示されます。これにより、ある接続で部分的なリスト(より限定的なユーザー名を使用)を取得し、別の接続で別のリストを取得したとき、私は一時的に立ち去りました。
ジェフリーワイズマン

1

次の関数を使用します。

DELIMITER $$

DROP FUNCTION IF EXISTS f_exists_procedure;$$
CREATE FUNCTION f_exists_procedure(in_name VARCHAR(255))
RETURNS BIT DETERMINISTIC
BEGIN
    SELECT COUNT(1) INTO @f_result
    FROM information_schema.ROUTINES as info
    WHERE info.ROUTINE_SCHEMA = DATABASE() AND info.ROUTINE_TYPE = 'PROCEDURE' AND info.ROUTINE_NAME = in_name;

    RETURN @f_result;

END;$$

DELIMITER ;

1
これは少し複雑です。Gaiusの答えをご覧ください。
-dezso

0

Gaiusからの回答のスピンオフ

SELECT IF( COUNT(*) = 0, 'F' , 'T' ) AS ProcedureExists
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_SCHEMA = 'someDBName'
AND ROUTINE_TYPE = 'PROCEDURE'
AND UCASE(ROUTINE_NAME) = UCASE('someProcedureName');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.