programing

MySql로 개발된 함수 생성 구문에서 오류가 발생하여 PphMyAdmin SQL 콘솔의 MariaDB에서 작동하지 않음

bestprogram 2023. 6. 21. 22:49

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;

쿼리 출력

Top 10 user sessions for measuring user engagement - timeonsite.js

언급URL : https://stackoverflow.com/questions/73741194/error-in-create-function-syntax-developed-with-mysql-not-working-in-mariadb-on-p