MySQL的配置与存储过程“拾贝”

日期: 2010-06-06 来源:TechTarget中国

  以前没用过MYSQL,在安装过程中,产生了些问题,这里对解决的办法作一个分享;mysql在 5.0的版本之后也支持了存储过程,简单调了下,总结了些与TSQL不同点,欢迎大家探讨补充探讨。还遗留一个问题,脚本set @name=’minbatt’;仍然出错,直接调call sp_insertStudent (“minbatt”,”hellopwd”,@res);//,也不行,还望能解答。

  一 .安装和配置过程中遇到的问题

  1. 安装过程中start service无法安装的解决方法(该问题经常会遇到,为本机旧有的mysql服务存在,而且清理的时候不彻底)

  解决办法如下:

  (1).在cmd中,运行sc delete mySQL命令,然后会提示[SC] DeleteService SUCCESS,删除现有残存的mysql服务

  (2).打开添加/删除程序,将mySQL删除。

  (3).打开所有跟mySQL有关的目录,特别检查下检查C:WINDOWS目录下是否有my.ini文件,将其删除

  (4).最为重要的一点,删除以下注册表中的如下信息:

  HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL 目录

  HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesEventlogApplicationMySQL 目录

  HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplicationMySQL 目录

  注册表中的ControlSet001,ControlSet002(ControlSetXXX)

  以上步骤如果已经处理过了,则可跳过,完成后重启下系统,再安装则可成功

  2. 安装完成后,进入系统,连接mysql,提示如下:1045 access denied for user [email=‘root’@]‘root’@’localhost’[/email] using password yes,原因是旧有帐户信息仍有残存,导致配置文件中的设定与 MySQL 默认权限账户(没有密码的 root)不对应造成的。

  解决方法如下:

  (1).net stop mysql 停用服务

  (2).修改${mysql_home}/MySQL Server 5.1目录下的my.ini文件

  [mysqld]下面添加这句:skip_grant_tables, //忽略权限校验

  (3).把你的${mysql_home}bin目录加入path路径里边

  (4).net start mysql 启动mysql服务

  (5).mysql -uroot –p Enter password:root

  (6).use mysql

  mysql>UPDATE user SET Password=PASSWORD(‘root’) where USER=’root’;//更新密码

  mysql>FLUSH PRIVILEGES; //刷新MySQL的系统权限相关表

  mysql>exit

  (7).删除my.ini中的这句话:skip_grant_tables//还原配置

  net stop mysql //重启服务

  net start mysql

  (8).重新登录可以了

  mysql -uroot -proot

  二. 安装完成后,写了些简单的存储过程(mysql5.0之后的版本是支持的),以前使用的主要是TSQL和PLSQL,发现过程中mysql的语法还是有很多的特点,个人感觉语法要求更加标准严格

  以下为原TSQL下的一段简单的存储过程(sqlserver下是可以运行的)

  Create proc sp_insertStudent (@name char(30) inout, @pwd char(30) in,@res int out )

  as

  If exists (select * from student where [email=name=@name]name=@name[/email])

  Set @res=0

  Else

  Begin

  Insert into student values(@name,@pwd)

  Set @rs1=0

  End;

  但在mysql 下创建不成功

  经过调试,发现有以下一些不同点:

  (1)此点修改比较重要,mysql的存储过程是分局执行的,而存储过程中默认的执行语句完结符号为“;”,因此需要首先修改系统完结符号,运行“Delimiter //”命令,完结符号修改为//.创建完存储过程,运行“Delimiter ;”进行修改,避免对普通SQL执行产生影响。

  (2)mysql下的存储过程,局部变量不用加@进行标注,直接命名即可(sql下@为局部变量,@@为全局变量)

  (3)条件判断需遵循if ,then, end if,格式要求更为严谨,即条件判断的语句为

  If 条件判断 then

  执行语句;

  Else

  执行语句;

  End if;

  (4)变量需要在数据库终端中打印的话,用SELECT p_inout;(变量名)(相当于TSQL下print的用法)

  (5)赋值上没有变化,普通赋值用set,查询赋值用select

  Select res=count(*) from student;

  Set res=’0’;

  修改后的mysql下的存储过程如下(mysql下创建成功):

  Create PROCEDURE sp_insertStudent (in name char(30), in pwd char(30),out res char(30))

  begin

  If exists (select * from student where name=name) then

  Insert into student values(name,pwd);

  set res=’0’;

  Else

  Set res=’1’;

  end if;

  end//

  (6)不过在调用存储时,还存在一个问题,也欢迎大家帮忙看看,是哪里的问题

  mysql> set @name=’minbatt’;

  mysql> set @pwd=’hellopwd’;

  mysql> call sp_insertStudent (@name,@pwd,@res);//

  在 set @name=’minbatt’;报错如下(不过信息也没说明啥问题):

  三:动态SQL 的补充知识,了解到TB现有系统,IBATIS除用到存储过程外,还大量调用了动态SQL。

  动态SQL的优势:

  它存在的原因是为了解决运行时才能确定要执行的sql statements的问题。它比static sql固有的不利主要是速度慢,因此它不采用EXECUTE IMMEDIATE 的方式,而是采用利用了SQLDA技术的prepared execution方式执行,它的好处就是一次声明(分配空间),性能介于static sql 和 完全的动态sql(动态组合直接执行)之间。

  存储过程优点:

  1、 存储过程允许标准组件式编程

  2 、存储过程能够实现较快的执行速度SQL 语句在每次运行时都要进行编译和优化因此速度相对要慢一些

  3 、存储过程能够减少网络流量

  Transaction-SQL 语句被组织成一存储过程那么当在客户计算机上调用该存储过程时网络中传送的只是该调用语句否则将是多条SQL 语句从而大大增加了网络流量降低网络负载

  4、 存储过程可被作为一种安全机制来充分利用系统管理员通过对执行某一存储过程的权限进行限制从而能够实现对相应的数据访问权限的限制避免非授权用户对数据的访问保证数据的安全

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐