Mysql存储过程学习笔记–变量、参数、注释

变量定义:

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

其中,datatype为mysql的数据类型,如:INT, FLOAT, DATE, VARCHAR(length)

例:

DECLARE l_int INT unsigned default 4000000; DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95; DECLARE l_date DATE DEFAULT ’1999-12-31′; DECLARE l_datetime DATETIME DEFAULT ’1999-12-31 23:59:59′; DECLARE l_varchar VARCHAR(255) DEFAULT ‘This will not be padded’;  

变量赋值

SET 变量名 = 表达式值 [,variable_name = expression ...]

参数

mysql存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT

Create procedure|function([[IN |OUT |INOUT ] 参数名 数据类形…])

IN 输入参数

表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

OUT 输出参数

该值可在存储过程内部被改变,并可返回

INOUT 输入输出参数

调用时指定,并且可被改变和返回

IN参数例子:

创建

mysql> CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT) BEGIN SELECT p_in; /*查询输入参数*/*/ SET p_in=2; /*修改*/ select p_in;/*查看修改后的值*/ END; 
执行结果:
mysql> set @p_in=1
mysql> call sp_demo_in_parameter(@p_in)
+——+
| p_in |
+——+
|    1 | 
+——+

+——+
| p_in |
+——+
|    2 | 
+——+

mysql> select @p_in;

+——-+
| @p_in |
+——-+
| 1     |
+——-+

以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值

OUT参数例子

创建:

mysql> CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT) BEGIN SELECT p_out;/*查看输出参数*/ SET p_out=2;/*修改参数值*/ SELECT p_out;/*看看有否变化*/ END; 
执行结果:
mysql> SET @p_out=1
mysql> CALL sp_demo_out_parameter(@p_out)
+——-+
| p_out | 
+——-+
|  NULL | 
+——-+
/*未被定义,返回NULL*/
+——-+
| p_out |
+——-+
|     2 | 
+——-+

mysql> SELECT @p_out;
+——-+
| p_out |
+——-+
|     2 | 
+———-+

INOUT参数例子:

mysql> CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END; 

执行结果:
set @p_inout=1
call sp_demo_inout_parameter(@p_inout) //
+———+
| p_inout |
+———+
|       1 |
+———+

+———+
| p_inout | 
+———+
|       2 |
+———+


select @p_inout;

+———-+
| @p_inout | 
+———-+
| 2        |
+———-+

用户变量

1、  在mysql客户端使用用户变量

mysql> SELECT ‘Hello World’ into @x;
mysql> SELECT @x;
+————-+
| @x          |
+————-+
| Hello World |
+————-+
mysql> SET @y=’Goodbye Cruel World’;

mysql> select @y;
+———————+
| @y                  |
+———————+
| Goodbye Cruel World |
+———————+

mysql> SET @z=1+2+3;
mysql> select @z;
+——+
| @z   |
+——+
| 6    |
+——+

2、  在存储过程中使用用户变量

mysql> CREATE PROCEDURE GreetWorld(  )  SELECT CONCAT(@greeting,’ World’);
mysql> SET @greeting=’Hello’;

mysql> CALL GreetWorld(  );
+—————————-+
| CONCAT(@greeting,’ World’) |
+—————————-+
| Hello World                |
+—————————-+

3、  在存储过程间传递全局范围的用户变量

mysql> CREATE PROCEDURE p1(  )   SET @last_procedure=’p1′;

mysql> CREATE PROCEDURE p2(  )  SELECT CONCAT(‘Last procedure was ‘,@last_procedure);

mysql> CALL p1(  );

mysql> CALL p2(  );
+———————————————–+
| CONCAT(‘Last procedure was ‘,@last_procedure) |
+———————————————–+
| Last procedure was p1                         |
+———————————————–+

注意:

①用户变量名一般以@开头

②滥用用户变量会导致程序难以理解及管理

注释

mysql存储过程可使用两种风格的注释

双模杠:–

该风格一般用于单行注释

c风格:/* 注释内容 */ 一般用于多行注释

发表在 Database | 标签为 | 留下评论

AMQP协议介绍

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。

JMS是早期消息中间件进行标准化的一个尝试,它仅仅是在API级进行了规范,离创建互操作能力还差很远。

与JMS不同,AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。

AMQP规范的版本:
0-8        是2006年6月发布
0-9        于2006年12月发布
0-9-1     于2008年11月发布
0-10      于2009年下半年发布
1.0 draft  (文档还是草案)

AMQP的实现有:

1)OpenAMQ
AMQP的开源实现,用C语言编写,运行于Linux、AIX、Solaris、Windows、OpenVMS。

2)Apache Qpid
Apache的开源项目,支持C++、Ruby、Java、JMS、Python和.NET。

3)Redhat Enterprise MRG
实现了AMQP的最新版本0-10,提供了丰富的特征集,比如完全管理、联合、Active-Active集群,有Web控制台,还有许多企业级特征,客户端支持C++、Ruby、Java、JMS、Python和.NET。

4)RabbitMQ
一个独立的开源实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。RabbitMQ发布在Ubuntu、FreeBSD平台。

5)AMQP Infrastructure
Linux下,包括Broker、管理工具、Agent和客户端。

6)ØMQ
一个高性能的消息平台,在分布式消息网络可作为兼容AMQP的Broker节点,绑定了多种语言,包括Python、C、C++、Lisp、Ruby等。

7)Zyre
是一个Broker,实现了RestMS协议和AMQP协议,提供了RESTful HTTP访问网络AMQP的能力。

发表在 Excellence Article | 标签为 | 留下评论

Google App Engine项目收集

http://right.appspot.com/ 类似eemap的玩意
http://code.google.com/p/cpedialog 很不错的Blog程序
www.topea.net 外汇智能交易信号实时发布
http://im.huhaitai.com 仿twitter的一个应用,单用户
http://www.bus-line.cn 一个gae做的公交网站,现有北京 上海 南京 广州 天津 重庆 成都 深圳 等城市的公交线路。
http://my-todo.appspot.com/ 是任务管理, 适用于在 Firefox 侧边栏载入. 另外一个重要的特性是支持 Google Gears, 可以在没有网络的情况下使用.
http://images.kangye.org 分享网络图片,挖图网
http://www.themv.cn LAST+YOUTUBE的应用,平时可以上去听听音乐
http://web-proxy.appspot.com 华丽的web proxy
http://xiudaima.appspot.com 在线的代码高亮工具,只需复制粘贴就可以把高亮代码加入到你的Blog、邮件、Word中
http://ttlicai.appspot.com 天天理财网
http://proxycgi.appspot.com proxy
http://uuopenchat.appspot.com 用django和jquery做的聊天室
http://sms4twitter.appspot.com 可以用短信更新twitter的玩意
http://gae-django-cms.appspot.com 一个简洁的CMS
http://trygroovy.appspot.com/ 一个Groovy Web Console,带有一个交互式的Groovy学习教程。教程的输入界面完全实现了一个命令行窗口。输入下面教程的脚本,如果输入正确,教程会自动进入下一章。 交互式教程的形式受TryRuby启发,是对它的模仿。
http://rss4py.appspot.com RSS聚合
http://tedtalksubtitledownload.appspot.com/ 下载TED字幕
http://t.yibin.us 利用twitter api做的手机版

发表在 Tools | 标签为 , | 留下评论

数据库管理系统基本组件及运行流程图

一图胜千言,图片出自《Database Management System 》一书,斯坦福大学可以查到这本书的PDF

database_management_system_compoment

发表在 Database | 标签为 | 留下评论

四月过完了

转眼间,四月就过完了,去年的这个时节,我还在博客大巴为准备毕业论文而伤神,转眼间就一年了。最近一直很忙,不是一般的忙,早上9点到公司,晚上十点半回家,就在我怀疑我是否能撑过去的时候,这个项目接近了尾声,还好,我又活着收工了。这个项目并没有给我带来很多的惊喜,无论是技术上还是商业模式或者产品上,而且由于战略的调整,这个产品宏伟的推广计划也被改变,总体来说,让我感觉不是很好,有点萎靡和颓废。

技术上,基本上一个月以来没啥收获,代码工人,天天code,景埕走后,很少聊技术了,我发现我寂寞了,我无意想在这里争得升迁的机会,我想做好我该做的事情,无论是为人还是做事。这一个月中,我收到很多猎头的电话,我都不知道他们怎么知道我的简历,我只在去年大概这个时候在智联招聘上填写过一份简历,之后就处于关闭状态,而且没有更新过,就算是智联招聘卖了我的简历,那也是很初级的,虽然现在也不是很高级,跟一年前比起来已经进步很多很多了,当然这中间少不了think in lamp 群中一帮兄弟的支持,每每旁观他们激辩或者自己亲身参与某个技术问题的时候都很有收获,有句话是对的,能让别人懂,自己才真的懂了。难道这年头好像初级或者比初级高一点的PHPer需求量很大?

最近在啃《Database System Implementation》,景埕留给我的,英文影印版,非常好的一本书,虽然有点偏向学术了,现在市面上很难买到了,电子书貌似可以下到,如果想深入了解数据库原理,可以一读,不算很厚,连我英文这么烂的人,都有信心读完。景埕还给我一本英文原版的《面向对象软件构造》也是非常经典的书,有点厚度,没有太多时间,如果国内要是有中文就好了,看英文原版有个好处,就是慢,一个字一个字的抠,理解比较透彻,中文的容易走马观花,似懂非懂。

发表在 Life Diary | 标签为 , | 一条评论

类设计

最近几乎天天加班,周末依然加班,好久没有更新博客了,非常累。不过此累非彼类。

在现有的很多面向过程开发的代码中,对我这个涉世不深的玩家来说,简直就是灾难,或许很多代码连面向过程都算不上,连函数都没有包装。一个函数可能会超过500行代码,语义不名,名称更不名。我曾经试图改造这些代码,并非技术上不可行,而是实现需要太多的时间,一个不可能完成的任务。

让一个缺乏面向对象的团队掌握面向对象很困难的,也许是我智商低,当年我花了两个月才能意会什么是对象,什么是面向对象编程,到现在也不会言传。

如果不能转向到面向对象,那么我们先转成类吧,或许技术上更能解决一点。类的最基本功能就是封装,如果我们撇去面向对象的东西,那么类就是把具有相似性的东西做一个集合,外部在使用这些功能的时候不需要知道具体实现,只要给类中的方法确需要的参数值,如果非要理解成一堆具有相似属性函数的集合,那也是可以的,毕竟这个比一个文件中的几千行代码,连个function都没有的代码好得多。

如果我们想得到更好的类,需要遵循一些基本的原则, 其中之一就是类应该短小,短小并不是说不完整,这和很多人学C的时候,老师告诉我们,函数要尽可能短小一样,到底多短小的类算是合适呢?我觉得根本无法用代码行数来描述,这取决于这个类所完成的功能,比如你要封装一个操作文章的类,那么至少需要,增删改查四个函数,也许还有基于这四个函数的别名和封装,以及必要的公共属性。

第二个重要原则就是单一权责(SRP),这个原则要做到非常 不容易,因为比第一条更难衡量,一般认为,衡量单一权责的标准是:类或者模块应该有且只有一条加以修改的理由。SRP实际上能给出控制类长度的指导方针。简单的理解就是一个类只有一个功能,假如你修改博客标题或者设置的时候,都要改动文章类,显然违背了单一权责的原则。

第三个原则–内聚。类应该只有少量实体变量。类中的每个方法都应该操作一个或者多个这种变量。通常而言,方法操作的变量越多,就越内聚到类上,如果一个类中的米一个变量都被每个方法所使用,则该类具有最大的内聚性。通常,创建一个这样极大化的内聚类是非常不容易的,也是不可取的,因为类的内聚性过高也就意味着类中的方法和变量相互依赖,互相结合成一个逻辑的整体,当修改类中的变量或者方法时,可能影响或者需要修改其他的方法或者属性。一般认为,类的内聚应该保持在较高的位置,但不是最高的位置,这样有利于降低维护成本。

前面提到在我目前的项目中,我碰到很多超过500行代码的函数,假如把数字降低到300,那么符合标准的函数将会增加十倍以上,在一个面向对象的团队中,一个单纯函数或者方法超过100行几乎都是不可接受的,因为这意味着这个函数可能包含过多的权责。其实我们如果真的遵循类的内聚和单一权责的原则,就会导致很多短小的类的产生。

一般程序员在拆解过大的函数的时候实际上就是将原来的代码复制出来,放到新建的函数中去,然后把需要的参数传递过去,实际上导致超大函数的产生的动机常常是因为有很多变量在这个函数的中被使用到,看似这个函数似乎是一个整体,因为拆分会导致新建的函数参数很多。为啥他们不想用一下类呢,假如拆解函数导致需要传递很多的参数,那么这个函数其实就是一个类,需要传递的函数需要提升为实体变量,这样就可以将函数拆成很小的小块,这样看起来似乎丧失了内聚性,因为堆积了越来越多的只为允许少量函数共享而存在的实体变量。如果这些函数想要公司向某些变量,为什么不让它拥有自己的类呢?当类丧失了内聚性,就应该拆了它。所以,将大的函数拆分为小函数,旺旺也是将类拆分为多个小类的时机,程序会更加有组织,更为透明的结构。

实际上很多时候,当你完成所有的功能的时候,产品经理会跑过来跟你说,我们不能把这个功能改成这样,这样用户体验更好,很可能你需要改动很多的代码很逻辑,甚至数据结构,所以如果我们能在设计的类的时候,注意一下可能的需求改动,我们可以借助接口或者抽象类来隔离修改细节对原来代码产生的破坏性更改。

发表在 Programming | 标签为 , , | 留下评论

Linux网络管理中的几个小工具

1、ifconfig
提供基本的配置信息,在侦测错误IP地址、不正确的网络掩码和不适当的广播地址时,都很有用。

2、arp

提供Ethernet与IP地址的转换信息,它可以用不过来侦测网络上的IP地址配置错误的系统,Arp是Unix系统的一部分

3、netstat
提供各式各样的网络信息,通常用来显示个网络接口,socket及路由表等统计信息。

4、ping
做技术的地球人都知道的一个玩意,主要作用是指出IP包是否能够到达某台主机,同事也会显示分组包漏失与传送时间等统计信息

5、nslookup
提供DNS域名服务的有关信息

6、dig
也提供域名服务相关的信息,和nslookup类似的玩意

7、ripquery
提供系统发送或者接受RIP更新分组包的内容。riquery是gated软件一部分,但你并非一定要执行gated,它可以在所有执行RIP的系统上操作。

8、tracerute
告诉你到远程系统分组包使用哪一条路由,每一站的记录都会显示(理论上如此,实际上很多特殊应用的路由会关闭自己反馈信息,tracerute将跟踪不到,比如著名的万里长城)

9、snoop
分析每一个网络上主机间彼此传送的分组包。soop是一种TCP/IP协议分析器,用来分析分组包内容包括其表头,这是分析协议问题时最有用的工具之一。

10、tcpdump
功能和snoop类似,比前者提供更多的功能,以巨多的参数和强大的功能而闻名

发表在 Operating System | 标签为 | 留下评论

Firefox使用SSH配合autoproxy自动翻山图文教程

在这个特殊的日子里,我没有什么可以做的,在西厢计划没有成型之前,希望此文能够让翻山的人少折腾,少排出一点二氧化碳。
每个人都抱着“我们不能改变什么,那是别人玩的游戏”,我们的未来还有希望吗。围观也是一种态度,起码我们有勇气去寻求真相。也许我们不能改变什么,但是我们应该为那些有勇气的人鼓掌。
Google走了,周围有人说:因为他们没有遵守中国的法律。其实是你自己被剥夺了寻求真相的权利,而他在帮你把它争取回来,而你依然是一名不明真相的群众。

这篇文章将介绍另一种翻山手段,SSH代理山墙,对于购买类似Dreamhost主机的用户,会有SSH帐号可以使用,通过这个SSH帐号,即可实现更为安全可靠并且稳定的翻山术。

名词解释:SSH

安全外壳协议(Secure Shell Protocol / SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。

常用的SSH工具有开源软件putty,后面介绍的MyEntunnel最终还是靠pLink调用putty实现SSH的加密通道。

第一步:获取拥有SSH权限的帐号和密码。

对于购买类似Dreamhost主机的用户,会有SSH帐号可以使用,也可以通过其他方式购买或者获取SSH帐号。
友情提示:没有SSH帐号的朋友可以去淘宝、有啊,拍拍等网站自行搜索,并购买,目前报价普遍10元左右每月

第二步:配置MyEntunnel软件

下载并安装MyEntunnel,该软件全名为My Encrypted Tunnel。

按照上图将第一步收到的帐号信息填写到相应的地方后,点击 “保存”按钮,再点击“连接”按钮。

第一次连接过程中会出现一个认证对话框,按照提示选“yes”即可。以后的自动连接中将不再出现此认证对话框。

最后点击“隐藏”按钮,使对话框隐藏到右下角系统任务栏中。

提示:

为MyEntunnel创建一个快捷方式,将其复制到系统的【启动】(C:\Documents and Settings\当前用户名(需要修改成你自己的)\「开始」菜单\程序\启动)文件夹中,今后开机便可自动启动软件,并自动连接服务器。

如上图所示,myentunnel有三种颜色表示不同的状态,绿色代表连接成功且稳定;黄色代表正在连接或重新连接;红色代表连接失败。

第三步:配置Firefox浏览器

Firefox有一个扩展,叫做AutoProxy,它能够自动配置让被墙的站点通过代理服务器访问。你可以通过firefox访问以下地址安装:https://addons.mozilla.org/zh-CN/firefox/addon/11009 如下图所示,点击添加到Firefox。

点击 “立即安装”

安装完成后按照提示重新启动firefox以便配置 autoproxy。

重启后完成autoproxy的安装,我们在弹出的窗口中开始配置autoproxy,如下图:

在“代理规则”中“添加规则订阅”

如下图选中“gfwList”,然后点击右下角“订阅”按钮。

在“代理服务器”选项卡中,选中“选择代理服务器”

然后按照下图标示选择并确定。

如下图所示,在“选项” 标签中选择“自动模式”

最后,单击下方的“应用”并“确定”,到此设置完毕。

今后只要先启动MyEntunnel,然后启动Firefox就可以自动翻墙了,而不需要使用代理的站点依然是直接访问(不通过代理),所以速度不受影响。

最后测试一下,访问一下facebook吧:

好了,完全正常。

Update: 看了国新办网络局就谷歌搜索退出中国内地发表谈话 很受伤,引用锅巴的一句话,傻逼是永远死不光的,正如我本文开头所说的那样,自己不知道争取自由,别人帮你争取,那个人却成了坏人

发表在 Tools | 标签为 , | 9 条评论

数据库的层次结构

1、树状结构
在历史上,层次数据库最早出现,将数据库保存为文件中的记录,各种逻辑被嵌套到一起,而没有将同样的记录按照线性排列。层次数据库对某些查询非常适合,但是过强的结构限制了人们对数据的自由操控,后来出现的网络(CODASYL)数据库,虽然灵活了很多,但数据操控仍然很困难,知道关系型理论的出现,才证明的了数据库设计是科学而不是工艺,然而,因为层次模型很有弹性,所以层次结构依然极为常见(至少层次描述非常常见),例如XML和LDAP等层次技术非常活跃,严格的说HTML也算是一种层次存取数据的方式。
层次式数据不太容易理解,比如ERP系统中最基本的物料单,层次结构之所以复杂,主要原因不是因为组件之间的关系表达,而是访问树的方式,我们访问树的部分或全部节点,通常按照顺序返回这些节点,访问树通常由DBMS引擎以过程性方式实现,而过程性操作正是违背关系理论的主要表现之一。
2、树状结构和主从结构
很多人认为“父子关系”和“主从关系”没有什么不同,实际上这两种关系有着很多的不同。
1) 树状结构保存只需要一个表。代表层次结构的树,其所有节点完全相同,叶子节点的类型有时可能不同,例如文件系统中的文件夹和文件节点,如果撇去这点,所有的节点类型完全相同,我们可以用相同的方法描述,而且同一个表来代表节点,换句话说,表与它本身之间有种主从关系,而不是两个类型不同的表关系。
2)深度。层次结构中,与根节点的距离本身是重要的信息,而在主从关系中,不是主表就是明细表。
3)所有权。主从关系中,可以明确的外键完整性约束,例如,每个表中订单必须与另外一张表的已存在的ID对应,但层次结构,比如,虽然比如经理的工号虽然是参照已经存在的员工的工号规则来的,但是经理向老板报告,不跟员工报告,这会导致NULL值问题。
4)多重父节点。以父节点似乎别数据结合子节点,是假设一个子节点只有一个父节点,实际上生活中,很多情况下都不是这样,比如机械零件和螺丝钉,那就不是树了,父子关系就无能为力了。
其实某位大牛曾经说过:从关系理论角度去理解树的结构,树有两种实体类型,一个是节点,另一个是节点之间的连接。这样的设计世界上是解决了完整性约束的的问题,因为只有实际存在连结的节点才能被描述。这种描述实际上最后能描出一个图来,也就是能解决一个子节点对应多个父节点的问题。
DBMS厂商常常实现了空间数据处理或全文索引等特殊功能,但对层次结构的支持很薄弱或者根本没有。
处理层次结构的主要困难在于树的访问,当然仅仅为了在图形用户界面中显示树状结构,每次用户点击将树展开并没有什么问题 :)

发表在 Database | 标签为 , | 留下评论

mysql root帐号丢失解决办法

一.windows系统的解决方法
1.首先以系统管理员身份登陆系统。
2.停止MySQL的服务。
3.进入命令窗口,然后进入MySQL的安装目录,比如我的安装目录是c:\mysql,进入C:\mysql\bin
4.跳过权限检查启动MySQL,c:\mysql\bin>;mysqld-nt –skip-grant-tables
(或者将–skip-grant-tables写入my.ini中,重新启动Mysql,即可设置新密码)。
5.重新打开一个窗口,进入c:\mysql\bin目录,设置root的新密码
c:\mysql\bin>mysqladmin -u root flush-privileges password “newpassword”
c:\mysql\bin>mysqladmin -u root -p shutdown
将newpassword替换为你要用的root的密码,第二个命令会提示你输入新密码,重复第一个命令输入的密码。
6.停止MySQL Server,用正常模式启动Mysql
7.你可以用新的密码链接到Mysql了。

二.Unix/Linux的解决方法
1.用root或者运行mysqld的用户登录系统;
2.利用kill命令结束掉mysqld的进程;
3.使用–skip-grant-tables参数启动MySQL Server
shell>mysqld_safe –skip-grant-tables &
4.为root@localhost设置新密码
shell>mysqladmin -u root flush-privileges password “newpassword”
5.重启MySQL Server

发表在 Database | 标签为 | 留下评论