Mysql利用存储过程动态拼接sql查询数据

代码如下:

// 这个是满足条件需要调用的存储过程 可以看下上篇存储过程迁移数据篇
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');

你可能感兴趣的:(#,mysql,mysql,sql,数据库)