Comment savoir si une procédure ou une fonction existe dans une base de données mysql?

18

Comment savoir si une procédure ou une fonction existe dans une base de données mysql? et y a-t-il une option de découverte? comme un show procedures;(par exemple comme show tables;)

xénoterracide
la source

Réponses:

26

Une réponse générique à ce type de question est que toutes les bases de données MySQL incluent une base de données appelée information_schema qui inclut toutes les métadonnées sous forme de tables que vous pouvez simplement interroger.

Les informations souhaitées se trouvent dans un tableau appelé ROUTINES . Par exemple:

SELECT ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE 
       ROUTINE_TYPE="PROCEDURE" 
   AND ROUTINE_SCHEMA="dbname"
;
Gaius
la source
4
Cela fonctionne également dans Oracle et SQL Server. Je pense que cela fait partie d'une norme ANSI
Conrad Frix
1
Sachez que cela peut être affecté par les autorisations - vous verrez la liste des procédures auxquelles vous avez accès. Cela m'a brusquement interrompu lorsque j'ai obtenu une liste partielle sur une connexion (en utilisant un nom d'utilisateur plus limité) et une liste différente sur une autre connexion.
Geoffrey Wiseman
1

utilisez la fonction suivante:

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 ;
sassman
la source
1
C'est un peu trop compliqué, voir la réponse de Gaius.
dezso
0

Spin Off de la réponse de 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');
user2242225
la source