改存储过程功能是:检查某个表的记录,如果记录存在则更新其中的一个字段,不存在则插入新的记录。
表的名称,以及各个字段都通过参数传入
问题:
1,通过动态SQL实现了基本的查询,但是无法将prepare的结果返回进行判断(见下/*检查是否存在*/部分)
2,使用了'SELECT w_id INTO pr  (见下/*pr为返回值*/部分),但是调用存储过程的时候,报pr没有定义的错误,这个错误可以理解。
3,现在最,最,最,最 搞不定的就是怎样拿到 “检查”的结果,网上又说用游标来做,但是我没有试成功请高手指教 指教delimiter //
DROP PROCEDURE IF EXISTS insertWFilePerms;//
CREATE PROCEDURE insertWFilePerms(in tableName varchar(20),in id bigint,in perms varchar(20),in passid int,in passtype smallint(5))
BEGIN
DECLARE v_selectsql varchar(500);
DECLARE v_updatesql varchar(500);
DECLARE v_insertsql varchar(500);
DECLARE w_part varchar(200);
DECLARE pr int(10);
SET w_part = concat(' WHERE w_id=',id,' AND w_passid=',passid,' AND w_passtype=',passtype);
SET v_selectsql = concat('SELECT w_id INTO pr FROM ',tableName,w_part);     /*pr为返回值*/
SET v_updatesql = concat('UPDATE ',tableName,'SET w_perms=',perms,w_part);
SET v_insertsql = concat('INSERT INTO ',tableName,' VALUES(',id,',',perms,',',passid,',',passtype,')');
SET @v_selectsql=v_selectsql;
SET @v_updatesql=v_updatesql;
SET @v_insertsql=v_insertsql;prepare stmt from @v_selectsql; /*检查是否存在*/
EXECUTE stmt;
deallocate prepare stmt;
IF pr THEN  /*判断是否存在*/
prepare stmt from @v_updatesql;
EXECUTE stmt ;
deallocate prepare stmt;
ELSE 
prepare stmt from @v_insertsql;
EXECUTE stmt ;
deallocate prepare stmt;
END IF;
END//