MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)_第1页
MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)_第2页
MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)_第3页
MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)_第4页
MYSQL数据库高级应用宝典含实例(索引、视图、触发器、游标和存储过程)_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、9yuib声明:此文档是小弟学习时收集而来,感觉比较经典,特分享出来,大家可以共勉。MYSQL数据库的索引、视图、触发器、游标和存储过程(1) 索引(index)2(2) 视图(view)3(3) 触发器(trigger)7(4) 游标(cursor)9(5) 事务(Transaction)11(6) 存储过程(Stored Procedure)13(1) 索引(index)索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。优点: 大大加快数据的检索速度; 创建唯一性索引,保证数据库表中每一行数据的唯一性; 加速表和表之间

2、的连接; 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。缺点: 索引需要占物理空间 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。更好的理解索引的提示: 如果经常使用表中的某一列或某几列为条件进行查询,且表中的数据量比较大时,可以创建索引,以提高查询的速度。 索引是与表关联的可选结构。 通过有目的的创建索引,可以加快对表执行SELECT语句的速度。 不管索引是否存在,都无需修改任何SQL语句的书写方式。索引只是一种快速访问数据的途径,它只影响查询执行的效率。 可以使用CREATE INDEX命令在一列或若干列的组合上创建索引。 创

3、建索引时,将获取要创建索引的列,并对其进行排序。然后,将一个指针连同每一行的索引值存储起来,组成键值对(目录名和页码)。使用索引时,系统首先通过已排序的列值执行快速搜索,然后使用相关联的指针值来定位具有所要查找值的行。 一旦创建了索引,MySQL会自动维护和使用它们。 只要修改了数据,如添加新行、更新现有行或删除行, MySQL都会自动更新索引。 但是为表创建过多的索引会降低更新、删除以及插入的性能,因为MySQL还必须更新与该表关联的索引。 索引的分类 普通索引:这是最基本的索引,它没有任何限制 唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,

4、则列值的组合必须唯一 主键索引(通过主键约束间接创建):它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引 组合索引:在表中的多个列上创建的索引。组合索引中列的顺序是任意的,可以是相邻的列,也可以是不相邻的列。索引的创建: 普通(唯一)索引的创建:CREATE UNIQUE INDEX index_name ON tbl_name(index_col_name,)index_col_name: col_name(length)ASC|DESC对于字符类型的列,可以编制“前缀索引”,Length表示按照列的指定长度的字符串索引 创建组合索引:CREATE INDEX ind

5、ex_name ON tbl_name(index_col_name1,index_col_name2,.)基于(列A,列B)两列创建索引: 可应用索引的情况:A;AB两列结合; 不可用索引的情况:B Create index index_name on table_name(列A,列B); 其他创建索引的方式: 创建表时创建索引:CREATE TABLE tbl_name( 列的定义, INDEX|KEY idx_name(index_col_name);Eg:CREATE TABLE t1(tid int primary key, #既创建约束,又创建索引 tname varchar(20

6、), index idx_tname(tname), #创建一个普通索引 tbirthday date); 修改表时创建索引:ALTER TABLE tbl_name ADD INDEX|KEY idx_name(indxe_col_name);Eg:ALTER TABLE t1 ADD KEY (tbirthday); 查看索引:Show index|keys from 表名;(SHOW KEYS FROM t1;) 删除索引:drop index 索引名 on 表名。(drop index c on t3;)(2) 视图(view)从用户角度来看,一个视图是从一个特定的角度来查看数据库中的

7、数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。 视图是一个虚拟表,其内容由查询定义。概述: 视图以经过定制的方式显示来自一个或多个表的数据 视图是一种数据库对象,用户可以象查询普通表一样查询视图。 视图内其实没有存储任何数据,它只是对表的一个查询。 视图的定义保存在数据字典内。创建视图所基于的表为“基表”。 视图一经定义以后,就可以像表一样被查询、修改、删除和更新作用:精华志 京华志 毕

8、业设计辅导咨询 简化数据查询语句 使用户能从多角度看到同一数据 提高了数据的安全性 提供了一定程度的逻辑独立性 减少带宽流量、优化后还可提高执行效率优点: 提供了另外一种级别的表安全性 隐藏的数据的复杂性 简化的用户的SQL命令 通过重命名列,从另一个角度提供数据视图的创建:CREATE OR REPLACE ALGORITHM = UNDEFINED | MERGE | TEMPTABLE VIEW view_name (column_list) AS select_statementWITH CASCADED | LOCAL CHECK OPTION说明:l OR REPLA

9、CE:给定了OR REPLACE子句,语句能够替换已有的同名视图。l ALGORITHM:可选的mysql算法扩展,算法会影响MySQL处理视图的方式。有以下三个值: UNDEFINED-MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。 MERGE-会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。 TEMPTABLE-视图的结果将被置于临时表中,然后使用它执行语句。l veiw_name:视图名。l column_list:要想为视图的列定义明确的名

10、称,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list。l select_statement: 用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制:1. 定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;2. 在定义中引用的表或视图必须存在;l WITH cascaded|local CHECK OPTION: 在关于可更新视图的WITH CHECK OPTION子句中,当视图是根据另一个视图定义的时,LOCAL

11、和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。WITH CHECK OPTION指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。l 视图定义服从下述限制: SELECT语句不能包含FROM子句中的子查询。 SELECT语句不能引用系统或用户变量。 SELECT语句不能引用预处理语句参数。 在存储子程序内,定义不能引用子程序参数或局部

12、变量。 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。 在视图定义中命名的表必须已存在。 不能将触发程序与视图关联在一起。修改视图:ALTER ALGORITHM = UNDEFINED | MERGE | TEMPTABLE VIEW view_name (column_list) AS select_statement WITH CASCADED | LOCAL CHECK OPTION说明:该语句用于更改已有视图的定

13、义。其语法与CREATE VIEW类似。该语句需要具有针对视图的CREATE VIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。查看视图:精华志 京华志 毕业设计辅导咨询 SHOW CREATE VIEW view_name说明:该语句给出了1个创建给定视图的CREATE VIEW语句。删除视图:DROP VIEW IF EXISTS view_name , view_name .RESTRICT | CASCADE说明:l DROP VIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限。l 可以使用关键字IF EXISTS来防止因不存在的视图

14、而出错。l 如果给定了RESTRICT和CASCADE,将解析并忽略它们。更新视图:概述: 视图的使用与表一样,有增删改查四种操作,且语法也与表相同。 在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE可以统称为“通过视图更新数据”。 通过视图更新数据有如下限制: 一次只能修改一个底层的基表 如果修改违反了基表的约束条件,则无法更新视图 如果视图中的列不是表中的原始列(如创建视图时使用了连接操作符、聚合函数等),则不能通过视图更新。视图更新操作: 可更新的视图:要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语

15、句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。如果视图包含下述结构中的任何一种,那么它就是不可更新的: 聚合函数; DISTINCT关键字; GROUP BY子句; ORDER BY子句; HAVING子句; UNION运算符; 位于选择列表中的子查询; FROM子句中包含多个表; SELECT语句中引用了不可更新视图; 插入数据:使用INSERT语句通过视图向基本表插入数据注意: 当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。 对INSERT语句还有一个限制:SELECT

16、语句中必须包含FROM子句中指定表的所有不能为空的列。 修改数据:使用UPDATE语句可以通过视图修改基本表的数据注意:若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。 删除数据:使用DELETE语句可以通过视图删除基本表的数据注意:对依赖于多个基本表的视图,不能使用DELETE语句。(3) 触发器(trigger)它是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,

17、USER_TRIGGERS 数据字典中查到。为什么要使用触发器: 可以使用它来检查或预防坏的数据进入数据库。 可以改变或取消INSERT、UPDATE、以及DELETE语句。 可以在一个会话中监视数据改变的动作。创建触发器:精华志 京华志 毕业设计辅导咨询 CREATE DEFINER = user | CURRENT_USER TRIGGER BEFORE | AFTER INSERT | UPDATE | DELETE ON FOR EACH ROW 说明:DEFINER:The DEFINER clause specifies the MySQL account to be

18、used when checking access privileges at trigger activation time. If a user value is given, it should be a MySQL account specified as user_namehost_name。触发器名称:触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象触发程序的动作时间:BEFORE AFTER. 可以设置为事件发生前或后.事件:指明了激活触发程序的语句的类型。可以是下述值之一: INSERT:将新行插入表时激活触发程序,例如,通过I

19、NSERT、LOAD DATA和REPLACE语句。 UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。 DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。表:触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活。我们不能给同一张表的同一个事件安排两个触发器,而且必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。触发间隔:FOR EACH ROW通知触发器每隔一行执行一次动作,而不是对整个表执行一次。关于旧的和新创建的列的标识在触发器的SQL语句中,你可以关联表中的任意列。但你不能仅使

20、用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识: NEW . column_name或者OLD . column_name.这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量(transition variables)。 对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。CREATE TRIGGER t

21、21_auBEFORE UPDATE ON t22FOR EACH ROWBEGINSET old = OLD . s1;SET new = NEW.s1;END;触发的SQL语句:是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN . END复合语句结构。这样,就能使用存储子程序中允许的相同语句。删除触发器:DROP TRIGGER schema_name.trigger_name说明:方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。DROP TRIGGER语句需要SUPER权限。查询触发器:SHOW TRIGGER

22、S FROM | IN db_name LIKE pattern | WHERE exprmysql SHOW TRIGGERS LIKE acc%G* 1. row * Trigger: ins_sum Event: INSERT Table: account Statement: SET sum = sum + NEW.amount Timing: BEFORE Created: NULL sql_mode: Definer: mynamelocalhostcharacter_set_client: latin1collation_connection: latin1_swedish_ci

23、 Database Collation: latin1_swedish_ci Trigger :The name of the trigger. Event :The event that causes trigger activation: one of INSERT, UPDATE, or DELETE. Table :The table for which the trigger is defined. Statement :The statement to be executed when the trigger is activated. This is the same as th

24、e text shown in the ACTION_STATEMENT column of INFORMATION_SCHEMA.TRIGGERS. Timing :One of the two values BEFORE or AFTER. Created :Currently, the value of this column is always NULL. sql_mode :The SQL mode in effect when the trigger executes. Definer :The account that created the trigger(4) 游标(curs

25、or)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。 概述: 游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄

26、一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。 游标实现了对mysql的存储过程中循环读取数据表中的对象的过程。游标的特性: READ ONLY 只读,只能取值而不能赋值; NOT SCROOLABLE 不可回滚,只能顺序读取; ASENSITIVE 敏感,不能在已经打开游标的表上执行update事务;游标操作:声明游标: DECLARE cursor_name CURSOR FOR select_statement这个语句声明一个光标。也可以在

27、子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。打开游标: OPEN cursor_name游标FETCH:FETCH cursor_name INTO var_name , var_name .这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。 关闭游标CLOSE: CLOSE cursor_name这个语句关闭先前打开的光标。如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。使用游标的实例:CREATE PROCEDURE curdemo(tblName VARCHAR(100)BEGINDECLARE done INT DEFAULT 0;

28、 DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id FROM v_wondyfox; 声明游标DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1; drop view if exists v_wondyfox ; set sql=concat(create view v_wondyfox as select * from , tblName); PREPARE stmt1 FROM sql;EXECUTE stmt1 ; DEALLOCATE PREPARE stmt1; OPEN cur1;

29、 打开游标REPEAT FETCH cur1 INTO b; 获取游标内容select b; UNTIL done END REPEAT; CLOSE cur1; 关闭游标ENDCREATE PROCEDURE curdemo()BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTIN

30、UE HANDLER FOR SQLSTATE 02000 SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b show engines;(或执行mysql-show variables like have_%; ),查看InnoDB为YES,即表示数据库支持InnoDB了。也就说明支持事务transaction了。4. 在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql-al

31、ter table table_name type=InnoDB;或 mysql-alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。 实例:/* transaction-1 */$conn = mysql_connect(localhost,root,root) or die (数据连接错误!);mysql_select_db(test,$conn);mysql_query(set names GBK); /使用GBK中文编码;/开始一个事务mysql_query(BEGIN); /或者mysql_query(START TRANSACTI

32、ON);$sql = INSERT INTO user (id, username, sex) VALUES (NULL, test1, 0);$sql2 = INSERT INTO user (did, username, sex) VALUES (NULL, test1, 0);/这条我故意写错$res = mysql_query($sql);$res1 = mysql_query($sql2); if($res & $res1)mysql_query(COMMIT);echo 提交成功。;elsemysql_query(ROLLBACK);echo 数据回滚。;mysql_query(E

33、ND);/* transaction-2 */*方法二*/mysql_query(SET AUTOCOMMIT=0); /设置mysql不自动提交,需自行用commit语句提交$sql = INSERT INTO user (id, username, sex) VALUES (NULL, test1, 0);$sql2 = INSERT INTO user (did, username, sex) VALUES (NULL, test1, 0);/这条我故意写错$res = mysql_query($sql);$res1 = mysql_query($sql2); if($res & $re

34、s1)mysql_query(COMMIT);echo 提交成功。;elsemysql_query(ROLLBACK);echo 数据回滚。;mysql_query(END); /事务处理完时别忘记mysql_query(SET AUTOCOMMIT=1);自动提交/*对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法*/MyISAM & InnoDB 都支持,/*LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的

35、连接被关闭时,所有由当前线程锁定的表被隐含地解锁。*/mysql_query(LOCK TABLES user WRITE);/锁住user表$sql = INSERT INTO user (id, username, sex) VALUES (NULL, test1, 0);$res = mysql_query($sql);if($res)echo 提交成功。!;elseecho 失败!;mysql_query(UNLOCK TABLES);/解除锁定(6) 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-

36、SQL语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。为什么要使用存储过程: 存储过程是已经被认证的技术! 存储过程会使系统运行更快! 存储过程是可复用的组件!它是数据库逻辑而不是应用程序。 存储过程将被保存!存储过程的优点: 存储过程只在创造时进行编译,以后每次执行存储过

37、程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 存储过程可以重复使用,可减少数据库开发人员的工作量。 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。存储过程与函数的区别: 自定义函数有且只有一个返回值,就像普通的函数一样,可以直接在表达式中嵌入调用。 存储过程可以没有返回值,也可以有任意个输出参数,必须单独调用。 执行的本质都一样。只是函数有如只能返回一个变量的限制。

38、而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。 函数限制比较多,比如不能用临时表,只能用表变量。还有一些函数都不可用等等。而存储过程的限制相对就比较少 函数限制比较多,比如不能用临时表,只能用表变量。还有一些函数都不可用等等。而存储过程的限制相对就比较少 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。创

39、建存储过程:CREATE DEFINER = user | CURRENT_USER PROCEDURE sp_name (proc_parameter,.) characteristic . routine_body说明: DEFINER:指明使用存储过程的访问权限。 sp_name: 存储过程名称。 proc_parameter: IN | OUT | INOUT param_name type in:表示向存储过程中传入参数;存储过程默认为传入参数,所以参数in可以省略; out:表示向外传出参数; inout:表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程; para

40、m_name:参数名; type:参数的类型,可以为mysql任何合法得数据类型。 如果有多个参数,参数之间可以用逗号进行分割。 Characteristic: LANGUAGE SQL | NOT DETERMINISTIC | CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA | SQL SECURITY DEFINER | INVOKER | COMMENT string 这个LANGUAGE SQL子句是没有作用的。仅仅是为了说明下面过程的主体使用SQL语言编写。这条是系统默认的。 如果程序或线程总是对同样的输入参数产

41、生同样的结果,则被认为它是“确定的”( DETERMINISTIC),否则就是“非确定”的。默认的就是NOT DETERMINISTIC。 CONTAINS SQL表示子程序不包含读或写数据的语句。 NO SQL表示子程序不包含SQL语句。 READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。 MODIFIES SQL DATA表示子程序包含写数据的语句。如果这些特征没有明确给定,默认的是CONTAINS SQL。 SQL SECURITY特征可以用来指定子程序该用创建子程序者的许可来执行,还是使用调用者的许可来执行。默认值是DEFINER。 COMMENT子句是一个

42、MySQL的扩展,它可以被用来描述存储程序。这个信息被SHOW CREATE PROCEDURE和 SHOW CREATE FUNCTION语句来显示。存储子程序不能使用LOAD DATA INFILE。 特征子句也有默认值,如果省略了就相当于: LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT routine_body: 包含合法的SQL过程语句。可以使用复合语句语法, 复合语句可以包含声明,循环和其它控制结构语句。修改存储过程: ALTER PROCEDURE sp_name characteristic .说明: 这个

43、语句可以被用来改变一个存储程序的特征。必须用ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。 在ALTER PROCEDURE语句中,可以指定超过一个的改变。删除存储过程:DROP PROCEDURE | FUNCTION IF EXISTS sp_name不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程显示存储过程:SHOW CREATE PROCEDURE sp_name似于SHOW CREATE TABLE,它返回一个可用来重新创建已命名子程序的确切字符串。显示存储过程特征:SHOW PROCEDURE STATUS LIKE pattern

44、它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。调用存储过程:CALL sp_name(parameter,.)调用一个先前用CREATE PROCEDURE创建的程序。CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。它也“返回”受影响的行数,客户端程序可以在SQL级别通过调用ROW_COUNT()函数获得这个数,从C中是调用the mysql_affected_rows() C API函数来获得。存储过程实例(基本的创建、调用、删除语法):delimiter /DROP PROCEDURE IF EXISTS test / 如果存在test则删除C

45、REATE PROCEDURE test /* 存储过程名 */(IN inparms INT, OUT outparams varchar(32) /* 输入、输出参数 */BEGIN /* 语句块头 */ DECLARE var CHAR(10); /* 变量声明 */ IF inparms = 1 THEN /* IF条件开始*/ SET var = hello; /* 赋值 */ ELSE SET var = world; END IF; /* IF结束 */ INSERT INTO t1 VALUES (var); /* SQL语句 */ SELECT name FROM t1 LI

46、MIT 1 INTO outparams;END/delimiter ;call test(1, out); /*调用存储过程*/存储过程的变量:l 声明变量:DECLARE var_name,. type DEFAULT value这个语句被用来声明局部变量。要给变量提供一个默认值,需要包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。局部变量的作用范围在它被声明的BEGIN . END块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。l 变量赋值,SET语句:SET var_name = expr , var_

47、name = expr .也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符,如下所示:mysql SET t1=0, t2=0, t3=0;mysql SELECT t1:=0,t2:=0,t3:=0;对于使用select语句为变量赋值的情况,若返回结果为空,即没有记录,此时变量的值为上一次变量赋值时的值,如果没有对变量赋过值,则为NULL。l 变量赋值,SELECT . INTO语句SELECT col_name,. INTO var_name,. table_expr这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论