programing

소수점 이하가 예상되는 경우 MariaDB 사용자 정의 함수가 int 또는 null을 반환합니다.

padding 2023. 7. 27. 21:40
반응형

소수점 이하가 예상되는 경우 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

반응형