소수점 이하가 예상되는 경우 MariaDB 사용자 정의 함수가 int 또는 null을 반환합니다.
저는 Slackware64 14.1에서 실행되는 MariaDB 버전 5.5.35에서 사용자 정의 함수의 깊이를 알아보고 있습니다.
기능은 다음과 같습니다.
DELIMITER $$
CREATE FUNCTION avg_month(st_id tinyint, pol_id tinyint, month_sel tinyint, year_sel smallint)
-> RETURNS DECIMAL(7.4)
-> DETERMINISTIC
-> BEGIN
-> DECLARE avrg decimal;
-> SELECT avg(value) into avrg FROM all_data_obs
-> WHERE month(start_time)=month_sel and year(start_time)=year_sel and station_id=st_id and polutant_id=pol_id;
-> RETURN avrg;
-> END $$
DB가 말합니다.
Query OK, 0 rows affected (0.03 sec)
하지만 내가 그것을 사용하려고 할 때.
select avg_month(2,5,5,2014);
null 또는 1 또는 0을 반환합니다.1.0 아니면 0.0 아닌가요?그리고 만약 제가 그것을 사용하려고 노력한다면.
select avg_month(16,5,5,2014) from all_data_obs;
DB는 아무것도 반환하지 않으며 Ctrl+c로 쿼리를 중지해야 합니다.
select 문만 사용하면 잘 작동합니다.예를들면
SELECT avg(value) as a FROM all_data_obs WHERE month(start_time)=5 and year(start_time)=2014 and station_id=16 and polutant_id=5;
0.122427을 반환하지만
select avg_month(16,5,5,2014);
0을 반환합니다.
저는 제가 기능에 익숙하지 않다는 것을 인정합니다.구글에 문의해 기능을 쓰는 방법에 대한 기사를 몇 개 읽었지만 해결 방법을 찾을 수 없었습니다.
어떤 생각이든 환영합니다.
기능을 선언했습니다.DETERMINISTIC
그 말은 다음과 같습니다.
주어진 모수 리스트에 대해 하나의 결과만 생성할 수 있는 함수는 결정론적입니다.결과가 저장된 데이터, 서버 변수, 난수 또는 명시적으로 전달되지 않은 값의 영향을 받을 수 있는 경우 함수는 결정론적이지 않습니다.
테이블에서 쿼리하기 때문에 함수가 결정론적으로 선언되지 않아야 합니다.
알고 보니 avrg를 선언할 때 (7,4)를 추가해야 했습니다.
DECLARE avrg DECIMAL(7,4);
이제 모든 것이 괜찮아 보입니다.
이전에 제게 지적되었던 다른 실수들도 여기에 넣겠습니다.
- 저는 (7,4) 대신 RETURN DECTION(7.4)이라고 썼습니다.
- 함수가 결정론적으로 잘못 선언되었습니다.
그 두 사람은 @Andomar에 의해 주목받았습니다.감사해요.
언급URL : https://stackoverflow.com/questions/25082940/mariadb-user-defined-function-returns-int-or-null-when-decimal-expected
'programing' 카테고리의 다른 글
Xcode 대상 배포 대상 대 프로젝트 배포 대상 (0) | 2023.07.27 |
---|---|
Python의 상속 및 초기화 방법 (0) | 2023.07.27 |
PyQt 응용 프로그램에서 스레드화:Qt 스레드 또는 Python 스레드를 사용합니까? (0) | 2023.07.27 |
Python의 Argparse에서 동일한 옵션을 여러 번 사용하기 (0) | 2023.07.27 |
서비스에서 컨텍스트 가져오기 (0) | 2023.07.27 |