MySQL에서 디버깅 메시지를 stdout, temptable 또는 logfile로 인쇄하는 방법이 있습니까? 다음과 같은 것 :
print
SQLServer에서DBMS_OUTPUT.PUT_LINE
Oracle에서
답변:
옵션 1 : 실행될 때 stdout에 '주석'을 인쇄하려면이를 프로 시저에 넣으십시오.
SELECT 'Comment';
옵션 2 : 이것을 프로 시저에 넣어 변수와 함께 stdout에 인쇄합니다.
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
myvar is 5
프로 시저가 실행될 때 stdout에 인쇄 됩니다.
옵션 3,이라는 하나의 텍스트 열이있는 테이블을 tmptable
만들고 메시지를 푸시합니다.
declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
위의 내용을 저장 프로 시저에 넣을 수 있으므로 작성해야하는 것은 다음과 같습니다.
CALL log(concat('the value is', myvar));
몇 가지 키 입력을 저장합니다.
옵션 4, 파일에 메시지 기록
select "penguin" as log into outfile '/tmp/result.txt';
이 명령에는 매우 엄격한 제한이 있습니다. 'others'그룹에 생성 및 쓰기 권한을 부여하는 디스크의 영역에만 outfile을 쓸 수 있습니다. / tmp 디렉토리에 저장하면 작동합니다.
또한 일단 outfile을 작성하면 덮어 쓸 수 없습니다. 이는 크래커가 웹 사이트에 SQL을 주입하고 MySQL에서 임의의 명령을 실행할 수 있기 때문에 크래커가 상자를 루팅하는 것을 방지하기위한 것입니다.
Not allowed to return a result set from a trigger
, 어떤 생각?
한 가지 해결 방법은 다른 절없이 select를 사용하는 것입니다.
무언가를 인쇄하는 빠른 방법은 다음과 같습니다.
select '** Place your mesage here' AS '** DEBUG:';
일반적으로 저장 프로 시저가있는 로그 테이블을 만들어 로그에 기록합니다. 개발중인 프로 시저에서 필요할 때마다 로깅 프로 시저를 호출합니다.
이 같은 질문에 대한 다른 게시물 을 보면 몇 가지 대안이 있지만 일반적인 관행처럼 보입니다.
이것이 내가 디버깅하는 방법입니다.
CREATE PROCEDURE procedure_name()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SHOW ERRORS; --this is the only one which you need
ROLLBACK;
END;
START TRANSACTION;
--query 1
--query 2
--query 3
COMMIT;
END
쿼리 1, 2 또는 3에서 오류가 발생하면 HANDLER는 SQLEXCEPTION을 포착하고 SHOW ERRORS는 오류를 표시합니다. 참고 : SHOW ERRORS는 HANDLER의 첫 번째 문이어야합니다.