MySql로 개발된 함수 생성 구문에서 오류가 발생하여 PphMyAdmin SQL 콘솔의 MariaDB에서 작동하지 않음
SQL에 대해 다음과 같은 생성 함수 블록이 있습니다.
/**
* tos_get_duration.sql
*
* Given time unit in seconds, it converts to more readable format
*
* Eg. SELECT TOS_GET_DURATION(72) => 00d 0:1:12
*/
DROP FUNCTION IF EXISTS TOS_GET_DURATION;
DELIMITER $$
CREATE FUNCTION TOS_GET_DURATION(seconds INT)
RETURNS VARCHAR(16)
BEGIN
RETURN CONCAT(LPAD(FLOOR(HOUR(SEC_TO_TIME(seconds)) / 24), 2, 0), ' days ',TIME_FORMAT(SEC_TO_TIME(seconds % (24 * 3600)), '%H:%i:%s'));
END;
$$
DELIMITER;
사이트 분석 보고 쿼리 페이지에서 시간별로 가져옵니다.
이전에는 MySql에서 잘 작동했지만 최근에 MariaDB로 전환하여 이 기능을 실행하려고 했습니다. 이 기능은 기본적으로 초를 더 사람이 읽을 수 있는 문자열 형식으로 변환합니다.다음 오류가 발생합니다.
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER' at line 1
Server version: 10.5.16-MariaDB - MariaDB Server
문제를 찾고 MySql과 MariaDB 데이터베이스 모두에서 사용할 수 있는 공통 "create function" 형식을 제안하는 것을 도와주세요.
귀중한 의견을 주셔서 감사합니다.저는 각각의 댓글들이 꽤 가치가 있기 때문에 그것들을 업데이트했습니다.당신의 제안을 바탕으로, 저는 두 사람을 위한 공통된 바이올린을 만들고 여기서 공유합니다.요점은 BEGIN/END 문을 제거하고 DELMITER 키워드도 제거할 수 있다는 것입니다.
공통 코드는 MySQL 및 MariaDB 모두에서 작동하지만 MySQL 최신 버전에서는 DEMITLISTIC 키워드가 작동할 것으로 예상합니다.
마리아DB https://dbfiddle.uk/PK8F8ng4
DROP FUNCTION IF EXISTS TOS_GET_DURATION;
CREATE FUNCTION TOS_GET_DURATION(seconds INT)
RETURNS VARCHAR(16)
RETURN CONCAT(LPAD(FLOOR(HOUR(SEC_TO_TIME(seconds)) / 24), 2, 0), ' days ',TIME_FORMAT(SEC_TO_TIME(seconds % (24 * 3600)), '%H:%i:%s'));
SELECT TOS_GET_DURATION(860000);
MySQL https://www.db-fiddle.com/f/qsDtYVw7GrkJW5suNsrfd1/9
DROP FUNCTION IF EXISTS TOS_GET_DURATION;
CREATE FUNCTION TOS_GET_DURATION(seconds INT)
RETURNS VARCHAR(16) DETERMINISTIC
RETURN CONCAT(LPAD(FLOOR(HOUR(SEC_TO_TIME(seconds)) / 24), 2, 0), ' days ',TIME_FORMAT(SEC_TO_TIME(seconds % (24 * 3600)), '%H:%i:%s'));
SELECT TOS_GET_DURATION(860000);
출력:
09 days 22:53:20
저도 연어의 말에 동의합니다.
그렇게 할 수 없습니다. mysql과 mariadb가 분기되고 있으며 mariadb가 mysql을 대체하는 것으로 간주될 수 없는 정도로 분기되었습니다.
중요한 것은 LAMP 스택의 일부로 구축된 수많은 애플리케이션이 있다는 것입니다.따라서 당분간 쉬운 전환을 위해서는 이와 같은 공통 코드 형식이 필요합니다.다른 분들의 추가 제안을 위해 계속 열어두겠습니다.이 문제는 웹 응용 프로그램에서 사용자 참여를 분석하기 위해 쿼리 복합 하위 쿼리를 실행하려고 할 때 site.js에서 작업할 때 처음 식별됩니다.
애플리케이션에 대한 사용자 참여를 위한 상위 10개 세션 찾기:
라인 2는 마리아에서 사용자 정의 함수 TOS_GET_DURTION을 사용합니다.DB
SELECT
TOS_GET_DURATION(max_timeonsite) as 'Session Duration',
tos_session_key
FROM
(
SELECT
MAX(timeonsite) AS max_timeonsite,
tos_session_key
FROM
tos
GROUP BY
tos_session_key
ORDER BY
max_timeonsite DESC
LIMIT
10
) timeonsite_large_sessions;
쿼리 출력
언급URL : https://stackoverflow.com/questions/73741194/error-in-create-function-syntax-developed-with-mysql-not-working-in-mariadb-on-p
'programing' 카테고리의 다른 글
UIPageControl의 페이지 점 색상을 변경하려면 어떻게 해야 합니까? (0) | 2023.06.21 |
---|---|
SQL Server 사용 권한 스크립팅 (0) | 2023.06.21 |
스프링 보안, 상태 비저장 REST 서비스 및 CSRF (0) | 2023.06.21 |
함수의 출력 억제 (0) | 2023.06.21 |
__del__ 메서드는 무엇이며 어떻게 부르나요? (0) | 2023.06.21 |