데이터 베이스 MySQL 튜토리얼 MySQL数据库中delimiter的作用概述_MySQL

MySQL数据库中delimiter的作用概述_MySQL

Jun 01, 2016 pm 01:51 PM
기사 지식 통역사

以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获。

其实就是告诉MySQL解释器,该段命令是否已经结束了,MySQL数据库是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,MySQL将会执行该命令。如输入下面的语句

<ol><li>MySQL> select * from test_table; </li></ol>
로그인 후 복사

然后回车,那么MySQL将立即执行该语句。

但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。如试图在命令行客户端中输入如下语句

<ol>
<li>MySQL> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)  </li>
<li>MySQL> RETURNS varchar(255)  </li>
<li>MySQL> BEGIN  </li>
<li>MySQL> IF ISNULL(S) THEN  </li>
<li>MySQL> RETURN '';  </li>
<li>MySQL> ELSEIF NMySQL> RETURN LEFT(S, N);  </li>
<li>MySQL> ELSE  </li>
<li>MySQL> IF CHAR_LENGTH(S) MySQL> RETURN S;  </li>
<li>MySQL> ELSE  </li>
<li>MySQL> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));  </li>
<li>MySQL> END IF;  </li>
<li>MySQL> END IF;  </li>
<li>MySQL> END; </li>
</ol>
로그인 후 복사

默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。因为MySQL一遇到分号,它就要自动执行。即,在语句RETURN '';时,MySQL数据库解释器就要执行了。这种情况下,就需要事先把delimiter换成其它符号,如//或$$。

<ol>
<li>MySQL> delimiter //  </li>
<li>MySQL> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)  </li>
<li>MySQL> RETURNS varchar(255)  </li>
<li>MySQL> BEGIN  </li>
<li>MySQL> IF ISNULL(S) THEN  </li>
<li>MySQL> RETURN '';  </li>
<li>MySQL> ELSEIF NMySQL> RETURN LEFT(S, N);  </li>
<li>MySQL> ELSE  </li>
<li>MySQL> IF CHAR_LENGTH(S) MySQL> RETURN S;  </li>
<li>MySQL> ELSE  </li>
<li>MySQL> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));  </li>
<li>MySQL> END IF;  </li>
<li>MySQL> END IF;  </li>
<li>MySQL> END;//  </li>
</ol>
로그인 후 복사

这样只有当//出现之后,MySQL解释器才会执行这段语句

例子:

<ol>
<li>MySQL> delimiter //   </li>
<li>MySQL> CREATE PROCEDURE simpleproc (OUT param1 INT)   </li>
<li>-> BEGIN   </li>
<li>-> SELECT COUNT(*) INTO param1 FROM t;   </li>
<li>-> END;   </li>
<li>-> //   </li>
<li>Query OK, 0 rows affected (0.00 sec)   </li>
<li>MySQL> delimiter ;   </li>
<li>MySQL> CALL simpleproc(@a);   </li>
<li>Query OK, 0 rows affected (0.00 sec)   </li>
<li>MySQL> SELECT @a;   </li>
<li>+------+   </li>
<li>| @a |   </li>
<li>+------+   </li>
<li>| 3 |   </li>
<li>+------+   </li>
<li>1 row in set (0.00 sec)   </li>
</ol>
로그인 후 복사

本文代码在 MySQL 5.0.41-community-nt 下运行通过。

编写了个统计网站访问情况(user agent)的 MySQL 数据库存储过程。就是下面的这段 SQL 代码。

<ol>
<li>drop procedure if exists pr_stat_agent;  </li>
<li>-- call pr_stat_agent ('2008-07-17', '2008-07-18')  </li>
<li>create procedure pr_stat_agent  </li>
<li>(  </li>
<li>pi_date_from date  </li>
<li>,pi_date_to date  </li>
<li>)  </li>
<li>begin  </li>
<li>-- check input  </li>
<li>if (pi_date_from is null) then  </li>
<li>set pi_date_from = current_date();  </li>
<li>end if;  </li>
<li>if (pi_date_to is null) then  </li>
<li>set pi_date_to = pi_date_from;  </li>
<li>end if;  </li>
<li>set pi_date_to = date_add(pi_date_from, interval 1 day);  </li>
<li>-- stat  </li>
<li>select agent, count(*) as cnt  </li>
<li>from apache_log  </li>
<li>where request_time >= pi_date_from  </li>
<li>and request_time group by agent  </li>
<li>order by cnt desc;  </li>
<li>end;  </li>
</ol>
로그인 후 복사

我在 EMS SQL Manager 2005 for MySQL 这个 MySQL 图形客户端下可以顺利运行。但是在 SQLyog MySQL GUI v5.02 这个客户端就会出错。最后找到原因是没有设置好 delimiter 的问题。

默认情况下,delimiter “;” 用于向 MySQL 提交查询语句。在存储过程中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢 “;” 就向 MySQL 提交的话,当然会出问题了。于是更改 MySQL 的 delimiter,上面 MySQL 存储过程就编程这样子了:

delimiter //; -- 改变 MySQL delimiter 为:“//”

<ol>
<li>drop procedure if exists pr_stat_agent //  </li>
<li>-- call pr_stat_agent ('2008-07-17', '2008-07-18')  </li>
<li>create procedure pr_stat_agent  </li>
<li>(  </li>
<li>pi_date_from date  </li>
<li>,pi_date_to date  </li>
<li>)  </li>
<li>begin  </li>
<li>-- check input  </li>
<li>if (pi_date_from is null) then  </li>
<li>set pi_date_from = current_date();  </li>
<li>end if;  </li>
<li>if (pi_date_to is null) then  </li>
<li>set pi_date_to = pi_date_from;  </li>
<li>end if;  </li>
<li>set pi_date_to = date_add(pi_date_from, interval 1 day);  </li>
<li>-- stat  </li>
<li>select agent, count(*) as cnt  </li>
<li>from apache_log  </li>
<li>where request_time >= pi_date_from  </li>
<li>and request_time group by agent  </li>
<li>order by cnt desc;  </li>
<li>end; //  </li>
<li>
<font style="background-color: #ff0000">delimiter ;</font>  </li>
</ol>
로그인 후 복사

改回默认的 MySQL delimiter:“;”

当然,MySQL delimiter 符号是可以自由设定的,你可以用 “/” 或者“$$” 等。但是 MySQL数据库 存储过程中比较常见的用法是 “//” 和 “$$”。上面的这段在 SQLyog 中的代码搬到 MySQL 命令客户端(MySQL Command Line Client)却不能执行。

MySQL> delimiter //; -- 改变 MySQL delimiter 为:“//”

<ol>
<li>MySQL> </li>
<li>MySQL> drop procedure if exists pr_stat_agent //  </li>
<li>-> </li>
<li>-> -- call pr_stat_agent ('2008-07-17', '2008-07-18')  </li>
<li>-> </li>
<li>-> create procedure pr_stat_agent  </li>
<li>-> (  </li>
<li>-> pi_date_from date  </li>
<li>-> ,pi_date_to date  </li>
<li>-> )  </li>
<li>-> begin  </li>
<li>-> -- check input  </li>
<li>-> if (pi_date_from is null) then  </li>
<li>-> set pi_date_from = current_date();  </li>
<li>-> end if;  </li>
<li>-> </li>
<li>-> if (pi_date_to is null) then  </li>
<li>-> set pi_date_to = pi_date_from;  </li>
<li>-> end if;  </li>
<li>-> </li>
<li>-> set pi_date_to = date_add(pi_date_from, interval 1 day);  </li>
<li>-> </li>
<li>-> -- stat  </li>
<li>-> select agent, count(*) as cnt  </li>
<li>-> from apache_log  </li>
<li>-> where request_time >= pi_date_from  </li>
<li>-> and request_time -> group by agent  </li>
<li>-> order by cnt desc;  </li>
<li>-> end; //  </li>
<li>-> </li>
<li>-> delimiter ; </li>
</ol>
로그인 후 복사

改回默认的 MySQL delimiter:“;”

<ol>
<li>-> //  </li>
<li>-> //  </li>
<li>-> //  </li>
<li>-> ;  </li>
<li>-> ;  </li>
<li>-> </li>
</ol>
로그인 후 복사

真是奇怪了!最后终于发现问题了,在 MySQL 命令行下运行 “delimiter //; ” 则 MySQL 的 delimiter 实际上是 “//;”,而不是我们所预想的 “//”。其实只要运行指令 “delimiter //” 就 OK 了。

MySQL> delimiter // -- 末尾不要符号 “;”

<ol>
<li>MySQL> </li>
<li>MySQL> drop procedure if exists pr_stat_agent //  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
<li>MySQL> </li>
<li>MySQL> -- call pr_stat_agent ('2008-07-17', '2008-07-18')  </li>
<li>MySQL> </li>
<li>MySQL> create procedure pr_stat_agent  </li>
<li>-> (  </li>
<li>-> pi_date_from date  </li>
<li>-> ,pi_date_to date  </li>
<li>-> )  </li>
<li>-> begin  </li>
<li>-> -- check input  </li>
<li>-> if (pi_date_from is null) then  </li>
<li>-> set pi_date_from = current_date();  </li>
<li>-> end if;  </li>
<li>-> </li>
<li>-> if (pi_date_to is null) then  </li>
<li>-> set pi_date_to = pi_date_from;  </li>
<li>-> end if;  </li>
<li>-> </li>
<li>-> set pi_date_to = date_add(pi_date_from, interval 1 day);  </li>
<li>-> </li>
<li>-> -- stat  </li>
<li>-> select agent, count(*) as cnt  </li>
<li>-> from apache_log  </li>
<li>-> where request_time >= pi_date_from  </li>
<li>-> and request_time -> group by agent  </li>
<li>-> order by cnt desc;  </li>
<li>-> end; //  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
<li>MySQL> </li>
<li>MySQL> delimiter ;   </li>
</ol>
로그인 후 복사

末尾不要符号 “//”

<ol><li>MySQL> </li></ol>
로그인 후 복사

顺带一提的是,我们可以在 MySQL 数据库中执行在文件中的 SQL 代码。例如,我把上面存储过程的代码放在文件 d:/pr_stat_agent.sql 中。可以运行下面的代码建立存储过程。

<ol>
<li>MySQL> source d:/pr_stat_agent.sql  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
</ol>
로그인 후 복사

source 指令的缩写形式是:“/.”

<ol>
<li>MySQL> /. d:/pr_stat_agent.sql  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
<li>Query OK, 0 rows affected (0.00 sec)  </li>
</ol>
로그인 후 복사

最后,可见 MySQL数据库的客户端工具在有些地方是各自为政,各有各的一套。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있나요? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있나요? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! Mar 15, 2024 pm 04:13 PM

1. 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있습니까? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 1. 기본 권익 활성화: 기사의 원본은 광고를 통해 수익을 얻을 수 있으며, 동영상은 가로 화면 모드에서 원본이어야 수익을 얻을 수 있습니다. 2. 팬 100명 권리 활성화: 팬 수가 100명 이상에 도달하면 마이크로 헤드라인, 오리지널 Q&A 작성, Q&A 수익을 얻을 수 있습니다. 3. 독창적인 작품을 고집하라: 독창적인 작품에는 기사, 마이크로 헤드라인, 질문 등이 포함되며, 300단어 이상이어야 합니다. 불법 표절 저작물을 원작으로 출판할 경우 크레딧 점수가 차감되며, 수익금도 차감되므로 주의하시기 바랍니다. 4. 수직성: 전문 분야에서 기사를 작성할 때 분야를 넘나들며 마음대로 기사를 작성할 수 없으며 적절한 추천을 받을 수 없으며, 작품의 전문성과 정확성을 확보할 수 없으며 팬을 유치하기가 어렵습니다. 그리고 독자들. 5. 활동: 높은 활동,

Python 설치를 확인하는 여러 가지 방법 Windows 11 Python 설치를 확인하는 여러 가지 방법 Windows 11 Nov 18, 2023 am 11:05 AM

Windows 11에 Python이 설치되어 있는지 확인하는 다양한 방법 Python이 아직 시스템에 설치되지 않은 경우 Windows 11에서 Python 및 PIP 패키지 관리자를 가져오는 단일 명령을 보여주는 기사를 확인할 수 있습니다. 1. 명령 프롬프트 사용 첫 번째 방법은 명령줄을 사용하는 것입니다. 이를 위해 Windows의 CMD를 사용합니다. 이는 노트북이나 PC에 설치된 Python 버전을 확인하는 가장 좋은 방법입니다. python--version2.PowerShell은 명령 프롬프트와 유사합니다. PowerShell은 Windows 플랫폼에서 사용할 수 있는 Microsoft의 명령줄 셸이자 스크립팅 도구입니다.

충격적인 win10x 시스템 지식에 대해 알아보세요 충격적인 win10x 시스템 지식에 대해 알아보세요 Jul 14, 2023 am 11:29 AM

최근 win10X 시스템의 최신 이미지 다운로드가 인터넷에 유출되었습니다. 일반적인 ISO와는 달리 이 이미지는 .ffu 형식이며 현재 Surface Pro7 경험에만 사용할 수 있습니다. 비록 많은 친구들이 그것을 경험할 수는 없지만 여전히 평가의 관련 내용을 읽고 즐길 수 있으므로 win10x 시스템의 최신 평가를 살펴보겠습니다. win10x 시스템의 최신 평가 1. 둘 사이의 가장 큰 차이점! Win10X 및 Win10은 부팅 후 처음 나타납니다. 버튼은 작업 표시줄 중앙에 배치되며, 고정된 애플리케이션 외에도 Android 및 iOS 휴대폰과 마찬가지로 최근에 실행된 애플리케이션을 표시할 수도 있습니다. 2. 또 다른 점은 새 시스템의 "시작" 메뉴가 파일을 지원하지 않는다는 것입니다.

Python의 기본 기술에 대한 심층 분석: 인터프리터 구현 방법 Python의 기본 기술에 대한 심층 분석: 인터프리터 구현 방법 Nov 08, 2023 pm 05:53 PM

Python의 기본 기술에 대한 심층 탐구: 인터프리터 구현 방법 소개: Python은 소프트웨어 개발 및 데이터 분석 분야에서 널리 사용되는 고급 언어입니다. 배우기 쉽고 우아한 구문, 동적 타이핑, 객체 지향 기능을 갖추고 있어 개발자들 사이에서 매우 인기가 높습니다. 그러나 Python이 코드를 실행하고 다양한 기능을 구현하는 방법에 대한 기본 기술에 대한 우리의 이해는 제한적입니다. 이 기사에서는 Python의 기본 기술을 자세히 살펴보고 간단한 Python 인터프리터를 구현하는 방법에 중점을 두고 특정 코드를 첨부합니다.

pycharm에서 인터프리터를 설정하는 방법 pycharm에서 인터프리터를 설정하는 방법 Dec 08, 2023 pm 05:32 PM

pycharm에서 인터프리터를 설정하는 단계: 1. PyCharm을 열고 프로젝트를 생성합니다. 2. 프로젝트 설정을 엽니다. 3. 인터프리터 구성 페이지를 선택합니다. 자세한 소개: 1. 1. PyCharm을 열고 프로젝트를 생성한 후 PyCharm IDE를 열고 환영 인터페이스 또는 메뉴에서 "새 프로젝트 생성"을 선택하여 새 프로젝트를 생성하거나 기존 프로젝트를 엽니다. 2. 프로젝트 설정을 열고 엽니다. 프로젝트 마지막으로 상단 메뉴 표시줄에서 "파일"을 클릭합니다.

PyCharm 인터프리터 설치 튜토리얼: Python 환경을 쉽게 구성 PyCharm 인터프리터 설치 튜토리얼: Python 환경을 쉽게 구성 Feb 22, 2024 pm 11:30 PM

PyCharm 인터프리터 설치 튜토리얼: Python 환경을 쉽게 구성하십시오. PyCharm은 Python 개발 분야에서 널리 사용되는 강력한 통합 개발 환경입니다. Python 인터프리터를 올바르게 구성하는 것은 PyCharm을 사용하는 기본입니다. 이 기사에서는 초보자가 빠르게 시작할 수 있도록 PyCharm에서 Python 인터프리터를 설치하고 구성하는 방법을 소개합니다. 1단계: Python 인터프리터를 설치합니다. 먼저 공식 웹사이트(https://www.python.org)로 이동해야 합니다.

PyCharm 인터프리터가 추가한 트릭 복호화 PyCharm 인터프리터가 추가한 트릭 복호화 Feb 21, 2024 pm 03:33 PM

PyCharm 인터프리터가 추가한 트릭 복호화 PyCharm은 많은 Python 개발자가 선호하는 통합 개발 환경(IDE)으로, 개발 효율성을 향상시키는 많은 강력한 기능을 제공합니다. 그 중 인터프리터 설정은 PyCharm의 중요한 부분입니다. 인터프리터를 올바르게 설정하면 개발자가 코드를 원활하게 실행하고 프로그램을 디버깅하는 데 도움이 될 수 있습니다. 이 기사에서는 PyCharm 인터프리터 추가 사항을 해독하는 몇 가지 기술을 소개하고 이를 특정 코드 예제와 결합하여 인터프리터를 올바르게 구성하는 방법을 보여줍니다. Py에서 인터프리터 추가 및 선택

PyCharm에서 인터프리터 구성에 대한 자세한 단계별 분석 PyCharm에서 인터프리터 구성에 대한 자세한 단계별 분석 Feb 03, 2024 am 08:11 AM

PyCharm에서 인터프리터를 구성하는 단계에 대한 자세한 설명에는 특정 코드 예제가 필요합니다. Python 개발을 위해 PyCharm을 사용하는 경우 인터프리터를 올바르게 구성하는 것은 매우 중요한 단계입니다. 인터프리터는 Python 코드가 실행되는 환경이며, PyCharm은 프로젝트 코드를 실행하는 데 사용할 인터프리터를 알아야 합니다. 이 문서에서는 PyCharm에서 인터프리터를 구성하는 단계를 자세히 설명하고 특정 코드 예제를 제공합니다. 1단계: PyCharm 열기 및 프로젝트 생성 또는 열기 먼저 PyCharm을 엽니다.

See all articles