MySQL에서 저장 프로 시저 / 함수 정의보기


79

sp_helptextMicrosoft SQL Server 와 유사한 저장 프로 시저 또는 함수의 정의를 보는 MySQL 명령은 무엇입니까 ?

SHOW PROCEDURE STATUS사용 가능한 절차 목록이 표시 된다는 것을 알고 있습니다. 단일 절차의 정의를 확인해야합니다.


2
SELECT * FOM mysql.proc \ G;
zloctb

답변:


123
SHOW CREATE PROCEDURE <name>

CREATE PROCEDURE문을 사용하여 만든 이전에 정의 된 저장 프로 시저의 텍스트를 반환합니다 . 스왑 PROCEDURE에 대한 FUNCTION저장 기능.


내가 받고 #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
있어요

+1 이제 세 번이나 도움이되었습니다. 언젠가는 그 명령을 마음으로 기억할 것입니다.
등록 된 사용자

3
Mysql이 --with-debug로 컴파일되지 않으면 작동하지 않습니다. 따라서 AWS RDS 인스턴스에서는 작동하지 않습니다. show create 절차 'xxxx'를 시도하십시오. 아래 @valli로
ChrisR

39

이것을 사용할 수 있습니다 :

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

9
불행히도 ROUTINE_DEFINITION은 저장 프로 시저의 IN / OUT 매개 변수 나 반환 값을 포함하지 않습니다 (SHOW CREATE PROCEDURE는 포함). 이를 얻으려면 mysql.proc에 대해 직접 쿼리 할 수 ​​있습니다. 예를 들어 SELECT param_list, returns, body FROM mysql.proc WHERE db = 'yourdb'AND type = 'PROCEDURE'및 name = 'procedurename';
GregW 2011

에서 해당 쿼리를 @GregW mysql.proc에 대한 반환 모양 param_list, returns그리고 body... 난 ... 당신이 그것을 어떻게 읽을 수없는 짓을 해요?
Dmitry Efimenko 2015 년

NVM 발견 대답 여기
드미트리 에피 멘코

2
쿼리를 실행하는 사용자가 DEFINER가 아니고 보안이 DEFINER로 설정된 경우 ROUTINE_DEFINITION은 null이됩니다. 보안이 INVOKER로 설정되어 있으면 문제가 없습니다. 매개 변수를 가져올 수도 있습니다 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

정정, 보안이 INVOKER로 설정되어 있어도 쿼리를 실행하는 사용자가 정의 자와 동일하지 않으면 정의가 널이됩니다.
Peter Brand

10
SHOW CREATE PROCEDURE proc_name;

정의를 반환합니다. proc_name


이것은 절차의 텍스트도 표시하지 않습니다.
posfan12

나를 위해 작동합니다. AWS / RDS 서버리스를 사용하고 있습니다. Proc 텍스트는 Create Procedure 열을 표시합니다.
KingAndrew

10

절차 목록을 알고 싶다면 다음 명령을 실행할 수 있습니다.

show procedure status;

프로 시저 및 해당 정의 자 목록을 제공합니다. 그런 다음 show create procedure <procedurename>;


7

mysql 데이터베이스에서 table proc 을 사용할 수 있습니다 .

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

mysql.proc에 대한 선택 권한이 있어야합니다 .

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

5

같은 것 :

DELIMITER //

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

DELIMITER ;

보다:

SHOW CREATE PROCEDURE alluser

결과를 제공합니다.

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

3

모든 절차에 대한 개요를 얻거나 SHOW CREATE PROCEDURE에 표시된 절차 헤더 만 가져 오는 문제에 직면 한 경우 신속하고 해킹 된 대안 솔루션 :

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

테이블 설명도 내보내지만 데이터는 내 보내지 않습니다. 알 수 없거나 잊혀진 스키마를 스니핑하는 데 적합합니다 ...;)


-2

완벽합니다.

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

2
SE에 오신 것을 환영합니다! 귀하의 답변, 특히 기존의 다른 답변과 다른 점에 대해 설명해주십시오.
anderas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.