Xem định nghĩa thủ tục / hàm được lưu trữ trong MySQL


79

Lệnh MySQL để xem định nghĩa của một thủ tục hoặc hàm được lưu trữ, tương tự như sp_helptexttrong Microsoft SQL Server là gì?

Tôi biết điều đó SHOW PROCEDURE STATUSsẽ hiển thị danh sách các thủ tục có sẵn. Tôi cần xem định nghĩa của một thủ tục.


2
CHỌN * FOM mysql.proc \ G;
zloctb

Câu trả lời:


123
SHOW CREATE PROCEDURE <name>

Trả về văn bản của một thủ tục được lưu trữ đã xác định trước đó đã được tạo bằng CREATE PROCEDUREcâu lệnh. Trao đổi PROCEDUREcho FUNCTIONmột chức năng được lưu trữ.


tôi đang nhận được#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Govind Singh

+1 Điều này đã giúp tôi ba lần bây giờ. Một trong những ngày này tôi sẽ ghi nhớ mệnh lệnh đó.
Người dùng đã đăng ký

3
Điều này sẽ không hoạt động trừ khi Mysql được biên dịch --with-debug. Vì vậy, nó không hoạt động trên các phiên bản AWS RDS. Hãy thử hiển thị thủ tục tạo 'xxxx'; như @valli dưới đây
ChrisR

39

Bạn có thể sử dụng cái này:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";

9
Rất tiếc, ROUTINE_DEFINITION không bao gồm các tham số IN / OUT của thủ tục được lưu trữ cũng như các giá trị trả về (trong khi SHOW CREATE PROCEDURE thì có). Nếu bạn muốn lấy những thứ đó, bạn có thể truy vấn thẳng vào mysql.proc, ví dụ: SELECT param_list, return, body FROM mysql.proc WHERE db = 'yourdb' AND type = 'PROCEDURE' và name = 'procedurename';
GregW

@GregW truy vấn mà từ mysql.proclợi nhuận blobs cho param_list, returnsbody... tôi không thể đọc chúng ... Làm sao bạn làm điều đó?
Dmitry Efimenko

nvm, tìm thấy câu trả lời ở đây
Dmitry Efimenko

2
Hãy lưu ý rằng ROUTINE_DEFINITION sẽ rỗng nếu người dùng đang chạy truy vấn không phải là DEFINER và bảo mật được đặt thành DEFINER. Bạn sẽ không gặp sự cố nếu bảo mật được đặt thành INVOKER. Bạn cũng có thể nhận được các thông số từ SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='$dbName' AND SPECIFIC_NAME=\"{$row['ROUTINE_NAME']}\" AND NOT PARAMETER_MODE IS NULL ORDER BY ORDINAL_POSITION;
Peter Brand

Sửa, ngay cả khi bảo mật được đặt thành INVOKER, định nghĩa sẽ vô hiệu nếu người dùng chạy truy vấn không giống với trình định nghĩa.
Peter Brand,

10

Nếu bạn muốn biết danh sách các thủ tục, bạn có thể chạy lệnh sau:

show procedure status;

Nó sẽ cung cấp cho bạn danh sách các thủ tục và bộ định nghĩa của chúng Sau đó, bạn có thể chạy show create procedure <procedurename>;


9
SHOW CREATE PROCEDURE proc_name;

trả về định nghĩa của proc_name


Điều này cũng không hiển thị văn bản của thủ tục.
posfan 12

7

Bạn có thể sử dụng bảng proc trong cơ sở dữ liệu mysql :

mysql> SELECT body FROM mysql.proc
WHERE db = 'yourdb' AND name = 'procedurename' ;

Lưu ý rằng bạn phải có một khoản trợ cấp cho lựa chọn đối với mysql.proc :

mysql> GRANT SELECT ON mysql.proc TO 'youruser'@'yourhost' IDENTIFIED BY 'yourpass' ;

5

cái gì đó như:

DELIMITER //

CREATE PROCEDURE alluser()
BEGIN
   SELECT *
   FROM users;
END //

DELIMITER ;

hơn:

SHOW CREATE PROCEDURE alluser

cho kết quả:

'alluser', 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER', 'CREATE DEFINER=`root`@`localhost` PROCEDURE `alluser`()
BEGIN
   SELECT *
   FROM users;
END'

3

Một giải pháp nhanh chóng và hack thay thế nếu bạn muốn có cái nhìn tổng quan về tất cả các sản phẩm ở đó hoặc gặp phải vấn đề chỉ nhận được tiêu đề thủ tục được hiển thị bởi SHOW CREATE PROCEDURE:

mysqldump --user=<user> -p --no-data --routines <database>

Nó cũng sẽ xuất các mô tả bảng, nhưng không có dữ liệu. Hoạt động tốt để đánh hơi xung quanh các lược đồ chưa biết hoặc đã quên ...;)


-2

Tuyệt vời, hãy thử nó:

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_SCHEMA = 'yourdb' AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = "procedurename";

2
Chào mừng đến với SE! Vui lòng giải thích câu trả lời của bạn, đặc biệt là liên quan đến điều gì khác biệt với câu trả lời hiện có khác.
anderas
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.