Làm cách nào để tìm hiểu xem một thủ tục hoặc hàm có tồn tại trong cơ sở dữ liệu mysql không?


18

Làm cách nào để tìm hiểu xem một thủ tục hoặc hàm có tồn tại trong cơ sở dữ liệu mysql không? và có bất kỳ lựa chọn khám phá? như một show procedures;(ví dụ như show tables;)

Câu trả lời:



26

Một câu trả lời chung cho loại câu hỏi này là tất cả các cơ sở dữ liệu MySQL bao gồm một cơ sở dữ liệu gọi là information_schema bao gồm tất cả các siêu dữ liệu dưới dạng bảng mà bạn có thể truy vấn.

Thông tin bạn muốn có trong một bảng có tên ROUTINES . Ví dụ:

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

4
Điều này cũng hoạt động trong Oracle và SQL Server. Tôi nghĩ đó là một phần của tiêu chuẩn ANSI
Conrad Frix

1
Xin lưu ý rằng điều này có thể bị ảnh hưởng bởi các quyền - bạn sẽ thấy danh sách các quy trình mà bạn có quyền truy cập để xem. Điều này đã loại bỏ tôi một thời gian ngắn khi tôi có một danh sách một phần trên một kết nối (sử dụng tên người dùng hạn chế hơn) và một danh sách khác trên một kết nối khác.
Geoffrey Wiseman

1

sử dụng chức năng sau:

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
Đây là một chút quá phức tạp, xem câu trả lời của Gaius.
dezso

0

Quay lại câu trả lời từ 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');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.