存储过程中是否可以同时提前定义一个语句

Main_csdn_String Java攻城狮  2018-03-08 10:39:51
CREATE PROCEDURE oldCursor(out oldName TEXT,in domainName varchar(50),in tableName varchar(50))
BEGIN
-- 定义变量
DECLARE tmpName TEXT default '';
DECLARE allName TEXT default '';
DECLARE amount int(11) DEFAULT 0;
DECLARE curl CURSOR FOR select COLUMN_NAME from information_schema.COLUMNS where table_name = 'tbl' and table_schema = 'date';
-- 申明 循环操作 游标
DECLARE continue HANDLER FOR SQLSTATE '02000' set tmpname = null;
OPEN curl;
FETCH curl into tmpName;
WHILE(tmpname is not null)DO
set tmpName = CONCAT(tmpName,',OLD.');
set allName = CONCAT(allName,tmpName);
set amount=amount+1;
FETCH curl into tmpName;
end WHILE;
CLOSE curl;
set allName = substring_index(allName,',OLD.',amount);
set oldName = concat('OLD.',allName);
-- llocate prepare stmt;
END;

想在这个基础之上进行再一次的修改

设计如下:
CREATE PROCEDURE oldCursor(out oldName TEXT,in domainName varchar(50),in tableName varchar(50))
BEGIN
-- 定义变量
DECLARE tmpName TEXT default '';
DECLARE allName TEXT default '';
DECLARE amount int(11) DEFAULT 0;
-- 两个变量用于接收传入的值 并且在传入的值中处理预编译的sql
@sysName = domainName;
@listName = tableName;
-- 希望处理的效果是select COLUMN_NAME from information_schema.COLUMNS where table_name = 'tbl' and table_schema = 'date';
set @curlName = concat('select COLUMN_NAME from information_schema.COLUMNS where table_name = ''',@listName,''' and table_schema = ''',@sysName,'''');
-- 然后我用预编译的方式线处理curlNamesql语句
prepare stmt from @curlName;
execute stmt;
set @ee = stme;
-- 根据获取的编译好的sql 放到游标中处理-
DECLARE curl CURSOR FOR @ee;
-- 申明 循环操作 游标
DECLARE continue HANDLER FOR SQLSTATE '02000' set tmpname = null;
OPEN curl;
FETCH curl into tmpName;
WHILE(tmpname is not null)DO
set tmpName = CONCAT(tmpName,',OLD.');
set allName = CONCAT(allName,tmpName);
set amount=amount+1;
FETCH curl into tmpName;
end WHILE;
CLOSE curl;
set allName = substring_index(allName,',OLD.',amount);
set oldName = concat('OLD.',allName);
-- 解除资源
DEALLOCATE prepare stmt;
END;


结果提示编译错误;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE curl CURSOR FOR @ee;
-- 申明 循环操作 游标
DECLARE cont' at line 14

想知道我语法的问题,还是mysql处理的问题。如果可以附上如何处理的思路更好了 感激。!
...全文
635 1 收藏 10
写回复
10 条回复
ZXYperseverance 2018年03月13日
CREATE PROCEDURE oldCursor(out oldName TEXT,in domainName varchar(50),in tableName varchar(50)) BEGIN -- 定义变量 DECLARE tmpName TEXT default ''; DECLARE allName TEXT default ''; DECLARE amount int(11) DEFAULT 0; DECLARE curl CURSOR FOR select COLUMN_NAME from information_schema.COLUMNS where table_name = domainName and table_schema = domainName; -- 申明 循环操作 游标 DECLARE continue HANDLER FOR SQLSTATE '02000' set tmpname = null; OPEN curl; FETCH curl into tmpName; WHILE(tmpname is not null)DO set tmpName = CONCAT(tmpName,',OLD.'); set allName = CONCAT(allName,tmpName); set amount=amount+1; FETCH curl into tmpName; end WHILE; CLOSE curl; set allName = substring_index(allName,',OLD.',amount); set oldName = concat('OLD.',allName); -- llocate prepare stmt; END; 直接把传进来的变量,用游标遍历不就行了,为啥要先整一个预处理那么麻烦呢?
回复 点赞
Main_csdn_String 2018年03月13日
引用 7 楼 qq_39498229 的回复:
我觉得楼主的方法还行
我是一个标点符号写错了。就问你尴尬吗。
回复 点赞
qq_39498229 2018年03月12日
我觉得楼主的方法还行
回复 点赞
Main_csdn_String 2018年03月08日
DECLARE curl CURSOR FOR @ee; 主要是想把这一块做动态的处理 。 可是这个动态总是处理不出来 闹心
回复 点赞
Main_csdn_String 2018年03月08日
标题没吸引力 快来人啊
回复 点赞
Main_csdn_String 2018年03月08日
select * from Temporary__view; 不说了 -又是我一个人慢慢解出来。每次发个帖子 结果没人回复我的时候 我就找问题。。虽然很低级的错误
回复 点赞
Main_csdn_String 2018年03月08日
[Err] 1054 - Unknown column 'Temporary__view' in 'field list' DROP VIEW IF EXISTS Temporary_view; CREATE VIEW Temporary_view(COLUMN_NAME) as select COLUMN_NAME FROM information_schema.`COLUMNS` where table_name='tbl_ne' and table_schema = 'simservers' ; select Temporary__view; 我创建一个视图,在视图处理的时候 发现没办法select处理
回复 点赞
Main_csdn_String 2018年03月08日
补充内容: 后面发现从语法上来讲DECLARE cur CURSOR for语句必须写在SET @sqlstr前面,这就意味着不能通过先执行一条动态语句根据结果拼凑游标的内容 所以创建mysql视图进行处理 在使用视图的时候 发现每次只能填写需要的进行处理 无奈
回复 点赞
发动态
发帖子
MySQL
创建于2007-09-28

2.4w+

社区成员

5.5w+

社区内容

MySQL相关内容讨论专区
社区公告
暂无公告