首页 > 代码库 > 存储过程,视图

存储过程,视图

存储过程:

存储过程(stored procedure)有时也称为sproc。存储过程存储于数据库中而不是在单独的文件中,有输入参数、输出参数以及返回值等。

 

在数据库中,创建存储过程和创建其他对象的过程一样,除了它使用的AS关键字外。存储过程的基本语法如下:

CREATE PROCDUER|PROC <sproc name>

    [<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,

    [<parameter name>[schema.]<data type>[VARYING][=<default value>][OUT [PUT]][,

    ...]]

[WITH

    RECOMPILE|ENCRYPTION|[EXECUTE AS {CALLER|SELF|OWNER|<‘user name‘>}]

[FOR REPLICATION]

AS

    <code>|EXTERNAL NAME <assembly name>.<assembly class>

存储过程示例一:

技术分享

执行存储过程方法一:

技术分享

 

执行存储过程方法二:

技术分享

 

      上面说过,存储过程可以定义返回值。

示例:

技术分享

 

修改存储过程示例:

技术分享

 

利用存储过程查找三个表内的信息示例:

技术分享

 

示例:

技术分享

 

示例二:

技术分享

 

练习:

超市管理系统:

表一:门店仓库表 MenDian
列名:商品编号scode、商品名称sname、商品数量sshu、商品单价sprice、商品进货商sgong

表二:进货商的表 Gongying
列名:进货商的编号gcode、进货商名称gname,进货商联系人glian、进货商的电话gtel

表三:小票表 Xiaopiao
列名:小票编号pcode、商品名称pname、商品单价pprice、数量pshu、总价pzong、时间ptime


要求,写一个存储过程,买东西,自动添加小票进入。

1.我又没有这个商品???
2.你买的数量在我店里能不能够???


存储过程的参数,商品编号,要的数量

CREATE table mendian
(
    scode int primary key identity(101,1),
    sname varchar(18),
    sshu int,
    sprice decimal(18,2),
    sgong int,
)
CREATE table gongying
(
    gcode int primary key identity(1,1),
    gname varchar(18),
    glian varchar(18),
    gtel decimal(18,0)
)
CREATE table xiaopiao
(
    pcode int primary key identity(11,1),
    pname varchar(18),
    pprice decimal(18,2),
    pshu int,
    pzong decimal(18,2),
    ptime datetime,
)
INSERT into gongying VALUES(‘AA‘,‘张三‘,110)
INSERT into gongying VALUES(‘BB‘,‘李四‘,119)
INSERT into gongying VALUES(‘CC‘,‘王五‘,120)
INSERT into gongying VALUES(‘DD‘,‘赵六‘,114)
INSERT into gongying VALUES(‘EE‘,‘冯七‘,112)
INSERT into gongying VALUES(‘FF‘,‘钱八‘,911)

INSERT INTO mendian VALUES(‘辣椒酱‘,50,10,1)
INSERT INTO mendian VALUES(‘可口可乐‘,100,3,2)
INSERT INTO mendian VALUES(‘薯片‘,20,4,3)
INSERT INTO mendian VALUES(‘毛巾‘,10,1,4)
INSERT INTO mendian VALUES(‘苹果‘,200,2,5)
INSERT INTO mendian VALUES(‘胖次‘,2,100,6)
CREATE proc guanli
@sp int,@sl int
as
begin
declare @sp1 int
select @sp1=COUNT(*)  from mendian where scode=@sp
IF @sp1=1
    begin
        declare @sl1 int
        select @sl1=sshu from mendian where scode=@sp
        IF @sl1>@sl
            begin
                declare @sn varchar(18)
                select  @sn=sname from mendian where scode=@sp
                declare @spr decimal(18,2)
                select  @spr=sprice from mendian where scode=@sp
                declare @zong decimal(18,2)
                set @zong=@spr * @sl
                declare @time datetime
                set @time=getdate()
                insert INTO xiaopiao VALUES(@sn,@spr,@sl,@zong,@time)
                update mendian SET sshu=@sl1-@sl where scode=@sp
            end
        else
            begin
                declare @gy varchar(18)
                select @gy=gname from gongying where gcode=(SELECT sgong from mendian where scode=@sp)
                declare @gy1 varchar(18)
                select @gy1=glian from gongying where gcode=(SELECT sgong from mendian where scode=@sp)
                declare @gy2 decimal(18,0)
                select @gy2=gtel from gongying where gcode=(SELECT sgong from mendian where scode=@sp)
                print ‘商品数量不足,请联系供应商‘+@gy+‘,联系人:‘+@gy1+‘,联系电话:‘+cast(@gy2 as varchar(18))
            end
    end
else
    begin
        print‘查无此商品‘
    end
end
GO
UPDATE mendian SET sshu=100 WHERE scode=101
SELECT * FROM mendian
SELECT * FROM xiaopiao
EXEC guanli 101,10

视图:

1.视图的概述       视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束)

 

2.视图的存储       与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间。

 

3.视图的作用

      用户可以通过视图以不同形式来显示基表中的数据,视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。视图常见的用途如下:

(1)通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制

(2)隐藏数据复杂性:视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。 

(3)简化用户的SQL 语句:用户使用视图就可从多个表中查询信息,而无需了解这些表是如何连接的。 

(4)以不同的角度来显示基表中的数据::视图的列名可以被任意改变,而不会影响此视图的基表 

(5)使应用程序不会受基表定义改变的影响::在一个视图的定义中查询了一个包含4 个数据列的基表中的3 列。当基表中添加了新的列后,由于视图的定义并没有被影响,因此使用此视图的应用程序也不会被影响。 

(6)保存复杂查询::一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。

(7)逻辑数据独立性::视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

示例1:将下列两个语句写成一个语句

技术分享

 

示例2:利用语句来建立视图,将示例1中的语句写进视图中

技术分享

技术分享

 

示例3:利用鼠标来建立视图的过程

在视图上右击选择新建视图,

技术分享

 

在弹出的页面选择要建立关系的表的名称,

技术分享

 

选择需要的列的名称,并保存取名。

技术分享

 

保存完毕后就可以利用语句直接调用视图。视图就是一个虚拟的新建表。

技术分享

存储过程,视图