6.15 SqlFunction 으로 저장 함수 호출하기.
6.15장은 mysql 로 function을 생성하고, 해당 function을 사용하여 select 하는 내용이다.
이 내용을 그대로 따라했는데,, mysql에서 function이 생성되지 않는 에러가 발생했다.
↓ 전문가를 위한 스프링5 책에 있는 function 생성 함수
DELIMITER //
CREATE FUNCTION getFirstNameById(in_id INT)
RETURNS VARCHAR(60)
BEGIN
RETURN (SELECT first_name FROM singer WHERE id = in_id);
END //
DELIMITER ;
문제는.. 어떤 에러인지는 안나오고 "Name : Updated Rows, Value : -1" 로 결과가 나온다.
인터넷을 찾아보고 정말 여러가지로 시도를 해봤다ㅠ(한 2시간은 삽질한듯..)
여러가지 시도했던 내용과 마지막에 해결방법을 적어봤다.
1. log_bin_trust_function_creators 값을 0에서 1로 변경. (OFF -> ON)
show global variables like 'log_bin_trust_function_creators';
위와 같이 조회했을때 0값(OFF값)으로 되어있어서
SET GLOBAL log_bin_trust_function_creators = 1;
위 명령어로 1값(ON)값으로 변경 후 다시 실행
--> 결과는 실패.
2. USER를 모든 권한을 가진 root 유저로 변경하여 시도
--> 결과는 실패.
3. DROP FUNCTION IF EXISTS getFirstNameById // 추가
--> 실패
4. BEGIN 전 줄에 READS SQL DATA 추가
--> 실패
5. 기타 등등 stackoverflow에 나와있는 모든 내용 동원해서 다 추가해봄
--> 실패
뭔가 버전이 달라서 명령어가 바꼈나? 의심되기 시작함.
SELECT version();
버전을 확인해보니 8.1.0 이다.
6. MySQL 8.0 Reference Manual 에 있는 CREATE FUNCTION 명령어로 시도
--> 성공!!!!
https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html
위 사이트에서 아래 내용 보고 했더니 된다ㅠ_ㅠ
위 내용 보고 아래 세줄만 실행했더니 바로 된다! ㅠ_ㅠ
CREATE FUNCTION getFirstNameById(in_id INT)
RETURNS VARCHAR(60) DETERMINISTIC
RETURN (SELECT first_name FROM singer WHERE id = in_id LIMIT 1);
6.15장에 있는 내용을 인텔리제이에서 실행해도 이제 에러없이 실행된다!
※교훈 : 다른사람들이 설명해 놓은 글보다 원래의 메뉴얼을 먼저 찾아서 하자..
[전문가를 위한 스프링5] 9.3 트랜잭션 프로퍼티 살펴보기 (0) | 2023.11.15 |
---|---|
[전문가를 위한 스프링5] HibernateException casting error (0) | 2023.10.17 |
[전문가를 위한 스프링5]스프링에서 제공하는 어드바이스 (0) | 2023.09.06 |
[전문가를 위한 스프링5] 자바 구성 애너테이션 목록 (0) | 2023.09.04 |
[JAVA] 백준 12869번 뮤탈리스크 (0) | 2022.03.27 |