MySql delimiter 의 역할 은 무엇 입 니까?

7443 단어 MySqldelimiter
MYSQL 에서 SQL 을 내 보 낸 후:DELIMITER$DROP TRIGGER IF EXISTS`updateegopricondelete`$CREATE    TRIGGER `updateegopriceondelete` AFTER  DELETE ON  `customerinfo`     FOR EACH ROW BEGIN DELETE FROM egoprice  WHERE customerId=OLD.customerId;     END$$ DELIMITER ; 그 중에서 DELIMITER 는 끝 자 를'$$'로 정 한 다음 에 마지막 으로';'로 정의 합 니 다.MYSQL 의 기본 끝 자 는";"입 니 다.상세 한 설명:사실은 my sql 해석 기 에 이 명령 이 끝 났 는 지,my sql 이 실 행 될 수 있 는 지 알려 주 는 것 입 니 다.기본적으로 delimiter 는 분점 입 니 다.명령 행 클 라 이언 트 에서 분점 으로 끝 나 는 명령 이 있 으 면 차 로 돌아 가면 my sql 에서 이 명령 을 수행 합 니 다.아래 문 구 를 입력 하면 my sql>select*from testtable; 그리고 차 로 돌아 가면 MySQL 은 이 문 구 를 즉시 실행 합 니 다.하지만 가끔 은 MySQL 이 그 러 기 를 원 하지 않 는 다.비교적 많은 문 구 를 입력 할 수 있 고 문장 에 분점 이 포함 되 어 있다.명령 행 클 라 이언 트 에 다음 문 구 를 입력 하려 면 my sql>CREATE FUNCTION'SHORTEN'(S VARCHAR(255),N INT)my sql>     RETURNS varchar(255) mysql> BEGIN mysql> IF ISNULL(S) THEN mysql>     RETURN ''; mysql> ELSEIF N<15 THEN mysql>     RETURN LEFT(S, N); mysql> ELSE mysql>     IF CHAR_LENGTH(S) <=N THEN mysql>    RETURN S; mysql>     ELSE mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5)); mysql>     END IF; mysql> END IF; mysql> END; 기본 적 인 상황 에서 사용자 가 이 문 구 를 모두 입력 한 후에 전체 문 구 를 실행 할 수 없습니다.my sql 이 분 호 를 만나면 자동 으로 실행 되 기 때 문 입 니 다.즉,문장에서 RETURN';my sql 해석 기 가 실 행 됩 니 다.이 경우,delimiter 를//또는$와 같은 다른 기호 로 미리 바 꿔 야 합 니 다.mysql> delimiter // mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT) mysql>     RETURNS varchar(255) mysql> BEGIN mysql> IF ISNULL(S) THEN mysql>     RETURN ''; mysql> ELSEIF N<15 THEN mysql>     RETURN LEFT(S, N); mysql> ELSE mysql>     IF CHAR_LENGTH(S) <=N THEN mysql>    RETURN S; mysql>     ELSE mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5)); mysql>     END IF; mysql> END IF; mysql> END;// 이렇게 하면//가 나타 난 후에 만 mysql 해석 기 에서 이 문장 을 실행 할 수 있 습 니 다.예:mysql>delimiter//mysql>CREATE PROCEDURE simpleproc(OUT param 1 INT)->BEGIN->SELECT COUNT(*)INTO param 1 FROM t;->END; -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; +------+ | @a|+---+|3|+---+1 row in set(0.00 sec)본문 코드 는 MySQL 5.0.41-community-nt 에서 실 행 됩 니 다.통계 사이트 접근 상황(user agent)의 MySQL 저장 과정 을 작 성 했 습 니 다.바로 아래 의 이 SQL 코드 입 니 다.drop procedure if exists pr_stat_agent; -- call pr_stat_agent ('2008-07-17', '2008-07-18') create procedure pr_stat_agent (    pi_date_from  date   ,pi_date_to    date ) begin    -- check input    if (pi_date_from is null) then       set pi_date_from = current_date();    end if;    if (pi_date_to is null) then       set pi_date_to = pi_date_from;    end if;    set pi_date_to = date_add(pi_date_from, interval 1 day);    -- stat    select agent, count(*) as cnt      from apache_log     where request_time >= pi_date_from       and request_time <  pi_date_to     group by agent     order by cnt desc; end; 저 는 EMS SQL Manager 2005 for MySQL 이라는 MySQL 그래 픽 클 라 이언 트 에서 순조롭게 실 행 될 수 있 습 니 다.하지만 SQLyog MySQL GUI v 5.02 에서 이 클 라 이언 트 는 오류 가 발생 합 니 다.마지막 으로 찾 은 이 유 는 delimiter 가 설정 되 어 있 지 않 은 문제 입 니 다.기본적으로 delimiter";"MySQL 에 쿼 리 문 구 를 제출 하 는 데 사용 합 니 다.저장 과정 에서 모든 SQL 문장의 끝 에';'가 있 습 니 다.만약 이때 가 되면,매번";"MySQL 에 제출 하면 당연히 문제 가 생 길 수 있 습 니 다.그래서 MySQL 의 delimiter 를 바 꾸 었 습 니 다.위의 MySQL 저장 과정 은 이렇게 프로 그래 밍 되 었 습 니 다:delimiter/;     -- MySQL delimiter 를"//"drop procedure if exists pr 로 변경 합 니 다.stat_agent // -- call pr_stat_agent ('2008-07-17', '2008-07-18') create procedure pr_stat_agent (    pi_date_from  date   ,pi_date_to    date ) begin    -- check input    if (pi_date_from is null) then       set pi_date_from = current_date();    end if;    if (pi_date_to is null) then       set pi_date_to = pi_date_from;    end if;    set pi_date_to = date_add(pi_date_from, interval 1 day);    -- stat    select agent, count(*) as cnt      from apache_log     where request_time >= pi_date_from       and request_time <  pi_date_to     group by agent     order by cnt desc; end; // delimiter ; //   -- 기본 MySQL delimiter 로 되 돌리 기:";"물론 MySQL delimiter 기 호 는 자 유 롭 게 설정 할 수 있 습 니 다.'/'또는'$$'등 을 사용 할 수 있 습 니 다.그러나 MySQL 저장 과정 에서 흔히 볼 수 있 는 용법 은'/'와'$$'입 니 다.위의 이 부분 은 SQLyog 에 있 는 코드 를 MySQL 명령 클 라 이언 트(MySQL Command Line Client)로 옮 겼 지만 실행 할 수 없습니다.mysql> delimiter //;     -- MySQL delimiter 를"//"mysql>mysql>drop procedure if exists pr 로 변경 합 니 다.stat_agent //     ->     -> -- call pr_stat_agent ('2008-07-17', '2008-07-18')     ->     -> create procedure pr_stat_agent     -> (     ->    pi_date_from  date     ->   ,pi_date_to    date     -> )     -> begin     ->    -- check input     ->    if (pi_date_from is null) then     ->       set pi_date_from = current_date();     ->    end if;     ->     ->    if (pi_date_to is null) then     ->       set pi_date_to = pi_date_from;     ->    end if;     ->     ->    set pi_date_to = date_add(pi_date_from, interval 1 day);     ->     ->    -- stat     ->    select agent, count(*) as cnt     ->      from apache_log     ->     where request_time >= pi_date_from     ->       and request_time <  pi_date_to     ->     group by agent     ->     order by cnt desc;     -> end; //     ->     -> delimiter ; //   -- 기본 MySQL delimiter 로 되 돌리 기:";"    -> //     -> //     -> //     -> ;     -> ;     -> 정말 이상 하 다!마침내 문 제 를 발 견 했 습 니 다.MySQL 명령 행 에서"delimiter//"를 실행 합 니 다.MySQL 의 delimiter 는 실제로"/;"입 니 다.우리 가 예상 한'/'가 아니다.사실"delimiter//"명령 만 실행 하면 됩 니 다.mysql> delimiter //     -- "끝 에 부 호 를 쓰 지 마 세 요."mysql> mysql> drop procedure if exists pr_stat_agent // Query OK, 0 rows affected (0.00 sec) mysql> mysql> -- call pr_stat_agent ('2008-07-17', '2008-07-18') mysql> mysql> create procedure pr_stat_agent     -> (     ->    pi_date_from  date     ->   ,pi_date_to    date     -> )     -> begin     ->    -- check input     ->    if (pi_date_from is null) then     ->       set pi_date_from = current_date();     ->    end if;     ->     ->    if (pi_date_to is null) then     ->       set pi_date_to = pi_date_from;     ->    end if;     ->     ->    set pi_date_to = date_add(pi_date_from, interval 1 day);     ->     ->    -- stat     ->    select agent, count(*) as cnt     ->      from apache_log     ->     where request_time >= pi_date_from     ->       and request_time <  pi_date_to     ->     group by agent     ->     order by cnt desc;     -> end; // Query OK, 0 rows affected (0.00 sec) mysql> mysql> delimiter ;  -- 마지막 으로"/"my sql>기 호 를 사용 하지 마 십시오.그리고 MySQL 데이터베이스 에서 파일 에 있 는 SQL 코드 를 실행 할 수 있 습 니 다.예 를 들 어,나 는 위 에 저 장 된 과정의 코드 를 파일 d:\pr 에 두 었 다.stat_agent.sql 중.아래 코드 를 실행 하여 저장 과정 을 만 들 수 있 습 니 다.mysql> source d:\pr_stat_agent.sql Query OK,0 rows affected(0.00 sec)Query OK,0 rows affected(0.00 sec)source 명령 의 줄 임 말 형식 은"\."my sql>\.d:\prstat_agent.sql Query OK,0 rows affected(0.00 sec)Query OK,0 rows affected(0.00 sec)마지막 으로 MySQL 의 클 라 이언 트 도 구 는 일부 지역 에서 각자 정 치 를 하고 각각 한 세트 가 있 음 을 알 수 있 습 니 다.

좋은 웹페이지 즐겨찾기