Как я узнаю, существует ли процедура или функция в базе данных 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
Это немного сложно, см. Ответ Гая.
Дезсо

0

Выделить ответ от Гая

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');
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.