¿Cómo puedo saber si existe un procedimiento o función en una base de datos mysql?

18

¿Cómo puedo saber si existe un procedimiento o función en una base de datos mysql? y hay alguna opción de descubrimiento? como un show procedures;(por ejemplo, como show tables;)

xenoterracida
fuente

Respuestas:

26

Una respuesta genérica a este tipo de preguntas es que todas las bases de datos MySQL incluyen una base de datos llamada information_schema que incluye todos los metadatos como tablas que puede consultar.

La información que desea está en una tabla llamada RUTINAS . Por ejemplo:

SELECT ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE 
       ROUTINE_TYPE="PROCEDURE" 
   AND ROUTINE_SCHEMA="dbname"
;
Gayo
fuente
44
Esto también funciona en Oracle y SQL Server. Creo que es parte de un estándar ANSI
Conrad Frix
1
Tenga en cuenta que esto puede verse afectado por los permisos: verá la lista de procedimientos a los que tiene acceso. Esto me desconcertó brevemente cuando obtuve una lista parcial en una conexión (usando un nombre de usuario más limitado) y una lista diferente en otra conexión.
Geoffrey Wiseman
1

use la siguiente función:

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
fuente
1
Esto es un poco complicado, vea la respuesta de Gaius.
dezso
0

Spin Off de la respuesta 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');
usuario2242225
fuente