2012-05-02 169 views
2

如何在執行另一個SQL語句之前檢查sql語句是否已執行。檢查sql語句是否已執行

我作出這樣

DECLARE tempId double default 2; 
insert IGNORE into `system_users`(`user_id`,`username`,`password`) values (id , userName ,md5(password)) ; 

    set tempId= last_insert_id(); 

    IF tempId <> 0 THEN  
     insert into `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy) ; 

函數LAST_INSERT_ID(),因爲user_id是不是自動增量PK不與我的情況下工作,這是FOT用戶識別號碼。什麼是用來測試sql語句執行的函數。

+0

你的DBMS是否允許你使用交易? – Filburt

+0

嗯你是什麼意思交易? – palAlaa

+0

我指的是[數據庫事務](http://en.wikipedia.org/wiki/Database_transaction)。 – Filburt

回答

1

你沒有指定你使用的,所以我會承擔什麼樣的MySQL DMBS(它看起來像MySQL的給我,請註明否則)對於INSERT語句,使用ROW_COUNT()

Eg

DECLARE tempId double default 2; 
insert IGNORE into `system_users`(`user_id`,`username`,`password`) values (id , userName ,md5(password)) ; 

set tempId= ROW_COUNT(); 

這將返回受影響的行數。

而且,請注意SELECT語句,你可以使用FOUND_ROWS()

例如

SELECT SQL_CALC_FOUND_ROWS * FROM MyTable; 
SELECT FOUND_ROWS(); 

雖然這會告訴你找到的行的總數,不管你是否擁有一個LIMIT條款。

0

你要測試SQLCODE值

SQLCA數據結構的最重要和最廣泛使用的字段是SQLCODE變量。每次Microsoft®SQL Server™2000運行嵌入式SQL語句時,它都會設置SQLCODE變量的值以指示是否成功完成最後一次嵌入式SQL語句。值爲0表示上一次嵌入式SQL語句成功。 0以外的值表示警告或錯誤。

http://msdn.microsoft.com/en-us/library/aa225200(v=sql.80).aspx

型動物SQLCODE值的列表:http://www.caliberdt.com/tips/sqlcode.htm

(我把MSSQL Server,但SQLCODE爲標準,可在每一個SQL引擎)

2

也許這樣的事情。看看插入行已經存在:

insert IGNORE into `system_users`(`user_id`,`username`,`password`) values (id , userName ,md5(password)) ; 

    IF NOT EXISTS(SELECT NULL FROM system_users WHERE system_users=id) 
    BEGIN  
     insert into `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy) ; 
    END 
1

您可以在存儲過程結束之前添加它,它會指示是否有任何記錄受到影響。

IF @@ROWCOUNT <>1 
    BEGIN 
    RAISERROR ('An error occured',10,1) 
    RETURN -1 
    END 

對於〔實施例

DECLARE tempId double default 2; 
    insert IGNORE into `system_users`(`user_id`,`username`,`password`) values (id , userName ,md5(password)) ; 

    IF NOT EXISTS(SELECT NULL FROM system_users WHERE system_users=id) 
    BEGIN  
    insert into `user_profile`(`user_id`, `full_name`, `cellphone`, `Date_time_ added`,`added_by`) values (id, fullName ,cellPhone , CURRENT_TIMESTAMP(),addedBy) ; 

    IF @@ROWCOUNT <>1 
    BEGIN 
    RAISERROR ('No rows were affected',10,1) 
    RETURN -1 
    END 
    END 

因此,RAISERROR變量將包含「不行受到影響」,如果沒有修改的行。這是你正在尋找的,還是我誤解...