Como descubro se existe um procedimento ou função em um banco de dados mysql?


18

Como descubro se existe um procedimento ou função em um banco de dados mysql? e existe alguma opção de descoberta? como um show procedures;(por exemplo, como show tables;)

Respostas:



26

Uma resposta genérica para esse tipo de pergunta é que todos os bancos de dados MySQL incluem um banco de dados chamado information_schema, que inclui todos os metadados como tabelas que você pode consultar.

As informações que você deseja estão em uma tabela chamada ROTINAS . Por exemplo:

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

4
Isso também funciona no Oracle e SQL Server. Eu acho que é parte de um padrão ANSI
Conrad Frix

1
Esteja ciente de que isso pode ser afetado pelas permissões - você verá a lista de procedimentos aos quais tem acesso. Isso me assustou brevemente quando recebi uma lista parcial em uma conexão (usando um nome de usuário mais limitado) e uma lista diferente em outra conexão.
Geoffrey Wiseman

1

use a seguinte função:

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
Isso é um pouco complicado demais, veja a resposta de Gaius.
Dezso

0

Spin Off da resposta 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');
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.