Почему моя хранимая процедура не использует параметры, которые я ей передаю? - MySQL

0

Я пытаюсь создать хранимую процедуру, которая будет обновлять один столбец таблицы с возрастающими возрастающими числами.

Код, который у меня есть

CREATE DEFINER='cis23383518'@'192.168.122.1' PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
DECLARE i INT;
SET i = 0;
UPDATE TheTable 
SET TheID = i,i= i+1;
END

Я называю процедуру следующим образом

CALL Increment_rows('Officer','IncidentID');

Я получаю следующую ошибку: Таблица cis23383518.TheTable не существует.

Теги:
stored-procedures

2 ответа

0

mysql не будет подставлять имя таблицы с предоставленным параметром, обновление ищет таблицу, называемую таблицей. Если вы хотите указать имя таблицы для этой процедуры, вам нужно будет построить инструкцию sql и подать, например

DROP PROCEDURE IF EXISTS 'Increment_rows';
DELIMITER $$

CREATE  PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN

set @sqlstmt =  concat('UPDATE ', THETABLE, ' SET STATUS =  (SELECT @I:=@I + 1 FROM (SELECT @I:=0) I) ORDER BY ID DESC;');
SELECT @SQLSTMT;
prepare stmt from @sqlstmt;
execute stmt;
deallocate prepare stmt;

END $$

Обратите внимание на использование переменной для увеличения столбца состояния. так что

+----+----------+--------+
| id | username | status |
+----+----------+--------+
|  1 | John     |      0 |
|  2 | Jane     |      0 |
|  3 | Ali      |      0 |
|  6 | Bruce    |      0 |
|  7 | Martha   |      0 |
|  8 | Sidney   |      0 |
| 10 | charlie  |      0 |
| 12 | Elisa    |      0 |
| 14 | Samantha |      0 |
| 15 | Hannah   |      0 |
| 16 | Hannah   |      0 |
| 17 | Kevin    |      0 |
| 18 | Kevin    |      0 |
| 19 | Ruth     |      0 |
+----+----------+--------+
14 rows in set (0.00 sec)

MariaDB [sandbox]> CALL Increment_rows('USERS','INCIDENTID');
+----------------------------------------------------------------------------------------+
| @SQLSTMT                                                                               |
+----------------------------------------------------------------------------------------+
| UPDATE USERS SET STATUS =  (SELECT @I:=@I + 1 FROM (SELECT @I:=0) I) ORDER BY ID DESC; |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

MariaDB [sandbox]> select id,username,status from users;
+----+----------+--------+
| id | username | status |
+----+----------+--------+
|  1 | John     |     14 |
|  2 | Jane     |     13 |
|  3 | Ali      |     12 |
|  6 | Bruce    |     11 |
|  7 | Martha   |     10 |
|  8 | Sidney   |      9 |
| 10 | charlie  |      8 |
| 12 | Elisa    |      7 |
| 14 | Samantha |      6 |
| 15 | Hannah   |      5 |
| 16 | Hannah   |      4 |
| 17 | Kevin    |      3 |
| 18 | Kevin    |      2 |
| 19 | Ruth     |      1 |
+----+----------+--------+
14 rows in set (0.02 sec)

Примечание. Мне кажется, что вашему оператору обновления может понадобиться оператор where.

0

REFINER не является обязательным.

Если вы вызываете процедуру с тем же идентификатором пользователя, для которого она была создана, просто отпустите ее:

CREATE PROCEDURE 'Increment_rows'(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
DECLARE i INT;
SET i = 0;
UPDATE TheTable 
SET TheID = i,i= i+1;
END

Ещё вопросы

Сообщество Overcoder
Наверх
Меню