2

別の 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 ) ;

user_id は自動インクリメント pk ではなく、ユーザーの識別番号であるため、関数 last_insert_id() は私のケースでは機能しません。SQL ステートメントの実行をテストするために使用される関数は何ですか。

4

4 に答える 4

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
于 2012-05-02T06:35:16.140 に答える
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 変数には「影響を受けた行はありません」が含まれます。これはあなたが探していたものですか、それとも私の誤解ですか...

于 2012-05-02T06:46:12.633 に答える
1

使用している DMBS を指定しなかったため、MySQL を想定します (MySQL のように見えます。そうでない場合は指定してください)。INSERTステートメントには、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これにより、句があるかどうかに関係なく、見つかった行の総数がわかります。

于 2012-05-02T06:35:24.200 に答える
0

SQLCODE の値をテストする必要があります

SQLCA データ構造の最も重要で広く使用されているフィールドは、SQLCODE 変数です。Microsoft® SQL Server™ 2000 は、Embedded SQL ステートメントを実行するたびに、SQLCODE 変数の値を設定して、最後の Embedded 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 エンジンで利用可能な標準です)

于 2012-05-02T06:34:54.140 に答える