2017-08-19 9 views
0

データベースから次の番号を取得するシナリオが必要なので、ストアドプロシージャを作成しました。mysqlストアドプロシージャは一貫性のないすべてのレコードをインクリメントします

DELIMITER $$ 
CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(IN key_name varchar(30)) 
BEGIN 
    SET @keyName := key_name; 
    UPDATE APS_IDENTIFIERS SET COUNTER = COUNTER + 1 WHERE KEY_NAME = @keyName; 
    SELECT * FROM APS_IDENTIFIERS WHERE KEY_NAME = @keyName; 
END$$ 
DELIMITER ; 

初期の列は

call INCREMENT_IDENTIFIERS('urn'); 

Final Column Values after calling stored procedure

ストアドプロシージャを呼び出した後

Initial value before calling stored procedure

最終列の値を値

今私の問題は、正確な一致入力条件を渡していても、このストアドプロシージャが両方の行をインクリメントし、インクリメントされた値を持つ出力として両方の行を返す理由です。

+0

[9.4ユーザ定義変数](https://dev.mysql.com/doc/refman/5.7/en/user-variables.html)を使用する必要はなく、入力パラメータまたは[ 13.6.4.1ローカル変数DECLARE構文](https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html)。 – wchiquito

+0

@wchiquitoあなたは詳細を教えてください。実際には、Javaコードからこのプロシージャを呼び出す必要があります。したがって、増分したい特定のキーに対してユーザー定義変数を定義する必要があります。 –

答えて

1

これは、入力パラメータを使用することができ、9.4 User-Defined Variablesを使用する必要はありませんか13.6.4.1 Local Variable DECLARE Syntax

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `in_key_name` VARCHAR(30) 
    ->) 
    -> BEGIN 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = `in_key_name`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = `in_key_name`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+----------+---------+ 
| KEY_NAME | COUNTER | 
+----------+---------+ 
| urn  |  3 | 
+----------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

db-fiddleを参照してください。パラメータ名として列名を使用して

UPDATE

避けてください:

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `key_name` VARCHAR(30) -- CHANGE NAME 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+------------+---------+ 
| `KEY_NAME` | COUNTER | 
+------------+---------+ 
| urn  |  69 | 
| urn  |  3 | 
+------------+---------+ 
2 rows in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

新しいパラメータ名:

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `_key_name` VARCHAR(30) -- NEW NAME 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `_key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+----------+---------+ 
| KEY_NAME | COUNTER | 
+----------+---------+ 
| urn  |  3 | 
+----------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

db-fiddleを参照してください。

13.6.4.2 Local Variable Scope and Resolutionを確認してください。

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `INCREMENT_IDENTIFIERS`(
    -> `key_name` VARCHAR(30) 
    ->) 
    -> BEGIN 
    -> SET @`keyName` := `key_name`; 
    -> UPDATE `APS_IDENTIFIERS` 
    -> SET `COUNTER` = `COUNTER` + 1 
    -> WHERE `APS_IDENTIFIERS`.`KEY_NAME` = @`keyName`; 
    -> SELECT `KEY_NAME`, `COUNTER` 
    -> FROM `APS_IDENTIFIERS` 
    -> WHERE `APS_IDENTIFIERS`.`KEY_NAME` = @`keyName`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `INCREMENT_IDENTIFIERS`('urn'); 
+------------+---------+ 
| `KEY_NAME` | COUNTER | 
+------------+---------+ 
| urn  |  3 | 
+------------+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

db-fiddleを参照してください:

UPDATE 2

別のオプション(以下を推奨)が修飾された列名(APS_IDENTIFIERS.KEY_NAME)を使用することです。

9.2.1 Identifier Qualifiersを確認してください。

+0

迅速な対応をありがとうございます。大きな間違いは、列名のような同じ変数名を使用していたと思います。 –

+1

@AnkurJain:新しいアップデートを参照してください。 – wchiquito

関連する問題