浅谈存储过程

【1】什么是过程?过程与函数的区别?什么是存储过程???

函数是带返回值的过程
过程是没有返回值的函数

存储过程:存储在数据库中的封装了若干条SQL语句的过程(MySql不支持不存储的匿名过程)

【2】存储过程的创建语法

MySQL:
create procedure procedureName()
    begin
        -- 存储过程的编程 
        -- SQL statements
    end;

SQLServer:
create procedure  procedurename 
@参数1名 类型 , 
@参数2 类型
as
begin
    -- 存储过程的编程 
    -- SQL statements   
end 

查看所有的procedure : show procedure status;

可给存储过程传递参数

MySQL:
create procedure procedureName([in/out/inout] 参数名 参数类型.....)
                        其中的in/out/inout 是可选的,也就是说可有可无
        in  默认缺省是in类型,为了函数内部使用的,调用时传值 call proName(参数值)
        out 外输出参数,函数处理后,外部可调用(select @参数名)调用:call proName(@参数名)
SQLServer 无括号

inout 兼顾二者的特点

注意:函数调用时,

in类型给传值,call proName(参数值)
out类型给传变量名(函数内部手动初始化)call proName(@参数名)
inout类型 需要传一个已经定义了的变量
set @变量名:=变量初始值;
call proName(@变量名)
如:

MySQL:
    create procedure p1(width int,height int)
    begin
        select concat('area is',width*height ) as area;
        if width>height then 
            select 'you fat';
        elseif width<height then
            select 'you small';
        else 
            select 'you ===';
        end if;
    end;

【3】存储过程调用(MySQL) call procedureName()

【4】存储过程的编程(MySQL)

  • 存储过程是可以编程的( 在begin 和 end 之间 ),可以有 变量,表达式,控制结构

(1)变量:

  • 定义:用declare来声明变量

  • 格式:
    declare 变量名 变量类型 default 默认初始值;
    也可以给变量赋默认值 如 declare gnum int;

  • 赋值:set 变量名=值(或表达式); 如set gnum=gnum+old.much;
    或者 set 变量名:=值,如 set gnum:=gunm+old.num;

  • 使用:直接使用

(2)表达式: +-*/%都可以正常的使用

(3)控制结构:

  • 1)分支机构

    ①if双分支

            if search_condition then statement_list
                [elseif search_condition then statement_list] ...
                [else statement_list]
            end if;

②case多分支

            case 变量
                when 常量 then 表达式;
                when 常量 then 表达式;
                when 常量 then 表达式;
                else 表达式(都未中 相当于default);
            end case;

  • 2)循环结构
            ①while循环
                while search_condition DO
                    ...
                    statement_list
                end while;
            ②repeat循环(相当于 do while)
                repeat  statement_list
                    until search_condition
                end repeat; 



【5】实例( C#调用SQL Server2008存储过程,并封装结果 )


需求
    1.查询全部的学生信息
    2.插入一条学生的信息

1.创建学生表

为了方便演示,假设学生只有三个属性 :学号,姓名,专业

/*
  *@function:学生表
  *@author:Stone6762  
  */
 create table student  
  (
  id char(9)  unique,
  name char(50),
  major char(64),
  primary key (id),
  );

2.创建存储过程

-- =============================================
-- Author:      Stone6762
-- Create date: 2016-10-1 08:12:05
-- Description: 获取全部的学生信息
-- 无参的存储过程的创建
-- =============================================
CREATE PROCEDURE Stu_GetAll 
AS  
BEGIN
     SELECT id,name,major  FROM student ORDER BY id;
END

-- =============================================
-- Author:      Stone6762
-- Create date: 2016-10-1 09:31:08
-- Description: 学生表的插入
-- 有参的存储过程的创建
-- =============================================
CREATE PROCEDURE Stu_Insert 
    @Nid varchar(9) , 
    @Nname varchar(50),
    @Nmajor varchar(7)
AS
BEGIN
    insert into student(id,name,major)values(@Nid,@Nname,@Nmajor);
END


3. C# 链接数据库,调用存储过程,并将数据封装



    
    public class MySSDBSP
    {
       struct Student
        {
            public string id;    
            public string name;
            public string major;
        }
        //因为会多次调用SqlConnection,故此将其写入构造函数里
        private SqlConnection myConnection = null;
        public  OFWZ3()
        {
            //读取配置文件里的数据库连接信息
            //server=服务器名;uid=账号;pwd=密码;database=要连接的数据库;Trusted_Connection=no
            StreamReader sr = new StreamReader("文件名路径\\Config.txt", Encoding.UTF8);
            string connInfor = sr.ReadLine().Trim();
            sr.Close();
            myConnection = new SqlConnection(connInfor);
        }
         #region 操作学生表
        /// 将学生的信息存储到数据库中
        protected bool MyStuSave2DB(Student s)
        {
            //1.获取链接-->构造函数已经做了
            //2.建立可以执行SQL语句的SqlCommand
            SqlCommand MyCommand = new SqlCommand("Stu_Insert", myConnection); //定义一个数据库操作指令

            //3.指明调用的是存储过程
            MyCommand.CommandType = CommandType.StoredProcedure;//设置该语句是读取存储过程的

            //4.给存储过程传递参数
            SqlParameter id = new SqlParameter("@Nid", s.id);
            SqlParameter name = new SqlParameter("@Nname", s.name);
            SqlParameter major = new SqlParameter("@Nmajor", s.major);
            MyCommand.Parameters.Add(id);
            MyCommand.Parameters.Add(name);
            MyCommand.Parameters.Add(major);
            //5.执行存储过程
            try//异常处理
            {
                myConnection.Open();
                MyCommand.ExecuteNonQuery();
                myConnection.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            return true;
        }

        /// 读取学生表中所有的数据
        protected Student[] getAllStuFromDB()
        {
            //1.获取链接--->构造函数已经做了
            //2..建立可以执行SQL语句的SqlCommand
            SqlCommand MyCommand = new SqlCommand("Stu_GetAll", myConnection); //定义一个数据库操作指令
            //3.指明调用的是存储过程
            MyCommand.CommandType = CommandType.StoredProcedure;//设置该语句是读取存储过程的
            //4.设置数据适配器
            SqlDataAdapter SelectAdapter = new SqlDataAdapter();//定义一个数据适配器
            SelectAdapter.SelectCommand = MyCommand;//定义数据适配器的操作指令
            //5.执行存储过程
            try
            {
                myConnection.Open();//打开数据库连接
                SelectAdapter.SelectCommand.ExecuteNonQuery();//执行数据库查询指令
                myConnection.Close();//关闭数据库
            }
            catch (Exception e)
            {
                throw new Exception(e.ToString());
            }
            //6.将结果存储到DataSet里
            DataSet MyDataSet = new DataSet();//定义一个数据集
            SelectAdapter.Fill(MyDataSet);//填充数据集
            //7.解析DataSet中的数据,并将其封装到Student数组里
            DataTable dt = MyDataSet.Tables[0];//获取查询的结果表(因为只有一个)
            return getStuFroTable(dt);//将DataTable里存储的学生信息封装到结构体数组里
        }

        /// 将DataTable里存储的学生信息封装到结构体数组里
        private Student[] getStuFroTable(DataTable dt)
        {
            Student[] students = new Student[dt.Rows.Count];
            for (int i = 0; i < dt.Rows.Count; i++)//遍历行
            {
                students[i].id = dt.Rows[i]["id"].Trim();
                students[i].name = ((string)dt.Rows[i]["name"]).Trim();
                students[i].major = ((string)dt.Rows[i]["major"]).Trim();
            }
            return students;
        }
        #endregion
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,513评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,312评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,124评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,529评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,937评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,913评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,084评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,816评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,593评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,788评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,267评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,601评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,265评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,158评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,953评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,066评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,852评论 2 277

推荐阅读更多精彩内容

  • 存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很...
    微日月阅读 1,816评论 0 1
  • DDL 连接:mysql -uroot -p 显示所有数据库:show databases 创建数据库:creat...
    微日月阅读 523评论 0 1
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,663评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,297评论 18 399
  • 月亮摇摇晃晃的爬上了柳梢,黄昏的余辉早已在冬日里藏起了尾巴。路灯昏黄如洗旧的照片,看不清脚下的远方,可还是看得清那...
    因顾阅读 260评论 4 1