IT박스

MySQL의 구분 기호

itboxs 2020. 6. 23. 07:57
반응형

MySQL의 구분 기호


사람들이 구분 기호를 사용하는 경우가 종종 있습니다. 나는 구분자가 무엇인지, 그들의 목적이 무엇인지 알아 내려고 노력했다. 인터넷 검색 20 분 후, 나는 나를 만족시키는 답변을 찾지 못했습니다. 그래서 내 질문은 지금입니다 : 구분 기호는 무엇이며 언제 사용해야합니까?


디폴트 이외의 분리 문자 ;는 일반적으로 함수, 스토어드 프로 시저 및 트리거를 정의 할 때 사용되며 여러 명령문을 정의해야합니다. $$전체 프로 시저의 끝을 정의하는 데 사용되는 것과 같은 다른 분리 문자 를 정의하지만 그 내부에서 개별 명령문은 각각으로 종료됩니다 ;. 이렇게하면 mysql클라이언트 에서 코드가 실행될 때 클라이언트는 내부에서 개별 명령문을 실행하지 않고 전체 프로 시저가 끝나는 위치를 말하고이를 단위로 실행할 수 있습니다.

점을 유의 DELIMITER키워드는 명령 줄의 함수이다 mysql클라이언트 (및 다른 클라이언트) 만이 아닌 일반 MySQL의 언어 기능. 프로그래밍 언어 API를 통해 MySQL로 전달하려고 시도하면 작동하지 않습니다. PHPMyAdmin과 같은 일부 클라이언트에는 기본이 아닌 구분자를 지정하는 다른 방법이 있습니다.

예:

DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$

/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN    
  /* Inside the procedure, individual statements terminate with ; */
  CREATE TABLE tablea (
     col1 INT,
     col2 INT
  );

  INSERT INTO tablea
    SELECT * FROM table1;

  CREATE TABLE tableb (
     col1 INT,
     col2 INT
  );
  INSERT INTO tableb
    SELECT * FROM table2;

/* whole procedure ends with the custom delimiter */
END$$

/* Finally, reset the delimiter to the default ; */
DELIMITER ;

DELIMITER지원하지 않는 클라이언트와 함께 사용하려고 하면 서버로 전송되어 구문 오류가보고됩니다. 예를 들어, PHP 및 MySQLi 사용 :

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

다음과 관련된 오류 :

SQL 구문에 오류가 있습니다. 1 행의 'DELIMITER $$'근처에서 사용할 올바른 구문에 대해서는 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오.


DELIMITER 문은 세미콜론 (;) 인 표준 분리 문자를 다른 분리 문자로 변경합니다. 구분자는 세미콜론 (;)에서 이중 슬래시 //로 변경됩니다.

구분자를 변경해야하는 이유는 무엇입니까?

우리는 스토어드 프로 시저, 커스텀 함수 등을 전체적으로 서버에 전달하기를 원하기 때문에 mysql 도구가 한 번에 각 명령문을 해석하게하지 않습니다.


BEGIN...END블록 이있는 스토어드 루틴을 작성 하면 블록 내의 명령문은 세미콜론으로 종료됩니다 (;). 그러나 CREATE PROCEDURE성명서에도 종결자가 필요합니다. 따라서 루틴 본문 내의 세미콜론 CREATE PROCEDURE이 프로 시저 본문 내의 명령문 중 하나를 종료하거나 종료 하는지 여부가 모호해집니다 .

모호성을 해결하는 방법은 MySQL 클라이언트가 CREATE PROCEDURE명령문 의 실제 종료 자로 인식하는 고유 한 문자열 (프로 시저 본문 내에는 안 됨)을 선언하는 것 입니다.


명령문, 함수, 저장 프로 시저 또는 트리거를 전체 명령문으로 처리하도록 mysql 클라이언트에 알리도록 DELIMITER를 정의합니다. 일반적으로 .sql 파일에서는 $$와 같은 다른 DELIMITER를 설정합니다. DELIMITER 명령은 MySQL 명령의 표준 구분 기호 (예 :;)를 변경하는 데 사용됩니다. 루틴 (함수, 저장 프로 시저 또는 트리거) 내의 명령문은 세미콜론 (;)으로 끝나므로 DELIMITER를 복합 명령문으로 취급합니다. 동일한 파일 또는 명령 행에서 다른 루틴을 사용할 때 정의되지 않으면 구문 오류가 발생합니다.

Note that you can use a variety of non-reserved characters to make your own custom delimiter. You should avoid the use of the backslash (\) character because that is the escape character for MySQL.

DELIMITER isn't really a MySQL language command, it's a client command.

Example

DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN

    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;

The delimiter is the character or string of characters that you'll use to tell the MySQL client that you've finished typing in an Sql statement.

참고URL : https://stackoverflow.com/questions/10259504/delimiters-in-mysql

반응형