代码如下:
// 这个是满足条件需要调用的存储过程 可以看下上篇存储过程迁移数据篇
drop PROCEDURE if EXISTS test_dept;
CREATE PROCEDURE test_dept ()
BEGIN
DECLARE d_id INT ( 11 ) DEFAULT 0;
DECLARE d_name VARCHAR ( 64 ) DEFAULT NULL;
DECLARE d_level VARCHAR ( 64 ) DEFAULT NULL;
DECLARE flag INT default false;
DECLARE cur_test CURSOR FOR SELECT id,dept_name,dept_level FROM dept;
DECLARE CONTINUE HANDLER FOR NOT found SET flag = TRUE;
OPEN cur_test;
read_loop : LOOP
FETCH cur_test INTO d_id,d_name,d_level;
IF
flag THEN
LEAVE read_loop;
END IF;
INSERT IGNORE INTO dept_copy2 ( id, dept_name, dept_level )
VALUES
( d_id, d_name, d_level );
END LOOP;
CLOSE cur_test;
END;
call test_dept();
// 这里是我单独写的测试 判断是否存在该库该表
select count(*) from information_schema.tables where table_schema='test_kettle' and table_name ='dept';
// 动态测试sql
// 判断存储过程是否存在 进行删除操作 不明白可以查看存储过程的创建
drop PROCEDURE if EXISTS table_index_test;
// 创建存储过程 database_name 库名 table_name表名
create PROCEDURE table_index_test(IN database_name varchar(128),IN table_name varchar(128))
// 存储里面 每一步要有分好结尾 否则会报错
begin
// 定义使用的局部变量
DECLARE table_index int(11) default 0;
DECLARE table_str varchar(64) default null;
DECLARE SqlStr varchar(500) default null;
set @tableIndex=table_index;
set @p=database_name;
set @p2=table_name;
// 写死的方式
// select count(*) INTO table_index from information_schema.tables where table_schema='test_kettle' and table_name ='dept_copy2';
// 这里最好这样写 如果使用@sqlstr直接复制 不知道为什么会报错
// 里面的参数使用全局参数 不然会报错 @tableIndex
// set @sqlstr='select count(*) INTO @tableIndex from information_schema.tables where table_schema=? and table_name=?'; //会出错
set SqlStr='select count(*) INTO @tableIndex from information_schema.tables where table_schema=? and table_name=?';
set @sqlstr=SqlStr;
PREPARE stm from @sqlStr; // 预编译
EXECUTE stm USING @p,@p2;// 执行sql
DEALLOCATE PREPARE stm; // 释放prepare
set table_index=@tableIndex; // 赋值给定义的局部变量
if table_index <> 0 then
-- call test_dept();
set table_str='存在';
end if;
SELECT @p; // 查看结果
SELECT @p2;
SELECT table_index;
SELECT table_str;
end;
call table_index_test('test_kettle1','dept_copy2');