2012-05-02 22 views
2

他のSQL文を実行する前にSQL文が実行されているかどうかを確認する方法。SQL文が実行されたことを確認してください

は私がUSER_IDが自動インクリメントPKではないので、私の場合では動作しません。この

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()のように作る、それがユーザーFOT識別番号です。 SQLステートメントの実行をテストするために使用される関数は何ですか?

+0

DBMSでトランザクションを使用できますか? – Filburt

+0

Mmmトランザクションとはどういう意味ですか? – palAlaa

+0

私は[データベーストランザクション](http://en.wikipedia.org/wiki/Database_transaction)を参照しています。 – Filburt

答えて

1

あなたはあなたが私はMySQLを仮定しますので、使用しているDMBS何を指定していないINSERT文、使用のために(そうでない場合、それは私にはMySQLのように見えます、ご指定ください) ROW_COUNT()

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

あなたが

SQLCAデータ構造体の中で最も重要かつ広く使われているフィールドは、SQLCODE変数であるSQLCODEの値をテストする必要があります。 Microsoft®SQL Server™2000はEmbedded SQL文を実行するたびに、最後のEmbedded SQL文が正常に完了したかどうかを示すSQLCODE変数の値を設定します。 0の値は、最後のEmbedded SQL文が成功したことを示します。 0以外の値は、警告またはエラーを示します。貴様のSQLCODE値の

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

一覧:http://www.caliberdt.com/tips/sqlcode.htm

たぶん、このような何かを

2

を(私は、MSSQLサーバーを取ったが、SQLCODEは、すべてのSQLエンジンで利用可能である標準です)。挿入された行が既に存在するかどうかを確認:

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

ストアドプロシージャの最後の前に追加することができます。これは、レコードが影響を受けているかどうかを示します。 exmaple

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 

について

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

したがって、RAISERROR変数は修飾行が存在しない場合、 'いいえ行が影響を受けませんでした' が含まれます。これはあなたが探していたものですか、私は誤解していますか...

関連する問題