6

필자는 재귀 적으로 자체를 호출하는 저장된 FUNCTION을 작성했습니다.MySQL은 재귀 함수를 지원하지 않습니까? 왜? 언제부터?

Error: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION)

Message: Recursive stored functions and triggers are not allowed.

"허용되지 않음"나는 쿼리를 실행할 때

그러나 나는이 뻔뻔한 오류가?
오른쪽. 우리가 그것에있는 동안 우리는 단지 WHILE 루프도 비활성화하지 않는 것이 어떻습니까?

어떤 방식 으로든 재귀 함수를 사용할 수 있습니까?
bug report가 발견되었지만 해결 방법이 있습니까?
Windows XP (XAMPP 서버)에서 MySQL 5.1.41을 실행 중입니다.

+2

데이터베이스는 프로그래밍이 아닌 데이터를 검색하기위한 것입니다. 응용 프로그램 대신 저장 프로 시저에서 복잡하고 예측하기 어렵거나 최적화하기 어려운 논리를 수행하려는 몇 가지 이유가 있습니까? – Borealid

+0

http://stackoverflow.com/questions/3438111/mysql-stored-procedure-that-calles-itself-reursively – Novemberland

+1

뻔뻔한 오류! 재귀 함수를 사용할 수있는 방법이 있습니다. MySQL 코드를 수정해야 작동합니다. –

답변

3

아무런 문제가 없습니다. Jenco. 그리 PostgreSQL의 기능을 효율적뿐만 아니라 MySQL의 절차에 가능 :

DELIMITER $$ 
DROP PROCEDURE IF EXISTS test.factorial_proc$$ 
CREATE PROCEDURE test.factorial_proc 
(
    IN n BIGINT, 
    OUT res BIGINT 
) 
BEGIN 
    SET max_sp_recursion_depth=10; 
    IF n >= 2 THEN 
    CALL test.factorial_proc (n-1, res); 
    SELECT n * res INTO res; 
    ELSE 
    SELECT n INTO res; 
    END IF; 
END$$ 
DELIMITER ; 

[test]> CALL test.factorial_proc (5, @res); 
[test]> CALL test.factorial_proc (5, @res1); 
[test]> select @res * @res1; 
+--------------+ 
| @res * @res1 | 
+--------------+ 
|  14400 | 
+--------------+ 

세르게이 Zaytsev.

4

MySQL 5.1은 재귀 저장 프로 시저를 지원하지만 재귀 함수는 지원하지 않습니다. docs 인용 : MySQL은 그 스레드를 '스택 크기를 제한 할 필요가 있기 때문에 저장 루틴에서

Stored functions cannot be recursive.

Recursion in stored procedures is permitted but disabled by default. To enable recursion, set the max_sp_recursion_depth server system variable to a value greater than zero. Stored procedure recursion increases the demand on thread stack space. If you increase the value of max_sp_recursion_depth , it may be necessary to increase thread stack size by increasing the value of thread_stack at server startup.

+0

반환 값을 기대하는 자체를 호출하는 재귀 메서드가 있기 때문에 나는 여전히 FUNCTIONS를 사용하는 솔루션을 원합니다. 프로 시저를 사용하면 내가 할 수있는 방법이 없습니다 ... 그럴 수 있습니까? –

+1

@Jenko : 재귀를 사용하여 수행 할 수있는 모든 작업은 반복을 사용하여 다시 작성할 수 있습니다. http://stackoverflow.com/questions/931762/can-every-recursion-be-converted-into-iteration –

3

아마 재귀가 좋습니다.

MySQL은 일반적으로 연결 당 하나의 스레드를 사용합니다. 100s 또는 1000s의 연결이 일반적입니다.

32 비트 플랫폼에서는 1,000 개의 스레드를 실행할 때 상당한 주소 공간 압력이 있으므로 주소 공간이 소모되지 않도록 스택을 매우 작게 설정해야합니다.

스택 오버플로는 물론 매우 위험합니다. 안전하게 복구 할 수 없습니다. 따라서 MySQL은 특히 32 비트 플랫폼에서 스택 오버플로를 방지하기 위해이 작업을 수행합니다.

즉, 현재 프로덕션 MySQL 서버용으로 32 비트 OS를 사용하는 사람은 모두 미친입니다.

+0

"스택 오버플로는 물론입니다. , 아주 나쁜 - 그것은 안전하게 회복 될 수 없습니다. "이것은 완전히 잘못되었습니다. 모든 합리적인 상위 레벨 프로그래밍 언어는 Java, Perl, Python 등과 같은 스택 오버플로에서 안전하게 복구 할 수 있습니다. – intgr