MySQL хранимая процедура с курсором
проблема с курсором Mysql?
Я написал хранимую процедуру, которая будет перемещать запись из одной таблицы и вставлять их в 2-3 разные таблицы использование инструкций insert.
проблема в том, что я проверяю, не существует ли запись в table1, тогда я вставляю запись из temptable в table1 ,table2 последовательно ,но у условия есть какая-то проблема, я не знаю, что она всегда переходит в другую часть.
пример кода как следует:
CREATE PROCEDURE `insertData`(In clientNo INT,In usedID INT)
BEGIN
declare mame varchar(100);
declare address varchar(100);
declare city varchar(50);
declare IdentityNO1 varchar(20)
declare cur1 cursor for select * from temptable;
declare continue handler for not found set done=1;
SET @clientNo = clientNO;
SET @userID = userID;
set done = 0;
open cur1;
igmLoop: loop
fetch cur1 into Name,Address,City,IdentityNO1,clientNo;
if done = 1 then leave igmLoop; end if;
//If no record exists in some records table1,table2.
IF ( (SELECT COUNT(*) FROM table1
WHERE IndentityNo=IdentityNo1
AND clientNo=@clientNo) < = 0)
INSERT INTO table1 (Name,IdentityNO) VALUES (name,IdentityNO1);
INSERT INTO table2 (Address,City) VALUES(address,city);
ELSE
INSERT INTO tblexceptional(Name,Address,City,IdentityNo)
VALUES(name,address,city,IdentityNo1);
end loop igmLoop;
close cur1;
END
1 ответов
нет THEN
, ни END IF
ключевые слова, процедура не может скомпилировать.
Проверьте правильность синтаксисаIF
заявление:http://dev.mysql.com/doc/refman/5.7/en/if.html
Использовать EXIST
оператор вместо (SELECT count(*)... ) <=0
,
прочитайте эту ссылку, чтобы узнать причину: http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx
IF EXISTS(
SELECT null FROM table1
WHERE IndentityNo=IdentityNo1
AND clientNo=@clientNo
)
THEN
INSERT INTO table1 (Name,IdentityNO) VALUES (name,IdentityNO1);
INSERT INTO table2 (Address,City) VALUES(address,city);
ELSE
INSERT INTO tblexceptional(Name,Address,City,IdentityNo)
VALUES(name,address,city,IdentityNo1);
END IF;
Я рекомендуется использовать некоторые префиксы для Аргументов процедуры и имен переменных, чтобы избежать двусмысленности, например, использовать p_
для параметров и v_
для переменных. Трудно догадаться, глядя на этот код, какое имя является именем столбца, переменной или параметром процедуры. Это может привести к ошибкам и ошибкам.
Избегайте использования SELECT *
- этот код завершится ошибкой, если кто-то изменит структуру таблицы. Явно перечислить необходимые столбцы в курсоре объявление:
declare cur1 cursor for
select name,Address,City,IdentityNO,clientNo
from temptable;
исправленная процедура может выглядеть так:
CREATE PROCEDURE `insertData`(In p_clientNo INT,In p_usedID INT)
BEGIN
declare v_name varchar(100);
declare v_address varchar(100);
declare v_city varchar(50);
declare v_IdentityNO varchar(20)
declare v_clientNo int
declare cur1 cursor for
select name,Address,City,IdentityNO,clientNo
from temptable;
declare continue handler for not found set done=1;
set done = 0;
open cur1;
igmLoop: loop
fetch cur1 into v_name,v_Address,v_City,v_IdentityNO,v_clientNo;
if done = 1 then leave igmLoop; end if;
//If no record exists in some records table1,table2.
IF EXISTS( SELECT 1 FROM table1
WHERE IndentityNo = v_IdentityNo
AND clientNo = v_clientNo)
INSERT INTO table1 (Name,IdentityNO) VALUES (v_name,v_IdentityNO);
INSERT INTO table2 (Address,City) VALUES(v_address,v_city);
ELSE
INSERT INTO tblexceptional(Name,Address,City,IdentityNo)
VALUES(v_name,v_address,v_city,v_IdentityNo);
END IF;
end loop igmLoop;
close cur1;
END