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 의 클 라 이언 트 도 구 는 일부 지역 에서 각자 정 치 를 하고 각각 한 세트 가 있 음 을 알 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: