关键词:

create procedure xxx()as.......go

查询: exec  ...

从例子中感悟一下:

create table cartoon(
linenum int,
name varchar(50) not null,
line varchar(100) not null
)insert into cartoon values(1,'灰太狼','我一定会回来的!')
insert into cartoon values(2,'老爹','妖魔鬼怪快离开,妖魔鬼怪快离开')
insert into cartoon values(3,'胡图图','看我的动耳神功')
insert into cartoon values(4,'小智','就决定是你了,妙蛙种子!')
insert into cartoon values(5,'不二周助','正因为我看不见,所以才能赢')
insert into cartoon values(6,'大头儿子','大头大头下雨不愁,人家有伞,我有大头。')

创建如下表:

回顾一下之前是怎么创建游标的:

输出以下格式:序号:+名字+‘说’+经典台词

declare @name varchar(10),@num int,@linetext varchar(50)
declare word_cursor cursor    -----定义游标
forselect name,line from cartoon -----name和line两个变量参与游标移动过程set @num=1
open word_cursor
fetch next from word_cursor into @name,@linetext
while @@FETCH_STATUS = 0
beginprint cast(@num as varchar(10)) +':'+@name+'说:'+@linetextfetch next from word_cursor into @name,@linetext    -----移动游标set @num=@num+1   ------记录游标移动的行数
end
close word_cursor
deallocate word_cursor

得到

例题要求:若句子结尾没有‘,(逗号)‘!’(感叹号)‘。’(句号)‘?’(问号),则为其统一加上‘,’(逗号)。

这里需要用到内嵌函数:right(x,y):不熟悉内嵌函数,可以认真看下:

http://t.csdn.cn/oC845

可更新的游标:

declare @num int,@linetext varchar(50)
declare line_cursor cursor
forselect line from cartoon for update;---------for update
set @num=1
open line_cursor
fetch next from line_cursor into @linetext
while @@FETCH_STATUS=0
beginif(right(@linetext,1) not in(',','。','!','?'))update cartoon set line =@linetext+'。' where current of line_cursorfetch next from line_cursor into @linetextset @num=@num+1
end
close line_cursor
deallocate line_cursor

得到:

如果不加上

 where current of line_cursor

会出现如下情况:

 WHERE CURRENT OF子句可用于基于游标的嵌入式SQL UPDATEDELETE语句,以指定位于要更新或删除记录上的游标。

例如上面这个例子,更新最后一个FETCH命令从“line_cursor”游标获得的行。

关于WHERE和WHERE CURRENT OF

嵌入式SQL UPDATE或DELETE可以使用WHERE子句(不带游标)或WHERE CURRENT OF(带声明游标),但不能同时使用两者。
如果指定的UPDATE或DELETE既不带WHERE也不带WHERE CURRENT OF,则会更新或删除表中的所有记录。

更新的限制
当使用WHERE CURRENT OF子句时,不能使用当前字段值更新字段以生成更新的值。
例如

SET Salary=Salary+100或SET Name=UPPER(Name)

尝试这样做会导致SQLCODE -69错误:

SET <field> = <value expression> not allowed with WHERE CURRENT OF <cursor>。

参照原文:https://blog.csdn.net/yaoxin521123/article/details/121602006

注意:这里是update,如果想要重新编写代码,可以

drop table cartoon

再将上面的创建和插入语句运行一遍

 进入正题:存储过程的建立:

例题要求: exec n:输出1到n的语句

create procedure ShowCartoon(@v_linenum varchar(100) output    -------v_linenum表示需要输出的语句个数
)
as
begin
declare @linetext varchar(100);
declare line_cursor cursor forselect line from cartoonwhere linenum<=@v_linenumorder by linenum;open line_cursorfetch next from line_cursor into @linetextwhile @@FETCH_STATUS=0beginprint @linetext;fetch next from line_cursor into @linetext;endclose line_cursordeallocate line_cursor;
end
go

输入

exec ShowCartoon 3

得到

注:如果想直接修改,他会提示你“数据库已存在名为“xxx”的对象”

drop procedure ShowCartoon

再此运行编写后的代码就行

例题2要求:输出

第一个动画片段:

xxxxxx

xxxxxx(两句话)

方法1:

create procedure ShowCartoon2
asdeclare @linetext varchar(100);declare @num int;declare @num2 int;declare @name varchar(30);set @num2=1declare cursor_linetext cursor forselect name,line from cartoonorder by linenum;open cursor_linetextfetch next from cursor_linetext into @name,@linetext;while @@FETCH_STATUS=0beginprint '第'+cast(@num2 as varchar)+'个动画片段:'set @num=1while(@num<=2)beginprint @name+'说:'+@linetextfetch next from cursor_linetext into @name,@linetext;set @num=@num+1endset @num2=@num2+1endclose cursor_linetext;deallocate cursor_linetext;
go

调用存储过程

exec ShowCartoon2

得到:

方法2:

create procedure ShowCartoon2
asdeclare @linenum int;declare @linetext varchar(100);declare @name varchar(30);declare cursor_linetext cursor forselect linenum,name,line from cartoonorder by linenum;open cursor_linetextfetch next from cursor_linetext into @linenum,@name,@linetext;while @@FETCH_STATUS=0beginif @linenum%2=1beginprint '第'+cast((@linenum+1)/2 as varchar(5))+'个动画片段:'print @name+'说:'+@linetextendelsebeginprint @name +'答:'+@linetextprint '' endfetch next from cursor_linetext into @linenum,@name,@linetext;endclose cursor_linetext;deallocate cursor_linetext;
go

记得先drop procedure ShowCartoon,再

exec ShowCartoon2
得到
建立存储过程 2 ,在存储过程 2 中调用存 储过程 1
这个例子不好举例,我们建立这样一张表,建表过程忽略:

建立存储过程:

CREATE PROCEDURE SanGuoHuman(@v_name VARCHAR(20) OUTPUT
)
AS
BEGINDECLARE @name VARCHAR(20);DECLARE @mypower int;DECLARE @weapon VARCHAR(20);DECLARE @horse VARCHAR(20);DECLARE @birthyear int;DECLARE sanguo_cursor CURSOR FORSELECT name, mypower, weapon, horse, birthyear from SanGuoWHERE name = @v_name;OPEN sanguo_cursor;FETCH NEXT FROM sanguo_cursor INTO @name, @mypower, @weapon, @horse, @birthyear;WHILE @@FETCH_STATUS = 0BEGINPRINT '姓名:'+@name;PRINT '武力:' + CAST( @mypower AS VARCHAR );PRINT '兵器:' + @weapon;PRINT '坐骑:' + @horse;PRINT '出生年份:公元' + CAST( @birthyear AS VARCHAR );PRINT ' ';FETCH NEXT FROM sanguo_cursor INTO @name, @mypower, @weapon, @horse, @birthyear;ENDCLOSE sanguo_cursor;DEALLOCATE sanguo_cursor;
END
GO
调用
EXEC sanguohuman '刘备';

得到:

调用这一存储过程

CREATE PROCEDURE SanGuoBrother
ASDECLARE @name VARCHAR(20);DECLARE cursor_human CURSOR FORSELECT name FROM SanGuo ORDER BY birthyear ASC;
BEGINOPEN cursor_human;FETCH NEXT FROM cursor_human INTO @name;WHILE @@FETCH_STATUS = 0BEGINexec SanGuoHuman @name;     ------调用存储过程1FETCH NEXT FROM cursor_human INTO @name; ENDCLOSE cursor_human;DEALLOCATE cursor_human;
END
GOEXEC SanGuoBrother;

讲存储过程1的形式扩展到存储过程2,使得存储过程代码看起来更加简洁

得到:

数据库sql语句-----游标和存储过程相关推荐

  1. 通过DBA_SOURCE定位SQL语句属于哪个存储过程

    通过DBA_SOURCE定位SQL语句属于哪个存储过程 最近集中进行了一系列SQL优化,主要通过ADDM和AWR对捕捉COST或物理读.逻辑读很高的语句,问题的主要原因是全表扫描.但提交开发后开发反馈 ...

  2. oracle数据库----SQL语句的实践(应用实例)

    oracle数据库----SQL语句的实践(应用实例) 创建表工资表salary,包括员工号emp_id,员工名emp_name,员工月基本工资monthsal,员工月总发工资totalsal. cr ...

  3. MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...

    本文主要向大家介绍了SQLServer数据库sql语句中----删除表数据drop.truncate和delete的用法,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 虽 ...

  4. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  5. mysql sql exists_数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  6. 计算机导论sql试题,数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  7. 数据库三级考mysql还是sqlse_计算机三级考试数据库SQL语句整理

    计算机三级考试数据库SQL语句整理 本文是关于计算机三级考试数据库SQL语句整理,包括创建数据库.删除数据库.备份sql server.创建新表等,供同学们参考学习!想了解更多相关信息请持续关注我们应 ...

  8. 数据库SQL语句课堂总结(2)——子查询

    废话引言 我有一个梦想,有一天能跟上单大师敲sql的速度QAQ 本文数据库同数据库SQL语句课堂总结(1) 主要介绍子查询的相关语句 正文开始 子查询介绍 定义: 子查询允许把一个查询嵌套在另一个查询 ...

  9. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

最新文章

  1. python学习之pip常用命令
  2. Android 10.0系统启动之init进程-[Android取经之路]
  3. 如何生成HDF5文件
  4. @RequestMapping和@GetMapping @PostMapping 区别
  5. html语言hr的用法,htmlhr各种样式使用 - 米扑博客
  6. 一加7 Pro卖到断货 刘作虎:最快速度满足中国用户需求
  7. pku2594 Treasure Exploration
  8. 无法使用prop_Adobe Launch配置流量变量(Prop)
  9. 慎用JSON.stringify
  10. 雷达原理(第五版)常见公式
  11. 局域网文件共享服务器速度如何提升,分享提高XP访问局域网共享文件速度的方法...
  12. c语言把数字转换为字母,c语言输入数字变成字母
  13. 【北大/上交/浙大/中科大/山大】公布复试分数线!【34所自划线】
  14. 与人斗其乐无穷,教你回答职场送命题!
  15. 吴恩达深度学习第一课第三周编程作业(上)
  16. Java大作业——聊天室
  17. 最新版本 PHP (windows)开发环境配置
  18. 计算机基础上机考试系统,《计算机基础》课程上机考试系统的设计与实现
  19. 企业能耗管理系统智能化升级
  20. iPad怎么下载pdf 通过chrome

热门文章

  1. linux内核2.6.3x--General setup 常规设置
  2. 高矿化度矿井水深度除氟装置CH-87技术解析
  3. FileInputFormat 之 NlineInputFormat
  4. 通过脚本自动完成叠猫猫游戏-方案对比分析
  5. ios系统 微信时间显示NANANANA
  6. (官网)虚幻3--Scaleform 技术指南
  7. set集合,深浅拷贝
  8. 使用虚拟机中Inter VT-x处于禁用状态的解决办法
  9. 从零开始java文件服务器篇:文件服务器
  10. 计算机应用 专业优势,计算机应用专业有何优势