Có cách nào trong MySQL để in thông báo gỡ lỗi tới stdout, temptable hoặc logfile không? Cái gì đó như:
print
trong SQLServerDBMS_OUTPUT.PUT_LINE
trong Oracle
Câu trả lời:
Tùy chọn 1: Đặt điều này vào thủ tục của bạn để in 'nhận xét' ra stdout khi nó chạy.
SELECT 'Comment';
Tùy chọn 2: Đặt điều này trong thủ tục của bạn để in một biến với nó thành stdout:
declare myvar INT default 0;
SET myvar = 5;
SELECT concat('myvar is ', myvar);
Điều này in myvar is 5
thành stdout khi thủ tục chạy.
Tùy chọn 3, Tạo một bảng với một cột văn bản được gọi tmptable
và đẩy các thông báo vào đó:
declare myvar INT default 0;
SET myvar = 5;
insert into tmptable select concat('myvar is ', myvar);
Bạn có thể đặt ở trên trong một thủ tục được lưu trữ, vì vậy tất cả những gì bạn sẽ phải viết là:
CALL log(concat('the value is', myvar));
Điều này giúp tiết kiệm một vài lần nhấn phím.
Tùy chọn 4, Ghi tin nhắn vào tệp
select "penguin" as log into outfile '/tmp/result.txt';
Có những hạn chế rất nặng đối với lệnh này. Bạn chỉ có thể ghi outfile vào các vùng trên đĩa cấp cho nhóm 'những người khác' quyền tạo và ghi. Nó sẽ hoạt động khi lưu nó vào thư mục / tmp.
Ngoài ra, một khi bạn ghi ra tệp tin, bạn không thể ghi đè nó. Điều này là để ngăn những kẻ bẻ khóa không root hộp của bạn chỉ vì chúng đã chèn SQL vào trang web của bạn và có thể chạy các lệnh tùy ý trong MySQL.
Not allowed to return a result set from a trigger
, bất kỳ ý tưởng?
Một cách giải quyết là chỉ sử dụng select mà không có bất kỳ mệnh đề nào khác.
Tôi thường tạo bảng nhật ký với một thủ tục được lưu trữ để đăng nhập vào nó. Gọi thủ tục ghi nhật ký bất cứ nơi nào cần thiết từ thủ tục đang được phát triển.
Nhìn vào các bài đăng khác về cùng câu hỏi này, nó có vẻ như là một thực tế phổ biến, mặc dù có một số lựa chọn thay thế.
Cách nhanh chóng để in thứ gì đó là:
select '** Place your mesage here' AS '** DEBUG:';
Đây là cách tôi sẽ gỡ lỗi:
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
Nếu truy vấn 1, 2 hoặc 3 xuất hiện lỗi, HANDLER sẽ bắt lỗi SQLEXCEPTION và SHOW ERRORS sẽ hiển thị lỗi cho chúng tôi. Lưu ý: HIỂN THỊ LỖI phải là câu lệnh đầu tiên trong HANDLER.