存储过程放在sql脚本里,命令行导入总是提示错误

苦逼码农 2014-04-01 09:45:33
我的脚本放在d:\test.sql;

内容为:
create procedure mypro1()

begin
declare i int
declare pos int


set i = 0;
set pos = 10002;
while pos<10005 do
begin
insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市');
set i = i+1;
set pos = pos+1;
end while
end


于是我在命令行下:

delimiter //
source d:/test.sql;

结果提示打不开这个sql. 原因很可能就是delimiter //导致的。看错误提示:

Failed to open file 'd:\test.sql;', error: 2

于是我恢复成:

delimiter ;
source d:/test.sql;
结果又立即提示 sql中的语法有问题。

...全文
371 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2014-04-01
  • 打赏
  • 举报
回复
2. 为什么 脚本的后缀名,必须是txt, sql后缀一直失败。 没有这种限制。 3. 通过存储过程写进入的中文字符串,select * from后,发现出现了乱码。 检查一下字符集设置。
ACMAIN_CHM 2014-04-01
  • 打赏
  • 举报
回复
;号是做为语句的结束符,但 begin , end 本身也是结束符,所以不用加;,其它都需要加。
wwwwb 2014-04-01
  • 打赏
  • 举报
回复
OR 在系统命令行下
D:\MySQL55\bin>MYSQL -uroot -pZWTL AA<R:\TEMP\A.TXT

D:\MySQL55\bin>
wwwwb 2014-04-01
  • 打赏
  • 举报
回复
mysql> USE AA;
Database changed
mysql> SOURCE R:/TEMP/A.TXT;
Query OK, 0 rows affected (0.11 sec)

mysql>

A.TXT

delimiter //
create procedure mypro1()

 begin
 declare i int ;
 declare pos int;


 set i = 0;
 set pos = 10002;
 while pos<10005 do
 insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市');
 set i = i+1;
 set pos = pos+1;
 end  while;
 end//
delimiter ;
苦逼码农 2014-04-01
  • 打赏
  • 举报
回复
引用 5 楼 wwwwb 的回复:
[quote=引用 3 楼 u012879787 的回复:] [quote=引用 1 楼 wwwwb 的回复:]
mysql> USE AA;
Database changed
mysql> SOURCE R:/TEMP/A.TXT;
Query OK, 0 rows affected (0.11 sec)

mysql>

A.TXT

delimiter //
create procedure mypro1()

 begin
 declare i int ;
 declare pos int;


 set i = 0;
 set pos = 10002;
 while pos<10005 do
 insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市');
 set i = i+1;
 set pos = pos+1;
 end  while;
 end//
delimiter ;
看截图: [/quote] 仔细看看TXT中的内容 A.TXT delimiter // create procedure mypro1() begin declare i int ; declare pos int; set i = 0; set pos = 10002; while pos<10005 do insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市'); set i = i+1; set pos = pos+1; end while; end// delimiter ;[/quote] 高手你好,你的答案虽然解答我的问题,但是同时给我带来更多的困惑。希望百忙之中,给以解答,多谢。 1. 对于存储过程中的分号,似乎有时候可以不写,也不会报错语法。 我实在不知道,到底该什么时候用分号? 什么时候不用。 2. 为什么 脚本的后缀名,必须是txt, sql后缀一直失败。 我敢说很多人都在用sql后缀,为什么他们的没有失败。 3. 通过存储过程写进入的中文字符串,select * from后,发现出现了乱码。 而在命令行下直接insert into 则不会出现。 是mysql的bug? 如果是,那么如何解决。如果不是,又是为何? 问题有点多,困惑我很久,分数不多,希望给一个mysql初学者一点 正面的解答,多谢。
wwwwb 2014-04-01
  • 打赏
  • 举报
回复
引用 3 楼 u012879787 的回复:
[quote=引用 1 楼 wwwwb 的回复:]
mysql> USE AA;
Database changed
mysql> SOURCE R:/TEMP/A.TXT;
Query OK, 0 rows affected (0.11 sec)

mysql>

A.TXT

delimiter //
create procedure mypro1()

 begin
 declare i int ;
 declare pos int;


 set i = 0;
 set pos = 10002;
 while pos<10005 do
 insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市');
 set i = i+1;
 set pos = pos+1;
 end  while;
 end//
delimiter ;
看截图: [/quote] 仔细看看TXT中的内容 A.TXT delimiter // create procedure mypro1() begin declare i int ; declare pos int; set i = 0; set pos = 10002; while pos<10005 do insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市'); set i = i+1; set pos = pos+1; end while; end// delimiter ;
lumengabc 2014-04-01
  • 打赏
  • 举报
回复
我觉得 可以先创建存储过程,然后需要的时候再CALL调用 MYSQL中你在DELIMITER中执行SOURCE估计不能执行啊
苦逼码农 2014-04-01
  • 打赏
  • 举报
回复
引用 1 楼 wwwwb 的回复:
mysql> USE AA;
Database changed
mysql> SOURCE R:/TEMP/A.TXT;
Query OK, 0 rows affected (0.11 sec)

mysql>

A.TXT

delimiter //
create procedure mypro1()

begin
declare i int ;
declare pos int;


set i = 0;
set pos = 10002;
while pos<10005 do
insert into s(stu_num,stu_name,stu_address)values(pos,'xy','北京市');
set i = i+1;
set pos = pos+1;
end while;
end//
delimiter ;


看截图:

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧