mysql 存储过程怎么赋值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 存储过程怎么赋值?相关的知识,希望对你有一定的参考价值。
如图所以,我用游标查询出值赋值table_names 变量,现在我想把table_name 变量的值赋给下面那条语句,请问怎么赋值?我现在这样它table_name变量直接当表名了,报一个表不存在的错误。
DELIMITER $$USE `test`$$
DROP PROCEDURE IF EXISTS `p_getAllTablesCount`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_getAllTablesCount`()
BEGIN
DECLARE tableName VARCHAR (100);
DECLARE tablesn VARCHAR (100);
DECLARE tableCount INT;
DECLARE stopFlag INT;
DECLARE sqlStr VARCHAR(1000);
-- 注意:请修改数据库名称
DECLARE cursor_name CURSOR FOR SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema='test';
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stopFlag=1;
CREATE TABLE IF NOT EXISTS temp_table(table_name VARCHAR(100),table_count VARCHAR(100));
OPEN cursor_name;
REPEAT
FETCH cursor_name INTO tableName;
SET sqlStr = CONCAT('SELECT COUNT(1) into @tableCount FROM ', tableName);
SELECT sqlStr INTO @sqlStr;
-- select @sqlStr;
SELECT @tableCount INTO tableCount;
BEGIN
PREPARE stepInsertIntoTable FROM @sqlStr;
EXECUTE stepInsertIntoTable;
END;
SET sqlStr = CONCAT('insert into temp_table values(''',CONCAT(tableName),''',''',CONCAT(tableCount),''');');
SELECT sqlStr INTO @sqlStr;
BEGIN
PREPARE stepInsertIntoTable FROM @sqlStr;
EXECUTE stepInsertIntoTable;
END;
UNTIL stopFlag END REPEAT;
CLOSE cursor_name;
SELECT table_name,table_count FROM temp_table ORDER BY table_count DESC;
-- PREPARE step FROM @sql1;
-- EXECUTE step;
DROP TABLE temp_table;
END$$
DELIMITER ;追问
是能赋值成功了,但是查询数据一直为0。。怎么回事?
你的可以调试啊,用的是什么环境啊? 你需要编译执行啊!
BEGIN
PREPARE stepInsertIntoTable FROM @sqlStr;
EXECUTE stepInsertIntoTable;
END;
调试工具 Debugger for mysql,你需要可以给你发或者你百度下载一个。
我把语句换了就报这么一个错,意思是说:你有一个错误在您的sql语法,检查对应于您的mysql服务器版本的手册正确的语法使用“在1号线附近,你能看出什么问题不?蛋疼啊。实在不懂mysql。。。
你debug的时候,为什么 没有打印完整啊?
我也不清楚,反正调试的时候那个sqlstr就是显示那么多?如果我把where 条件去掉便成功。无语啊!!
追答要不 你把整个 SQL脚本发给我,我调试看看?
追问我明白了,声明变量的时候只声明了varchar(100),爆汗啊、、、。
参考技术A Mysql存储过程查询结果赋值到变量的方法把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的方式来实现赋值。示例代码:
drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);
drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 多个列的情况下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
delimiter ;
call pro_test_3(); 参考技术B insert into sddd(dsfsafa)values("dfdfdfe");
mysql存储过程中怎么在循环中取变量值???
我在存储过程里,定义了5个变量都是datetime类型:endTime1,endTime2,endTime3,endTime4,endTime5;
declare i int default 1;
我想在循环里取这5个endTime的值,然后insert表里,
WHILE i<=3 DO
insert into table values (endTime+i); // endTime+i 这是java的写法,请问mysql里有类似的写法么?有什么好办法取这几个变量吗?
set i=i+1;
END WHILE;
endTime+i 这是java的写法,请问mysql里有类似的写法么?有什么好办法取这几个变量的值?
有什么好办法么?
BEGIN
DECLARE V_I INT DEFAULT 0;
START TRANSACTION;
WHILE V_I<=5 DO
SET V_I=V_I+1;
SET @V=V_I;
SET @INSERTSTR=CONCAT('INSERT INTO TB_LOG(ID) VALUES(?)');
PREPARE STMT FROM @INSERTSTR;
EXECUTE STMT USING @V;
END WHILE;
DEALLOCATE PREPARE STMT;
COMMIT;
END;
与以上代码类似追问
你好,我这么写。运行的结果是个字符串。
我想v_insertStr的值为datetime类型的,
我想循环输出endTime1,endTime2,endTime3,endTime4的值。该怎么修改下呢?
以上是关于mysql 存储过程怎么赋值?的主要内容,如果未能解决你的问题,请参考以下文章