Bir yordamın veya işlevin mysql veritabanında olup olmadığını nasıl öğrenebilirim?


18

Bir yordamın veya işlevin mysql veritabanında olup olmadığını nasıl öğrenebilirim? ve herhangi bir keşif seçeneği var mı? gibi show procedures;(örneğin gibi show tables;)

Yanıtlar:



26

Bu tür sorulara verilen genel bir yanıt, tüm MySQL veritabanlarının sorgulayabileceğiniz tablolar olarak tüm meta verileri içeren information_schema adlı bir veritabanı içermesidir.

İstediğiniz bilgiler, ROUTINES adlı bir tabloda yer almaktadır . Örneğin:

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

4
Bu ayrıca Oracle ve SQL Server'da da çalışır. Bence bir ANSI standardının bir parçası
Conrad Frix

1
Bunun izinlerden etkilenebileceğini unutmayın; görmek için erişim iznine sahip olduğunuz prosedürlerin listesini göreceksiniz. Bir bağlantıda kısmi bir liste (daha sınırlı bir kullanıcı adı kullanarak) ve başka bir bağlantıda farklı bir liste aldığımda bu beni kısa bir süre için attı.
Geoffrey Wiseman

1

aşağıdaki işlevi kullanı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 ;

1
Bu biraz fazla karmaşık, bkz. Gaius'un cevabı.
dezso

0

Gaius'un cevabını çevir

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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.