관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

스토어드 프로시저 2 - 스토어드 함수와 커서(SQL 공부 끝) 본문

알고리즘 및 자료 관리/SQL

스토어드 프로시저 2 - 스토어드 함수와 커서(SQL 공부 끝)

huenuri 2024. 10. 24. 22:16

저녁을 먹고 나서 다시 공부를 하기까지 많은 갈등이 되었다. 그래도 다시 자리에 앉아 공부를 할 수 있어서 다행이었다. 오늘 마치기로 한 두 개의 소단원은 꼭 마칠 예정이다.

스토어드 프로시저와 함께 SQL 프로그래밍 기능으로 사용되는 데이터베이스 개체로는 스토어드 함수와 커서가 있다. 이들을 잘 활용하면 SQL의 단순한 기능을 더욱 강력하게 확장할 수 있다.

 

시작하기 전에

스토어드 함수는 MySQL에서 제공하는 내장 함수 외에 직접 함수를 만드는 기능을 제공한다. 즉, MySQL이 제공하는 함수를 그대로 사용할 수 없는 경우가 발생한다면 직접 스토어드 함수를 작성해서 사용할 수 있다.

스토어드 함수는 스토어드 프로시저와 모양이 비슷하지만, 세부적으로는 다르다. 특히 용도가 다르며, RETURNS 예약어를 통해서 하나의 값을 반환해야 하는 특징이 있다.

커서는 스토어드 프로시저 안에서 한 행씩 처리할 때 사용하는 프로그래밍 방식이다. 


 

 

 

스토어드 함수

스토어드 함수는 스토어드 프로시저와 비슷하다. 하지만 사용 방법이나 용도가 조금 다르다.

 

스토어드 함수의 개념과 형식

MySQL은 다양한 함수를 제공한다. 직접 만들어서 사용하는 함수를 스토어드 함수라고 부르며 다음과 같이 구성할 수 있다.

 

스토어드 프로시저와 상당히 유사하지만 차이점을 살펴보겠다.

  • 스토어드 함수는 RETURNS 문으로 반환할 값의 데이터 형식을 지정하고, 본문 안에서는 RETURN 문으로 하나의 값은 반환해야 한다.
  • 스토어드 함수의 매개변수는 모두 입력 매개변수이다. 그리고 IN을 붙이지 않는다.
  • 스토어드 프로시저는 CALL로 호출하지만, 스토어드 함수는 SELECT 문 안에서 호출된다.
  • 스토어드 프로시저 안에서는 SELECT 문을 사용할 수 있지만, 스토어드 함수 안에서는 SELECT를 사용할 수 없다.
  • 스토어드 프로시저는 여러 SQL 문이나 숫자 계산 등의 다양한 용도로 사용하지만, 스토어드 함수는 어떤 계산을 통해서 하나의 값은 반환하는데 주로 사용한다.

스토어드 함수의 사용

스토어드 함수를 사용하기 위해서는 먼저 다음 SQL로 스토어드 함수 생성 권한을 허용해줘야 한다. MySQL에서 한 번만 설정해 주면 이후에는 신경 쓰지 않아도 된다.

 

 

이번에는 데뷔 연도를 입력하면, 활동 기간이 얼마나 되었는지 출력해주는 함수를 만들어보겠다.

 

 

 

 

 

회원 테이블에서 모든 회원이 데뷔한지 몇 년이 되었는지 조회해 보겠다. YEAR() 함수는 연도만 추출해 주는 함수이다.

 

함수의 삭제는 DROP FUNCTION 문을 사용한다.


 

 

 

커서로 한 행씩 처리하기

커서는 테이블에서 한 행씩 처리하기 위한 방식이다. 스토어드 프로시저 내부에서 커서를 사용하는 방법을 알아보겠다.

 

 

커서의 기본 개념

커서는 첫 번째 행을 처리한 후에 마지막 행까지 한 행씩 접근해서 값을 처리한다. 다음 그림과 같이 처음에는 커서가 행의 시작을 가리킨 후에 한 행씩 차례대로 접근한다.

 

커서는 일반적으로 다음의 작동 순서를 통해 처리된다. 항상 이런 형태로 커서가 사용되니 우선 다음 그림을 잘 기억해 두자.

 

커서는 대부분 스토어드 프로시저와 함께 사용된다. 


 

 

 

커서는 다음과 같이 사용된다.

 


 

 

 

학습을 마치고

이번 단원은 정말 공부하기 싫어서 몇 번이나 학습을 중단했다가 다시 시작하기를 반복하며 겨우 공부를 마쳤다. 그래도 한번 시작한 공부는 끝을 맺고 싶었다. 중간에 커서를 사용하는 방법은 생략했다. 별로 중요하지 않은 내용 같았다.

그리고 프로시저 부분은 내기 지금 필요하지도 않을 뿐더러 공부하는 게 별 의미가 없다는 걸 알게 되었다. 나머지 한 단원은 그냥 남겨두기로 했다. 이로써 지난 5일간의 SQL 심화 학습을 마친다.

 

드디어 끝났다. 정말 수고가 많았다.