MySQL 저장 프로 시저 대 함수, 언제 사용합니까?


160

MySQL 저장 프로 시저 및 기능을보고 있습니다. 실제 차이점은 무엇입니까?

그것들은 비슷해 보이지만 기능에는 더 많은 한계가 있습니다.

아마 틀렸을 지 모르지만 저장 프로 시저는 모든 것을 할 수 있으며 저장 함수는 더 많은 것을 할 수 있습니다. 왜 프로 시저와 함수를 사용합니까?

답변:


101

저장 함수를 사용하면 저장 프로 시저를 일반 SQL과 혼합 할 수 없습니다.

예를 들어 프로 시저 인 SELECT get_foo(myColumn) FROM mytable경우에는 유효 get_foo()하지 않지만 get_foo()함수 인 경우이를 수행 할 수 있습니다 . 가격은 기능이 절차보다 더 많은 한계가 있다는 것입니다.


18
기능에는 어떤 종류의 제한이 있습니까?
Fantius

11
아, 여기에 좋은 정보가 있습니다 : dev.mysql.com/doc/refman/5.0/en/…
Fantius

262

프로 시저와 함수의 가장 일반적인 차이점은 서로 다르게 그리고 다른 목적으로 호출된다는 것입니다.

  1. 프로시 저는 값을 리턴하지 않습니다. 대신 CALL 문으로 호출되어 테이블 수정 또는 검색된 레코드 처리와 같은 조작을 수행합니다.
  2. 함수는 표현식 내에서 호출되며 표현식에 사용될 단일 값을 호출자에게 직접 리턴합니다.
  3. CALL 문으로 함수를 호출하거나 표현식에서 프로 시저를 호출 할 수 없습니다.

루틴 작성 구문은 프로 시저 및 기능에서 약간 다릅니다.

  1. 프로 시저 매개 변수는 입력 전용, 출력 전용 또는 둘 다로 정의 할 수 있습니다. 이는 프로 시저가 출력 매개 변수를 사용하여 호출자에게 값을 다시 전달할 수 있음을 의미합니다. 이 값은 CALL 문 다음에 나오는 명령문에서 액세스 할 수 있습니다. 함수에는 입력 매개 변수 만 있습니다. 결과적으로 프로 시저와 함수 모두에 매개 변수가있을 수 있지만 프로 시저 매개 변수 선언은 함수에 대한 것과 다릅니다.
  2. 함수는 값을 반환하므로 함수 정의에 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의 흥미로운 차이점은 다음과 같습니다.

  1. ( 이 시점은 블로그 포스트에서 복사 한 것 입니다. ) 저장 프로시 저는 기능이없는 미리 컴파일 된 실행 계획입니다. 함수 런타임에 구문 분석 및 컴파일되었습니다. 저장 프로 시저, 데이터베이스에 의사 코드 (예 : 컴파일 된 형식)로 저장됩니다.

  2. ( 이 시점에 대해서는 잘 모르겠습니다. )
    저장 프로 시저에는 보안이 있으며 네트워크 트래픽이 줄어들며 저장 프로 시저를 아무 때나 호출 할 수 있습니다. 한 번에 응용 프로그램의. 참고

  3. 함수는 일반적으로 비즈니스 로직을 실행하기 위해 프로 시저가 사용되는 계산에 사용됩니다.

  4. 함수 데이터베이스 상태에 영향을 줄 수 없음 (명시 적 또는 암시 적 커밋 또는 롤백을 수행하는 명령문은 함수에서 허용되지 않습니다.) 저장 프로시 저는 커밋 등을 사용하여 데이터베이스 상태에 영향을 줄 수 있습니다. 참조
    : J.1. 저장된 루틴 및 트리거에 대한 제한 사항

  5. 함수는 FLUSH 문을 사용할 수 없지만 저장 프로시 저는 사용할 수 있습니다.

  6. 저장 함수는 재귀적일 수 없지만 저장 프로시 저는 재귀 적입니다. 참고 : 재귀 저장 프로시 저는 기본적으로 비활성화되어 있지만 max_sp_recursion_depth 서버 시스템 변수를 0이 아닌 값으로 설정하여 서버에서 활성화 할 수 있습니다. 자세한 정보는 5.2.3 절.“시스템 변수” 를 참조하십시오.

  7. 저장된 함수 또는 트리거 내에서 함수 또는 트리거를 호출 한 명령문에 의해 이미 사용중인 (읽기 또는 쓰기) 테이블을 수정할 수 없습니다. 좋은 예 : MYSQL에서 삭제시 동일한 테이블을 업데이트하는 방법은 무엇입니까?

참고 : 일부 제한 사항은 일반적으로 저장 함수 및 트리거에는 적용되지만 저장 프로 시저에는 적용되지 않지만 저장 함수 또는 트리거 내에서 호출 된 경우 저장 프로 시저에는 이러한 제한이 적용됩니다. 예를 들어, 저장 프로 시저에서 FLUSH를 사용할 수 있지만 저장 함수 나 트리거에서 이러한 저장 프로 시저를 호출 할 수 없습니다.


2
@GrijeshChauhan, "런타임에 함수가 파싱되고 컴파일되었다"는 말의 의미는 무엇입니까 ?
Pacerier

@Pacerier는 MySQL의 함수가 즉시 컴파일하고 실행하는 스크립트와 같은 것을 의미합니다. 일부 블로그 게시물 에서 복사 했지만이 동작을 검사하기 위해 실제적으로 수행하지는 않았습니다.
Grijesh Chauhan

절차에서 매개 변수로 out 변수를 전달한 다음 select 문으로 호출 할 수 있습니다.
LTroya

1
이 답변의 맨 아래 섹션에있는 글 머리 기호 # 4는 절차와 기능의 차이점의 핵심이라고 생각합니다. 프로시 저는 데이터베이스를 변경할 수 있으며 기능은 변경할 수 없습니다. 다른 모든 차이점은 그 목적을보다 효과적으로 제공하기위한 것입니다.
Woodrow Barlow

51

한 가지 중요한 차이점은 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)

1
함수에는 두 개의 리턴이 있습니까? 이 줄이 뭐야? RETURNS CHAR(50) DETERMINISTIC?
Martin AJ

RETURNS CHAR(50)데이터의 입력 한 내용 상태가 반환됩니다. 은 RETURN CONCAT(...반환되는 데이터입니다. 둘 다 필요합니다. 은 DETERMINISTIC기본 데이터가 수정되지 않습니다 상태로 필요합니다.
lemming622

8

저장된 함수는 쿼리 내에서 사용할 수 있습니다. 그런 다음 모든 행 또는 WHERE 절에 적용 할 수 있습니다.

CALL 쿼리를 사용하여 프로 시저가 실행됩니다.


0

저장 프로 시저를 재귀 적으로 호출 할 수 있지만 저장 함수는

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.