source

MySQL 스토어드 프로시저 vs 함수, 어떤 경우에 사용합니까?

gigabyte 2022. 12. 18. 08:36
반응형

MySQL 스토어드 프로시저 vs 함수, 어떤 경우에 사용합니까?

MySQL 스토어드 프로시저와 기능을 보고 있습니다.진짜 차이점은 뭐죠?

비슷해 보이지만 함수는 더 많은 제한이 있습니다.

제가 틀렸을 수도 있지만, 저장 프로시저는 저장 기능보다 더 많은 것을 할 수 있는 것 같습니다.프로시저와 함수를 사용하는 이유/언제입니까?

순서와 기능의 가장 일반적인 차이는, 각각 다른 목적으로 호출된다는 것입니다.

  1. 프로시저는 값을 반환하지 않습니다.대신 CALL 문과 함께 호출되어 테이블 변경이나 취득한 레코드 처리 등의 조작을 수행합니다.
  2. 함수는 식 내에서 호출되며 식에서 사용되는 단일 값을 직접 발신자에게 반환합니다.
  3. CALL 문을 사용하여 함수를 호출할 수 없습니다.또, 식내의 프로시저를 호출할 수도 없습니다.

루틴 작성 구문은 절차 및 기능에 따라 다소 다릅니다.

  1. 프로시저 파라미터는 입력전용, 출력전용 또는 둘 다로 정의할 수 있습니다.즉, 프로시저는 출력 파라미터를 사용하여 값을 발신자에게 되돌릴 수 있습니다.이러한 값은 CALL 스테이트먼트 뒤에 이어지는 스테이트먼트로 액세스 할 수 있습니다.함수에는 입력 파라미터만 있습니다.그 결과 프로시저와 함수 모두 파라미터를 가질 수 있지만 프로시저 파라미터 선언은 함수와는 다르다.
  2. 함수는 값을 반환하므로 함수 정의에 반환 값의 데이터 유형을 나타내는 RETURNS 절이 있어야 합니다.또한 발신자에게 값을 반환하려면 함수 본문 내에 적어도1개의 RETURN 문이 있어야 합니다.RETURNs 및 RETURN은 절차 정의에 표시되지 않습니다.

    • 프로시저를 하려면 , 「」를 합니다.CALL statement함수를 합니다. 저장된 함수를 호출하려면 식에서 해당 함수를 참조합니다.이 함수는 식 평가 중 값을 반환합니다.

    • 프로시저는 CALL 문을 사용하여 호출되며 출력 변수를 사용하는 값만 반환할 수 있습니다.함수는 다른 함수와 마찬가지로 문 안에서 호출할 수 있으며(즉, 함수의 이름을 호출하여) 스칼라 값을 반환할 수 있습니다.

    • 파라미터를 IN, OUT 또는 INOUT로 지정하는 것은 절차에만 유효합니다.FUNTION의 경우 파라미터는 항상 IN 파라미터로 간주됩니다.

    파라미터 이름 앞에 키워드를 지정하지 않으면 기본적으로는 IN 파라미터입니다.저장된 기능의 파라미터 앞에는 IN, OUT 또는 INOUT이 없습니다.모든 기능 파라미터는 IN 파라미터로 취급됩니다.

저장 프로시저 또는 함수를 정의하려면 각각 CREATE PROCEDURE 또는 CREATE FUNTION을 사용합니다.

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)

기능과 저장 프로시저 사이에 몇 가지 흥미로운 차이점이 있습니다.

  1. (이 포인트블로그 포스트에서 복사한 것입니다).저장 프로시저는 함수가 아닌 미리 컴파일된 실행 계획입니다.함수를 런타임에 구문 분석 및 컴파일합니다.저장 프로시저, 데이터베이스에 유사 코드로 저장됩니다(예: 컴파일된 형식).

  2. (이 점에 대해서는 모르겠습니다.)
    스토어드 프로시저는 보안을 갖추고 네트워크트래픽을 삭감합니다.또한 한번에 임의의 수의 어플리케이션에서 스토어드 프로시저를 호출할 수 있습니다.레퍼런스

  3. 함수는 일반적으로 비즈니스 로직을 실행하기 위해 절차를 사용하는 경우 계산에 사용됩니다.

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

  5. 함수는 FLUSH 문을 사용할 수 없지만 Stored Procedure는 사용할 수 있습니다.

  6. 저장된 함수는 재귀적일 수 없는 반면 저장된 프로시저는 재귀적일 수 있습니다.주의: 재귀 스토어드 프로시저는 디폴트로 디세이블이지만 max_sp_recursion_depth 서버 시스템 변수를 0이 아닌 값으로 설정하면 서버에서 활성화 할 수 있습니다.자세한 내용은 섹션 5.2.3 "시스템 변수"참조하십시오.

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

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

일반 SQL에서는 스토어드 프로시저를 혼재시킬 수 없지만 스토어드 함수에서는 혼재시킬 수 있습니다.

★★SELECT get_foo(myColumn) FROM mytable is음음 is 、 is is 、 is is 、 is 、 。get_foo()할 수 건 '다 하다', '다', '다', '다', '다', '다', '다', '다',get_foo()수입다 the the the.절차보다 이 더 입니다.가격은 기능에는 절차보다 더 많은 제한이 있다는 것입니다.

중요한 차이점 중 하나는 SQL 쿼리에 함수를 포함할 수 있지만 스토어드 프로시저는 다음 문장으로만 호출할 수 있다는 것입니다.

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)

Sproc의 예:

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)

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

절차는 CALL 쿼리를 사용하여 실행됩니다.

저장 프로시저를 재귀적으로 호출할 수 있지만 저장 함수는 호출할 수 없습니다.

상기 답변 외에 추가하겠습니다.

함수는 다른 함수 및 식과 조합하여 사용할 수도 있고 중첩된 방식으로 사용할 수도 있습니다(요컨대 원하는 작업을 수행하기 위해 매우 복잡한 형태로 사용할 수도 있습니다).

절차에서도 동일한 작업을 수행할 수 있지만 절차에서 모든 작업을 수행해야 했습니다. 즉, 단일 패션 코드입니다.(모든 태스크에 대해 함수와 마찬가지로 새로운 기능을 구현할 수 있습니다).마지막에는 여러 기능을 조합하여 작업을 수행할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3744209/mysql-stored-procedure-vs-function-which-would-i-use-when

반응형