답변:
저장 함수를 사용하면 저장 프로 시저를 일반 SQL과 혼합 할 수 없습니다.
예를 들어 프로 시저 인 SELECT get_foo(myColumn) FROM mytable
경우에는 유효 get_foo()
하지 않지만 get_foo()
함수 인 경우이를 수행 할 수 있습니다 . 가격은 기능이 절차보다 더 많은 한계가 있다는 것입니다.
프로 시저와 함수의 가장 일반적인 차이점은 서로 다르게 그리고 다른 목적으로 호출된다는 것입니다.
루틴 작성 구문은 프로 시저 및 기능에서 약간 다릅니다.
함수는 값을 반환하므로 함수 정의에 RETURNS 절이 있어야 반환 값의 데이터 유형을 나타냅니다. 또한 호출자에게 값을 리턴하려면 함수 본문 내에 최소한 하나의 RETURN 문이 있어야합니다. RETURNS 및 RETURN은 프로 시저 정의에 나타나지 않습니다.
저장 프로 시저를 호출하려면을 사용하십시오 CALL statement
. 저장된 함수를 호출하려면 표현식에서 참조하십시오. 이 함수는 식 평가 중에 값을 반환합니다.
프로시 저는 CALL 문을 사용하여 호출되며 출력 변수를 사용하는 값만 전달할 수 있습니다. 함수는 다른 함수처럼 (즉, 함수 이름을 호출하여) 명령문 내부에서 호출 될 수 있으며 스칼라 값을 리턴 할 수 있습니다.
매개 변수를 IN, OUT 또는 INOUT으로 지정하면 PROCEDURE에만 유효합니다. FUNCTION의 경우 매개 변수는 항상 IN 매개 변수로 간주됩니다.
매개 변수 이름 앞에 키워드가 없으면 기본적으로 IN 매개 변수입니다. 저장된 기능의 매개 변수 앞에는 IN, OUT 또는 INOUT이 없습니다. 모든 기능 매개 변수는 IN 매개 변수로 취급됩니다.
스토어드 프로 시저 또는 함수를 정의하려면 각각 CREATE PROCEDURE 또는 CREATE FUNCTION을 사용하십시오.
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
함수가 아닌 저장 프로 시저의 MySQL 확장은 프로 시저가 결과 세트 또는 여러 결과 세트를 생성 할 수 있으며, 호출자는 SELECT 문의 결과와 동일한 방식으로 처리합니다. 그러나 이러한 결과 집합의 내용을 식에 직접 사용할 수는 없습니다.
저장 루틴 (저장 프로 시저 및 저장 함수 모두 참조) 은 테이블 또는 뷰와 같이 특정 데이터베이스와 연결됩니다. 데이터베이스를 삭제하면 데이터베이스에 저장된 모든 루틴도 삭제됩니다.
저장 프로 시저와 함수는 동일한 네임 스페이스를 공유하지 않습니다. 데이터베이스에서 동일한 이름을 가진 프로 시저와 함수를 가질 수 있습니다.
저장 프로 시저에서는 동적 SQL을 사용할 수 있지만 함수 나 트리거에는 사용할 수 없습니다.
SQL 준비 명령문 (PREPARE, EXECUTE, DEALLOCATE PREPARE)은 스토어드 프로 시저에서 사용될 수 있지만 스토어드 기능이나 트리거는 사용할 수 없습니다. 따라서, 저장된 함수 및 트리거는 동적 SQL을 사용할 수 없습니다 (여기서 명령문을 문자열로 구성한 후 실행). (MySQL 저장 루틴의 동적 SQL)
FUNCTION과 STORED PROCEDURE의 흥미로운 차이점은 다음과 같습니다.
( 이 시점은 블로그 포스트에서 복사 한 것 입니다. ) 저장 프로시 저는 기능이없는 미리 컴파일 된 실행 계획입니다. 함수 런타임에 구문 분석 및 컴파일되었습니다. 저장 프로 시저, 데이터베이스에 의사 코드 (예 : 컴파일 된 형식)로 저장됩니다.
( 이 시점에 대해서는 잘 모르겠습니다. )
저장 프로 시저에는 보안이 있으며 네트워크 트래픽이 줄어들며 저장 프로 시저를 아무 때나 호출 할 수 있습니다. 한 번에 응용 프로그램의. 참고
함수는 일반적으로 비즈니스 로직을 실행하기 위해 프로 시저가 사용되는 계산에 사용됩니다.
함수 데이터베이스 상태에 영향을 줄 수 없음 (명시 적 또는 암시 적 커밋 또는 롤백을 수행하는 명령문은 함수에서 허용되지 않습니다.) 저장 프로시 저는 커밋 등을 사용하여 데이터베이스 상태에 영향을 줄 수 있습니다. 참조
: J.1. 저장된 루틴 및 트리거에 대한 제한 사항
함수는 FLUSH 문을 사용할 수 없지만 저장 프로시 저는 사용할 수 있습니다.
저장 함수는 재귀적일 수 없지만 저장 프로시 저는 재귀 적입니다. 참고 : 재귀 저장 프로시 저는 기본적으로 비활성화되어 있지만 max_sp_recursion_depth 서버 시스템 변수를 0이 아닌 값으로 설정하여 서버에서 활성화 할 수 있습니다. 자세한 정보는 5.2.3 절.“시스템 변수” 를 참조하십시오.
저장된 함수 또는 트리거 내에서 함수 또는 트리거를 호출 한 명령문에 의해 이미 사용중인 (읽기 또는 쓰기) 테이블을 수정할 수 없습니다. 좋은 예 : MYSQL에서 삭제시 동일한 테이블을 업데이트하는 방법은 무엇입니까?
참고 : 일부 제한 사항은 일반적으로 저장 함수 및 트리거에는 적용되지만 저장 프로 시저에는 적용되지 않지만 저장 함수 또는 트리거 내에서 호출 된 경우 저장 프로 시저에는 이러한 제한이 적용됩니다. 예를 들어, 저장 프로 시저에서 FLUSH를 사용할 수 있지만 저장 함수 나 트리거에서 이러한 저장 프로 시저를 호출 할 수 없습니다.
한 가지 중요한 차이점은 SQL 쿼리에 함수 를 포함 할 수 있지만 저장 프로시 저는 다음 CALL
명령문으로 만 호출 할 수 있다는 것입니다 .
UDF 예 :
CREATE FUNCTION hello (s CHAR(20))
RETURNS CHAR(50) DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');
SELECT hello(name) FROM names;
+--------------+
| hello(name) |
+--------------+
| Hello, Bob! |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)
절차 예 :
delimiter //
CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)
delimiter ;
CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World! |
+---------------------------+
1 row in set (0.00 sec)
RETURNS CHAR(50) DETERMINISTIC
?
RETURNS CHAR(50)
데이터의 입력 한 내용 상태가 반환됩니다. 은 RETURN CONCAT(...
반환되는 데이터입니다. 둘 다 필요합니다. 은 DETERMINISTIC
기본 데이터가 수정되지 않습니다 상태로 필요합니다.