Wie finde ich heraus, ob eine Prozedur oder Funktion in einer MySQL-Datenbank vorhanden ist?

18

Wie finde ich heraus, ob eine Prozedur oder Funktion in einer MySQL-Datenbank vorhanden ist? und gibt es eine Entdeckungsmöglichkeit? wie ein show procedures;(zB wie show tables;)

Xenoterracid
quelle

Antworten:

26

Eine generische Antwort auf diese Art von Frage ist, dass alle MySQL-Datenbanken eine Datenbank mit dem Namen information_schema enthalten, die alle Metadaten als Tabellen enthält, die Sie nur abfragen können.

Die gewünschten Informationen befinden sich in einer Tabelle mit dem Namen ROUTINES . Beispielsweise:

SELECT ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE 
       ROUTINE_TYPE="PROCEDURE" 
   AND ROUTINE_SCHEMA="dbname"
;
Gaius
quelle
4
Dies funktioniert auch in Oracle und SQL Server. Ich denke, es ist Teil eines ANSI-Standards
Conrad Frix
1
Beachten Sie, dass dies durch Berechtigungen beeinflusst werden kann. Es wird eine Liste der Verfahren angezeigt, auf die Sie zugreifen können. Dies warf mich kurz aus, als ich eine Teilliste für eine Verbindung (unter Verwendung eines eingeschränkteren Benutzernamens) und eine andere Liste für eine andere Verbindung erhielt.
Geoffrey Wiseman
1

benutze die folgende Funktion:

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
quelle
1
Dies ist etwas zu kompliziert, siehe Gaius Antwort.
Dezso
0

Wirf die Antwort von Gaius ab

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
quelle