2017-08-19 12 views
0

Ich habe eine gespeicherte Prozedur erstellt, wie ich ein Szenario haben möchte, wo ich die nächste Nummer aus der Datenbank abrufen möchte.mysql gespeicherte Prozedur erhöht inkonsistent alle Datensätze

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 ; 

Anfangsspaltenwerte

Initial value before calling stored procedure

letzten Spalt Wert nach Aufruf der gespeicherten Prozedur

call INCREMENT_IDENTIFIERS('urn'); 

Final Column Values after calling stored procedure

Jetzt ist mein Problem, dass diese gespeicherte Prozedur beide Zeilen inkrementiert, selbst wenn ich die exakte Übereinstimmung Eingabebedingung übergeben, und beide Zeilen als Ausgabe mit inkrementierten Werten zurückgeben.

+0

Es ist nicht notwendig, [9.4 User Defined Variables] (https://dev.mysql.com/doc/refman/5.7/en/user-variables.html) zu verwenden, kann den Eingabeparameter oder einen [ 13.6.4.1 Lokale Variable DECLARE Syntax] (https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html). – wchiquito

+0

@wchiquito können Sie bitte erarbeiten, eigentlich muss ich diese Prozedur von meinem Java-Code aufrufen. Daher muss ich eine benutzerdefinierte Variable für einen bestimmten Schlüssel definieren, den ich inkrementieren möchte. –

Antwort

1

Es ist nicht notwendig, eine 9.4 User-Defined Variables zu verwenden, können die Eingabeparameter verwenden oder ein 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) 

Siehe db-fiddle.

UPDATE

Vermeiden Sie Spaltennamen als Parameternamen verwenden:

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) 

Neuer Parameter Name:

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 See.

Überprüfen Sie die Dokumentation 13.6.4.2 Local Variable Scope and Resolution.

UPDATE 2

Eine weitere Option (weniger empfohlen) ist qualifizierte Spaltennamen zu verwenden (APS_IDENTIFIERS.KEY_NAME):

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 See.

Überprüfen Sie die Dokumentation 9.2.1 Identifier Qualifiers.

+0

Danke für die schnelle Antwort. Ich denke, der Hauptfehler bestand darin, denselben Variablennamen wie den Spaltennamen zu verwenden. –

+1

@AnkurJain: Siehe neues Update. – wchiquito

Verwandte Themen