2016-06-09 97 views
1

我有3個疑問:MySQL如何檢查查詢是否成功執行?

1. INSERT, 2. UPDATE and 3. DELETE 

我想知道的是有反正這樣,如果成功,或不執行查詢,我可以直接檢查(即不運行另一個查詢檢查)?如果它不(即返回了一些錯誤/異常),那麼我想將該錯誤/異常保存到一些變量中?

例如,下面是我的疑問:

INSERT查詢:

INSERT INTO `users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); 

UPDATE查詢:

UPDATE `test_db2`.`users` 
     SET name = NEW.name, 
      age = NEW.age 
     WHERE id = NEW.id; 

DELETE查詢:

DELETE FROM `test_db2`.`users` 
     WHERE id = OLD.id; 

謝謝。

下面是一個使用處理程序簡單的INSERT觸發器(我想):

DELIMITER // 

-- TRIGGER FOR INSERT 
DROP TRIGGER IF EXISTS `test_db1_users_ai`; 
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW 
BEGIN 
    -- Perform the insert 
    INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); 
    -- Handler if this^above INSERT fails. 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
     GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; 
     --SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text); 
     INSERT INTO `test_db1`.`errors` (error_code, error_message) VALUES (@errno, @text); 
     --SELECT @full_error; 
    END; 
END; // 
+0

可以產生success_flag或狀態或每個手術後你算另一方面,你可以在日誌表中存儲錯誤/消息..這將傳達你的操作記錄:) –

+0

嗨喬丹,雖然,我不想運行另一個操作/查詢來計算/ etc。另外,或者如果我這樣做,那麼我怎樣才能得到失敗時發生的錯誤代碼和消息? – narainsagar

+0

順便說一句,我想插入錯誤'(code,message)'到我的'errors'表中。 – narainsagar

回答

1

在MySQL中,你可以聲明error/warning handlers可以捕獲各種錯誤和警告。如果您將處理程序與get diagnostics command組合在一起,那麼您甚至可以在一般處理程序中捕獲確切的錯誤/警告。

我發現下面的博客帖子上Improve your Stored Procedure Error Handling with GET DIAGNOSTICS,總結了如何捕獲錯誤消息中存儲的程序中的MySQL:

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; 
    SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text); 
    SELECT @full_error; 
END; 

很明顯,你可以登錄@full_error錯誤在表中,如果需要的話。如果沒有錯誤處理程序啓動,那麼sql語句已成功運行。

使用插入和更新,您還可以使用row_count()函數來確定受影響的記錄數。如果這個數字是0,那可能是一個錯誤的指示。

+0

我已經將這個放在查詢行後面的觸發器中,但似乎它在失敗時不起作用。 – narainsagar

+0

由於我是一位非常有經驗的讀者,我可以告訴你,你在第42行的觸發器中犯了一個錯誤。 – Shadow

+0

我不明白。這是什麼意思,即觸發器的第42行? – narainsagar

0

請參閱在這裏:https://stackoverflow.com/a/37853801/5228251

檢查了這一點下方(即,從上述來源複製):

-- TRIGGER FOR INSERT 
DROP TRIGGER IF EXISTS `test_db1_users_ai`; 
CREATE TRIGGER `test_db1_users_ai` AFTER INSERT ON `users` FOR EACH ROW 
BEGIN 
    -- Declare variables to hold diagnostics area information 
    DECLARE errorCode CHAR(5) DEFAULT '00000'; 
    DECLARE errorMessage TEXT DEFAULT ''; 

    -- Declare exception handler for failed insert 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
     GET DIAGNOSTICS CONDITION 1 
     errorCode = RETURNED_SQLSTATE, errorMessage = MESSAGE_TEXT; 
    END; 

    -- Perform the insert 
    INSERT INTO `test_db2`.`users` (id, name, age) VALUES (NEW.id, NEW.name, NEW.age); 

    -- Check whether the insert was successful 
    IF errorCode != '00000' THEN 
     INSERT INTO `errors` (code, message, query_type, record_id, on_db, on_table) VALUES (errorCode, errorMessage, 'insert', NEW.id, 'test_db2', 'users'); 
    END IF; 
END; //