控制SQL语句语句块或存储过程的执行流程。IF…ELSE语

合集下载

存储过程及流程控制语句

存储过程及流程控制语句

存储过程及流程控制语句存储过程是⼀个SQL语句集合,当主动去调⽤存储过程时,其中内部的SQL语句会按照逻辑执⾏。

1、创建存储过程对于存储过程,可以接收参数,其参数有三类:in 仅⽤于传⼊参数⽤out 仅⽤于返回值⽤inout 既可以传⼊⼜可以当作返回值有参数的存储过程-- 创建存储过程delimiter \\create procedure p1(in i1 int,in i2 int,inout i3 int,out r1 int)BEGINDECLARE temp1 int;DECLARE temp2 int default 0;set temp1 = 1;set r1 = i1 + i2 + temp1 + temp2;set i3 = i3 + 100;end\\delimiter ;-- 执⾏存储过程set @t1 =4;set @t2 = 0;CALL p1 (1, 2 ,@t1, @t2);SELECT @t1,@t2;1. 结果集delimiter //create procedure p1()beginselect * from v1;end //delimiter ;2. 结果集+out值delimiter //create procedure p2(in n1 int,inout n3 int,out n2 int,)begindeclare temp1 int ;declare temp2 int default 0;select * from v1;set n2 = n1 + 100;set n3 = n3 + n1 + 100;end //delimiter ;3. 事务delimiter \\create PROCEDURE p1(OUT p_return_code tinyint)BEGINDECLARE exit handler for sqlexceptionBEGIN-- ERRORset p_return_code = 1;rollback;END;DECLARE exit handler for sqlwarningBEGIN-- WARNINGset p_return_code = 2;rollback;END;START TRANSACTION;DELETE from tb1;insert into tb2(name)values('seven');COMMIT;-- SUCCESSset p_return_code = 0;END\\delimiter ;4. 游标delimiter //create procedure p3()begindeclare ssid int; -- ⾃定义变量1declare ssname varchar(50); -- ⾃定义变量2DECLARE done INT DEFAULT FALSE;DECLARE my_cursor CURSOR FOR select sid,sname from student;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor;xxoo: LOOPfetch my_cursor into ssid,ssname;if done thenleave xxoo;END IF;insert into teacher(tname) values(ssname);end loop xxoo;close my_cursor;end //delimter ;5. 动态执⾏SQLdelimiter \\CREATE PROCEDURE p4 (in nid int)BEGINPREPARE prod FROM 'select * from student where sid > ?';EXECUTE prod USING @nid;DEALLOCATE prepare prod;END\\delimiter ;2、删除存储过程drop procedure proc_name;3、执⾏存储过程执⾏存储过程-- ⽆参数call proc_name()-- 有参数,全incall proc_name(1,2)-- 有参数,有in,out,inoutset @t1=0;set @t2=3;call proc_name(1,2,@t1,@t2)pymysql执⾏存储过程#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程cursor.callproc('p1', args=(1, 22, 3, 4))# 获取执⾏完存储的参数cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")result = cursor.fetchall()mit()cursor.close()conn.close()print(result)MariaDB [sqlexample]> delimiter $$; MariaDB [sqlexample]> select * from class; -> select * from course$$;+-----+--------------+| cid | caption |+-----+--------------+| 1 | 三年⼆班 || 2 | 三年三班 || 3 | ⼀年⼆班 || 4 | ⼆年九班 || 5 | 全栈⼆班 || 6 | 全栈⼆班 || 7 | uuu || 8 | 'nnn' || 9 | op || 10 | ooo || 11 | ooo || 12 | ooo1 || 13 | ooo2 |+-----+--------------+13 rows in set (0.00 sec)+-----+--------+------------+| cid | cname | teacher_id |+-----+--------+------------+| 1 | ⽣物 | 1 || 2 | 物理 | 2 || 3 | 体育 | 3 || 4 | 美术 | 2 |+-----+--------+------------+4 rows in set (0.00 sec)MariaDB [sqlexample]> delimiter ; MariaDB [sqlexample]> delimiter $$ MariaDB [sqlexample]> create procedure p1() -> BEGIN-> select * from class;-> END $$Query OK, 0 rows affected (0.00 sec) MariaDB [sqlexample]> delimiter ; MariaDB [sqlexample]> call p1();+-----+--------------+| cid | caption |+-----+--------------+| 1 | 三年⼆班 || 2 | 三年三班 || 3 | ⼀年⼆班 || 4 | ⼆年九班 || 5 | 全栈⼆班 || 6 | 全栈⼆班 || 7 | uuu || 8 | 'nnn' || 9 | op || 10 | ooo || 11 | ooo || 12 | ooo1 || 13 | ooo2 |+-----+--------------+13 rows in set (0.01 sec)Query OK, 0 rows affected (0.01 sec) MariaDB [sqlexample]> delimiter // MariaDB [sqlexample]> create procedure p2( -> in i1 int,-> in i2 int,-> inout i3 int,-> out r1 int-> )-> BEGIN-> DECLARE temp1 int;-> DECLARE temp2 int default 0;-> set temp1 = 1;-> set r1 = i1 + i2 + temp1 + temp2;-> set i3 = i3 + 100;-> select * from student;-> end //Query OK, 0 rows affected (0.00 sec) MariaDB [sqlexample]> delimiter ;stored_procedure.py#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")print(r2)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")print(r2)result = cursor.fetchall()print(result)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1[{'@_p1_0': None, '@_p1_1': None, '@_p1_2': None, '@_p1_3': None}]Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p2_0,@_p2_1,@_p2_2,@_p2_3")print(r2)result = cursor.fetchall()print(result)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1[{'@_p2_0': 1, '@_p2_1': 22, '@_p2_2': 103, '@_p2_3': 24}]Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)result1 = cursor.fetchall()print(result1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p2_0,@_p2_1,@_p2_2,@_p2_3")print(r2)result2 = cursor.fetchall()print(result2)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)[{'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '马⼤狗'}, {'sid': 2, 'gender': '⼥', 'class_id': 1, 'sname': '钢蛋'}, {'sid': 3, 'gender': '男', 'class_id': 1, 'sname': '张三'}, {'sid': 4, 'gender': '男','class_id': 1, 'sname': '张⼀'}, {'sid': 5, 'gender': '⼥', 'class_id': 1, 'sname': '张⼆'}, {'sid': 6, 'gender': '男', 'class_id': 1, 'sname': '张四'}, {'sid': 7, 'gender': '⼥', 'class_id': 2, 'sname': '铁锤'}, {'sid': 8, 'gender': '男', 'class_id': 2, 'sname': '李三'}, {'sid': 9, 'gender': '男', 'class_id': 2, 'sname': '李⼀'}, {'sid': 10, 'gender': '⼥', 'class_id': 2, 'sname': '李⼆'}, {'sid': 11, 'gender': '男', 'class_id': 2, 'sname': '李四'}, {'sid': 12, 'gender': '⼥', 'class_id': 3, 'sname': '如花'}, {'sid': 13, 'gender': '男', 'class_id': 3, 'sname': '刘三'}, {'sid': 14, 'gender': '男', 'class_id': 3,'sname': '刘⼀'}, {'sid': 15, 'gender': '⼥', 'class_id': 3, 'sname': '刘⼆'}, {'sid': 16, 'gender': '男', 'class_id': 3, 'sname': '刘四'}, {'sid': 17, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋'}, {'sid': 18, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋1'}, {'sid': 19, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋2'}, {'sid': 20, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋3'}]1[{'@_p2_0': 1, '@_p2_1': 22, '@_p2_2': 103, '@_p2_3': 24}]Process finished with exit code 0其他1、条件语句if条件语句delimiter \\CREATE PROCEDURE proc_if ()BEGINdeclare i int default 0;if i = 1 THENSELECT 1;ELSEIF i = 2 THENSELECT 2;ELSESELECT 7;END IF;END\\delimiter ;2、循环语句while循环delimiter \\CREATE PROCEDURE proc_while ()BEGINDECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECTnum ;SET num = num + 1 ;END WHILE ;END\\delimiter ;repeat循环delimiter \\CREATE PROCEDURE proc_repeat ()BEGINDECLARE i INT ;SET i = 0 ;repeatselect i;set i = i + 1;until i >= 5end repeat;END\\delimiter ;loopBEGINdeclare i int default 0;set i=i+1;if i<8 theniterate loop_label;end if;if i>=10 thenleave loop_label;end if;select i;end loop loop_label;END3、动态执⾏SQL语句动态执⾏SQLdelimiter \\DROP PROCEDURE IF EXISTS proc_sql \\CREATE PROCEDURE proc_sql ()BEGINdeclare p1 int;set p1 = 11;set @p1 = p1;PREPARE prod FROM 'select * from tb2 where nid > ?'; EXECUTE prod USING @p1;DEALLOCATE prepare prod;END\\delimiter ;。

存储过程详细语法

存储过程详细语法

存储过程详细语法嘿,咱今儿就来唠唠存储过程详细语法这档子事儿!你说这存储过程啊,就像是一个魔法盒子,里面装满了各种奇妙的代码和逻辑。

它可不是一般的存在呀!它能让你的数据库操作变得高效又灵活。

先来说说这参数吧,就好比是给魔法盒子设定的开关,通过不同的参数输入,能得到不同的结果呢。

参数有输入参数和输出参数,输入参数就像是给盒子投喂原料,输出参数呢,就是盒子吐出来的成果。

然后是语句块,这可是存储过程的核心部分。

就好像是魔法盒子里的层层机关,各种条件判断、循环语句都在这儿大展身手。

什么 IF-THEN-ELSE 啦,WHILE 循环啦,都在这儿玩得不亦乐乎。

还有啊,存储过程里还能有变量呢!这变量就像是魔法盒子里的小精灵,它们可以存储各种数据,在程序运行过程中蹦蹦跳跳,发挥着重要作用。

再讲讲这游标,游标就像是一个在数据海洋里穿梭的小船,可以一行一行地读取数据,多有意思呀!你想想看,要是没有这些详细的语法,那存储过程不就成了一个空壳子啦?那还怎么高效地处理数据呀!就好比你要盖一座大楼,没有详细的设计图纸和施工规范,那能盖得起来吗?肯定不行呀!这存储过程详细语法就是那设计图纸和施工规范,让我们能有条不紊地搭建起数据库操作的大厦。

而且呀,学会了这些语法,你就像是掌握了一门绝世武功,在数据库的世界里可以自由驰骋啦!难道你不想成为这样的高手吗?你看那些厉害的程序员,哪个不是对存储过程详细语法了如指掌呀!他们能轻松地写出高效又漂亮的存储过程,让数据乖乖听话。

所以呀,别小瞧了这存储过程详细语法,它可是有着大用处呢!好好学起来吧,让你的数据库操作水平更上一层楼!你还在等什么呢?赶紧行动起来呀!。

if exits的用法

if  exits的用法

The following titles are excellent mod_cook books:
Title
-----------------------------------
Silicon Valley Gastronomic Treats
SELECT SUBSTRING(title, 1, 35) AS Title
FROM titles
WHERE type = 'mod_cook'
END
ELSE
PRINT 'Average title price is more than $15.'
下面是结果集:
注释
IF...ELSE 结构可以用在批处理中,存储过程中(经常使用这种结构测试是否存在着某个参数),以及特殊查询中。
可以在其它 IF 之后或在 ELSE 下面,嵌套另一个 IF 测试。对于嵌套层数没有限制。
示例
A. 使用一个 IF...ELSE 块
下面的示例显示带有语句块的 IF 条件。如果书的平均价格不低于 $15,那么就显示文本:Average title price is more than $15.
USE pubs
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
BEGIN
PRINT 'The following titles are excellent mod_cook books:'
PRINT ' '
USE pubs
IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15

Informix存储过程

Informix存储过程

Informix存储过程⼀、存储过程概述 存储过程是⼀个⽤户定义的函数,由存储过程语句(SPL) 和⼀组SQL语句组成,以可以执⾏代码形式存储在数据库中,和表、视图、索引等⼀样,是数据库的⼀种对象。

存储过程语⾔SPL(Stored Procedure Language),只能⽤在存储过程中,可以分成下⾯⼏类:1、变量定义和赋值:define,let2、流程控制:分⽀控制: if then elif else end if;循环控制: FOR,FOREACH,WHILE,EXIT, CONTINUE3、函数调⽤与返回CALL, SYSTEM ,RETURN4、错误处理和调试TRACE, ON EXCEPTION, RAISE EXCEPTION例⼦:drop procedure count_add;--删除存储过程create procedure count_add(user_name_var varchar(50) default'administrator') --user_name_var传递参数变量在此定义returning varchar(50); --返回⼀个字符型的值define error_count_var integer; ----定义输⼊的次数变量select error_count into error_count_var from users where user_name=user_name_var; ----error_count默认是0,从0开始记数let error_count_var=error_count_var 1; ----输⼊⼀次记数加1update users set error_count= error_count_var where user_name=user_name_var return user_name_var; --返回变量值,与returning对应。

mssql中触发器if语句的用法

mssql中触发器if语句的用法

mssql中触发器if语句的用法在mssql中,触发器是一种特殊类型的存储过程,它会在特定的表上执行定义的操作。

触发器可以用于在插入、更新或删除数据时执行自定义操作。

为了进一步控制触发器的行为,我们可以使用if语句。

if语句可以根据条件执行不同的代码块。

在触发器中使用if语句可以帮助我们根据特定的条件来执行不同的操作。

下面是一个示例,展示了mssql中触发器if语句的用法:```sqlCREATE TRIGGER [TriggerName]ON [TableName]AFTER INSERT, UPDATE, DELETEASBEGIN-- 声明并初始化变量DECLARE @Variable INTSET @Variable = (SELECT Column FROM Table)-- 使用if语句根据条件执行不同的操作IF @Variable > 10BEGIN-- 当条件满足时执行的代码块PRINT 'Variable is greater than 10'ENDELSEBEGIN-- 当条件不满足时执行的代码块PRINT 'Variable is less than or equal to 10'ENDEND```在上面的示例中,我们创建了一个触发器,并在插入、更新或删除数据时执行。

在触发器的代码块中,我们声明并初始化了一个变量@Variable,并将表中的某一列的值赋给它。

然后,我们使用if语句判断@Variable的值是否大于10,如果满足条件,则执行相应的代码块,并输出信息。

如果条件不满足,则执行另一个代码块,并输出不同的信息。

通过在mssql中使用触发器和if语句,我们可以根据特定的条件执行不同的操作。

这种灵活性可以帮助我们更好地控制和管理数据库中的数据。

但是,请注意,在使用触发器和if语句时,确保逻辑正确,并避免产生不必要的复杂性。

SQL流程控制语句

SQL流程控制语句

延时语句 WAITFOR
WAITFOR语句可以将它之后的语句在一个指定的时 间间隔之后执行,或在未来的某一指定时间执行。
WAITFOR {DELAY ‘延时时间’ | TIME ‘到达时间
’}
必须是datetime数据类型,
--五秒钟后显示“时间到!”但不能包含日期部分
WAITFOR DELAY '0:00:05' 不超过24小时 PRINT ‘时间到!’
循环语句 WHILE
WHILE Boolean_expression --布尔表达式,进行条件判断 { sql_statement | statement_block } [BREAK] --跳出本层循环 { sql_statement | statement_block } [CONTINUE] --跳出本次循环 { sql_statement | statement_block }
练习:计算从1加到100并输出结果。
DECLARE @sum100 int, @i int SET @sum100=0 SET @i=0 WHILE @i<=100
BEGIN SET @sum100=@sum100+@i SET @i=@i+1
END PRINT @sum100
下列语句实现的什么功能
WHILE( SELECT AVG(Degree)
FROM Score
--计算3-105课的平均成绩
WHERE Cno=‘3-105’ )<85
BEGIN
UPDATE Score
SET Degree= Degree+5 WHERE Cno='3-105'
--将3-105课的成绩提高5分

mysql5.7存储过程写法总结

mysql5.7存储过程写法总结

MySQL 5.7 存储过程是一种在数据库中执行的预编译代码块,用于执行一系列操作。

以下是MySQL 5.7 存储过程的一些常见写法和总结:创建存储过程:sqlCREATE PROCEDURE procedure_name ([parameters])BEGIN-- 存储过程的逻辑代码END;参数定义:IN 参数:用于向存储过程传递值。

OUT 参数:用于从存储过程返回值。

INOUT 参数:既可以向存储过程传递值,也可以从存储过程返回值。

示例:sqlCREATE PROCEDURE example_procedure(IN param1 INT, OUT param2 VARCHAR(255)) BEGIN-- 存储过程的逻辑代码END;变量声明和使用:在存储过程中,可以使用 DECLARE 语句声明变量,并使用 SET 或 SELECT 语句为变量赋值。

示例:sqlDECLARE variable_name datatype;SET variable_name = value;-- 或者SELECT column_name INTO variable_name FROM table_name WHERE condition;控制流语句:MySQL 5.7 存储过程支持各种控制流语句,如 IF、CASE、LOOP、WHILE 等。

示例:sqlIF condition THEN-- 执行逻辑代码ELSEIF another_condition THEN-- 执行其他逻辑代码ELSE-- 执行默认逻辑代码END IF;错误处理:可以使用 DECLARE 语句声明错误处理程序,并在存储过程中使用 SIGNAL 或 RESIGNAL 语句引发或重新引发错误。

示例:sqlDECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGIN-- 错误处理逻辑代码END;游标:游标用于在存储过程中遍历查询结果集。

IF..ELSE..在存储过程的使用规范

IF..ELSE..在存储过程的使用规范

IF..ELSE..在存储过程的使用规范分类:SQL存储过程(@city nvarchar(20),@town nvarchar(20),@village nvarchar(20))asdeclare @num numeric(10)declare @yd_num numeric(10)declare @lt_num numeric(10)declare @gh_num numeric(10)declare @xlt_num numeric(10)select @num=count(jmzh) from jfxd.t_gongan_end_2if @city='aaa'beginselect @yd_num=count(jmzh) from jfxd.t_gongan_end_2 where SERIAL_NUMBER is not null select @lt_num=count(jmzh) from jfxd.t_gongan_end_2 where unicom is not nullselect @gh_num=count(jmzh) from jfxd.t_gongan_end_2 where tel is not nullselect @xlt_num=count(jmzh) from jfxd.t_gongan_end_2 where little_tel is not nullendelse if @town='bbb'begin//sql语句endelsebegin//sql语句endupdate t_stat_info set……GO 存储过程人门字号[大中小]分类:SQL存储过程| 标签:课程目标:一、TRUNCATE二、Select INTO 建表把一个表中的数据复制到另外一个表中。

三、Insert INTO Select四、补充:临时表临时表存储在系统数据库tempdb中临时表会被系统隐式地丢弃---------------------------------------------------------五、存储过程(**)一、简介:存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,集经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行它,在SQL Server 的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.4.3 标量函数
标量函数操作某一单一的值,并返回一个单一的值。 只要在能够使用表达式的地方,就可以使用标量函数。 常用的标量函数有: 1.数学函数 2.字符串函数 实现各种数学运算。(详见P127表6.6) 实现字符串的转换、查找等操作。 (详见P127表6.7) 3.系统函数 返回SQL Server服务器和数据库的特殊信 息。 (详见P128表6.8) 4.日期与时间函数 用于处理datetime和smalldatetime 类型的数据。 (详见P128表6.9)
函数体
RETURN 返回值表达式 END 用户定义函数不能用于执行一组修改全局数据库状态的 操作。
大型数据库——SQL Server 2000程序设计
6.5.1 用户函数的定义
例:下面创建一个用户自定义函数 fn1,把总学分为空 值的改为128。
CREATE FUNCTION fn1 (@inputa tinyint)
大型数据库——SQL Server 2000程序设计
print '02010407号学生不存在,请先添加02010407号学生信息!'
6.3 流程控制语句
2.无条件转移语句——GOTO语句 格式:GOTO 标号 无条件转移到标号处。 3.WHILE、BREAK和CONTINUE语句
格式:WHILE 布尔表达式
OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass', 'SELECT * FROM pubs.dbo.authors
ORDER BY au_lname, au_fname') AS a
大型数据库——SQL Server 2000程序设计
6.4.1 行集函数
例:
大型数据库——SQL Server 2000程序设计
6.4.1 行集函数
2 . OPENROWSET 行集函数 对远程OLE DB数据源执行查询操作。与OPENQUERY 函数相似。语法格式: OPENROWST(字符串,连接参数,查询语句) 例:用 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。 SELECT a.* FROM
OPENQUERY 、 OPENROWSET 、 CONTAINSTABLE 、 FREETEXTTABLE、OPENDATASOURCE、OPENXML
所有行集函数都不具有确定性。每次用一组特定输入值 调用它们时,所返回的结果不总是相同的。有关函数确定 性的更多信息,请参见联机丛书:确定性函数和非确定性 函数。
6.4.2 聚合函数
聚合函数用于计算SELECT语句查询行的统计值,通常 与GROUP BY 语句一起使用,对表进行分组统计。集合 函数不能用于SELECT语句的WHERE子句。
大型数据库——SQL Server 2000程序设计
主要的聚合函数
聚合函数 描述
AVG(expr)
COU均值。该列只能包含数字数据。
计算所有行数,包含空值。 列中最大的值(文本数据类型中按字母 顺序)。忽略空值。
COUNT(expr) 计算表达式中非空值的数量。
MIN(expr)
SUM(expr)
列中最小的值(文本数据类型中按字母
顺序)。忽略空值。 列值的合计。该列只能包含数字数据。
大型数据库——SQL Server 2000程序设计
大型数据库——SQL Server 2000程序设计
6.4.1 行集函数
1 . OPENQUERY 行集函数 对连接服务器上的OLE DB数据源执行查询操作,并返 回查询结果集合,可以在查询的 FROM 子句中像引用表 名那样引用 OPENQUERY 函数。 依 据 OLE DB 提 供 程 序 的 能 力 , 还 可 以 将 OPENQUERY 函 数 引 用 为 INSERT 、 UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集, 但是OPENQUERY 只返回第一个。 语法格式: OPENQUERY ( 连接服务器名称 , 查询命令 )
用户定义函数接受零个或更多的输入参数,并返回单 值。
大型数据库——SQL Server 2000程序设计
6.5.1 用户函数的定义
利用 CREATE FUNCTION语句创建用户自定义函数, 完整修饰的用户自定义函数名称必须唯一。 语法格式: CREATE FUNCTION 函数名 (参数定义 ) RETURNS 返回值 BEGIN
6.3 流程控制语句
流程控制语句用于控制 SQL语句、语句块或存储过程 的执行流程。 语句块是指由 BEGIN…END 所封装 的多条语句 1.IF…ELSE语句 格式:IF 布尔表达式 {SQL 语句或语句块} ELSE {SQL 语句或语句块} 例 6.35 : 在 学 生 情 况 表 ( XSQK ) 中 , 查 找 学 号 为 ‘ 02020112’ 的学生记录,如果有,则显示此记录,如果 无,则显示“此学生不存在!”。 If exists(select * from xsqk where 学号=‘02020112’) select * from xsqk where 学号=‘02020112’ Else print ‘此学生不存在!’
大型数据库——SQL Server 2000程序设计
6.5 用户定义函数
SQL Server支持两种函数类型:
内置函数 按Transact-SQL 参考中定义的方式运行且 不能修改。只有使用Transact-SQL 参考中所定义语法的 Transact-SQL 语句才能引用这类函数。 用户定义函数 用CREATE FUNCTION语句定义自 己的Transact-SQL函数。来补充和扩展系统支持的内置 函数。
RETURNS tinyint
BEGIN IF @inputa IS NULL SET @ inputa=128 RETURN @inputa
END
大型数据库——SQL Server 2000程序设计
6.5.2 用户函数的调用
与系统函数一样,用户定义函数可以从查询中唤醒 调用。也可以像存储过程一样,通过 EXECUTE 语句 执行。 要调用用户自定义函数,要在调用的时候指明函数 的拥有者和函数的名称。 例:要使用上面定义的函数fn1,可以使用下面语句 进行调用。 SELECT 班级,专业,姓名,dbo.fn1(总学分) AS 总学分,性别 FROM XSQK
标量函数 对单一值操作,返回单一值。
只要表达式有效即可使用标量函数。
大型数据库——SQL Server 2000程序设计
6.4.1 行集函数
从SQL Server 7.0开始,新增了行集函数,他们所返回的 对象可以像表一样被 T-SQL 语句所参照。(这些行集函数 返回对象,该对象可在 Transact-SQL 语句中用作表引用。) 行集函数主要有以下几个:
if exists(select * from xsqk where 学号='02010407') print ‘ 此课程已存在!’
if Else exists(select * from xskc where 课程号='A001')
insert into xskc insert into xscj values ('02010407','A001',80,2)
begin
set @sum = @sum + @I set @I = @I + 1 end 思考:将1到500的所有奇数累加求和。
大型数据库——SQL Server 2000程序设计
6.3 流程控制语句
4. RETUEN语句 用于使程序从存储过程中无条件返回。 格式:RETURN {[整数表达式]}
else
values(‘A006’,‘JAVA程序设计’,4,4,3)
思考:现要在学生成绩表中( XSCJ ),插入某个学生的 print 'A001号课程不存在,请先添加 A001 号课程信息!' 成绩信息(‘02010407’,‘ A006’,80,4),请根据数 else 据完整性要求,设计SQL语句。
流程控制语句构成程序块的基本结构,一般用于 存储过程和触发器的定义中,具体应用我们将在存 储过程和触发器的有关章节中介绍。
大型数据库——SQL Server 2000程序设计
6.4 系统内置函数
函数可以帮助用户获取信息、执行数学计算和统计功 能、实现数据的类型转换等等。T-SQL提供了主要三种 类型的函数。 Transact-SQL 编程语言提供三种函数: 行集函数 聚合函数 可以像 SQL 语句中表引用一样使用。 对一组值操作,但返回单一的汇总值。
大型数据库——SQL Server 2000程序设计
6.5.3 用户函数的删除
可以用DROP FUNCTION 语句进行函数的删除。
例:删除自定义函数fn1。 DROP FUNCTION dbo.fn1
用户定义函数用 ALTER FUNCTION 修改
大型数据库——SQL Server 2000程序设计
3. CONTAINSTABLE 行集函数
对表中所有列或指定列进行包含式全文查询。 4. FREETEXTTABLE 行集函数 对表中所有列或指定列进行自由格式全文查询。即在一 个表的所有列或指定列中搜索一个自由文本格式的字符串, 并返回与该字符串匹配的数据行。
大型数据库——SQL Server 2000程序设计
BEGIN
BREAK : 使 程 序 从 循 环中跳出; CONTINUE:使程序跳 过循环体内其后续语句, 结束本次循环,执行下 一次循环。
相关文档
最新文档