精华内容
参与话题
问答
  • 面向对象与面向过程的本质的区别

    万次阅读 多人点赞 2018-01-10 20:19:04
    如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的! 一、面向对象与面向过程的区别 面向过程就是分析出解决问题所...

    前言:

    如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的!

    一、面向对象与面向过程的区别

    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

    可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

    如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

    可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

    上述的内容是从网上查到的,觉得这个例子非常的生动形象,我就写了下来,现在就应该理解了他俩的区别了吧,其实就是两句话,面向对象就是高度实物抽象化、面向过程就是自顶向下的编程!

    二、面向对象的特点

    在了解其特点之前,咱们先谈谈对象,对象就是现实世界存在的任何事务都可以称之为对象,有着自己独特的个性

    这里写图片描述
    属性用来描述具体某个对象的特征。比如小志身高180M,体重70KG,这里身高、体重都是属性。
    面向对象的思想就是把一切都看成对象,而对象一般都由属性+方法组成!

    属性属于对象静态的一面,用来形容对象的一些特性,方法属于对象动态的一面,咱们举一个例子,小明会跑,会说话,跑、说话这些行为就是对象的方法!所以为动态的一面, 我们把属性和方法称为这个对象的成员!

    :具有同种属性的对象称为类,是个抽象的概念。比如“人”就是一类,期中有一些人名,比如小明、小红、小玲等等这些都是对象,类就相当于一个模具,他定义了它所包含的全体对象的公共特征和功能,对象就是类的一个实例化,小明就是人的一个实例化!我们在做程序的时候,经常要将一个变量实例化,就是这个原理!我们一般在做程序的时候一般都不用类名的,比如我们在叫小明的时候,不会喊“人,你干嘛呢!”而是说的是“小明,你在干嘛呢!”

    面向对象有三大特性,分别是封装性、继承性和多态性,这里小编不给予太多的解释,因为在后边的博客会专门总结的!

    三、面向过程与面向对象的优缺点

    很多资料上全都是一群很难理解的理论知识,整的小编头都大了,后来发现了一个比较好的文章,写的真是太棒了,通俗易懂,想要不明白都难!

    用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。

    蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。

    蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。

    到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。

    盖浇饭的好处就是"菜"“饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,“饭” 和"菜"的耦合度比较低。蛋炒饭将"蛋”“饭"搅和在一起,想换"蛋”"饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。
      
    看了这篇文章,简单的总结一下!

    面向过程

    优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
    缺点:没有面向对象易维护、易复用、易扩展

    面向对象

    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
    缺点:性能比面向过程低

    展开全文
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...

                                                  oracle存储过程

    目录

             一.什么是存储过程

    二.为什么要写存储过程

    三.存储过程基础

    1.存储过程结构

    2.存储过程语法

    3.pl/sql处理存储过程

    四.存储过程进阶

    1.BUIK COLLECT

    2.FORALL

    3.pl/sql调试存储过程

    4.案例实战

    附.参考资料


    一.什么是存储过程

    存储过程,百度百科上是这样解释的,存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。

    简单的说就是专门干一件事一段sql语句。

    可以由数据库自己去调用,也可以由java程序去调用。

    在oracle数据库中存储过程是procedure。

    二.为什么要写存储过程

    1.效率高

      存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本  上),都要先分析编译才会执行。所以想对而言存储过程效率更高。

    2.降低网络流量

    存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。

    3.复用性高

    存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。

    4.可维护性高

    当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。

    5.安全性高

    完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。

    三.存储过程基础

    1.存储过程结构

    (1).基本结构

    Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理)

    (2).无参存储过程

    CREATE OR REPLACE PROCEDURE demo AS/IS
    	变量2 DATE;
    	变量3 NUMBER;
    BEGIN
    	--要处理的业务逻辑
    	EXCEPTION    --存储过程异常
    END 
    

    这里的as和is一样任选一个,在这里没有区别,其中demo是存储过程名称。

    (3).有参存储过程

    a.带参数的存储过程

    CREATE OR REPLACE PROCEDURE 存储过程名称(param1 student.id%TYPE)
    AS/IS
    name student.name%TYPE;
    age number :=20;
    BEGIN
      --业务处理.....
    END

    上面脚本中,

    第1行:param1 是参数,类型和student表id字段的类型一样。

    第3行:声明变量name,类型是student表name字段的类型(同上)。

    第4行:声明变量age,类型数数字,初始化为20

     

    b.带参数的存储过程并且进行赋值

    CREATE OR REPLACE PROCEDURE 存储过程名称(
           s_no in varchar,
           s_name out varchar,
           s_age number) AS
    total NUMBER := 0;
    BEGIN
      SELECT COUNT(1) INTO total FROM student s WHERE s.age=s_age;
      dbms_output.put_line('符合该年龄的学生有'||total||'人');
      EXCEPTION
        WHEN too_many_rows THEN 
        DBMS_OUTPUT.PUT_LINE('返回值多于1行'); 
    END

    上面脚本中:

    其中参数IN表示输入参数,是参数的默认模式。
    OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
    OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
    IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去

    第7行:查询语句,把参数s_age作为过滤条件,INTO关键字,把查到的结果赋给total变量。

    第8行:输出查询结果,在数据库中“||”用来连接字符串

    第9—11行:做异常处理

    2.存储过程语法

    (1).运算符

    这里s,m,n是变量,类型是number;

    分类

    运算符

    含义

    示例表达式

     

     

     

    算术运算符

    +

    s := 2 + 2;

    -

    s := 3 – 1;

    *

    s := 2 * 3;

    /

    s := 6 / 2;

    mod(,)

    取模,取余

    m : = mod(3,2)

    **

    乘方

    10**2 =100

     

     

     

    关系运算符

    =

    等于

    s = 2

    <>或!=或~=

    不等于

    s != 2

    <

    小于

    s < 3

    >

    大于

    s > 0

    <=

    小于等于

    s <= 9

    >=

    大于等于

    s >= 1

     

     

    比较运算符

    LIKE

    满足匹配为true

    ‘li’ like ‘%i’返回true

    BETWEEN

    是否处于一个范围中

    2 between 1 and 3 返回true

    IN

    是否处于一个集合中

    ‘x’ in (‘x’,’y’) 返回true

    IS NULL

    判断变量是否为空

    若:n:=3,n is null,返回false

     

    逻辑运算符

    AND

    逻辑与

    s=3 and c is null

    OR

    逻辑或

    s=3 or c is null

    NOT

    逻辑非

    not c is null

     

    其他

    :=

    赋值

    s := 0;

    ..

    范围

    1..9,即1至9范围

    ||

    字符串连接

    ‘hello’||’world’

     

    (2).SELECT INTO STATEMENT语句

    该语句将select到的结果赋值给一个或多个变量,例如:

    CREATE OR REPLACE PROCEDURE DEMO_CDD1 IS
    s_name VARCHAR2;   --学生名称
    s_age NUMBER;      --学生年龄
    s_address VARCHAR2; --学生籍贯
    BEGIN
      --给单个变量赋值
      SELECT student_address INTO s_address
      FROM student where student_grade=100;
       --给多个变量赋值
      SELECT student_name,student_age INTO s_name,s_age
      FROM student where student_grade=100;
      --输出成绩为100分的那个学生信息
      dbms_output.put_line('姓名:'||s_name||',年龄:'||s_age||',籍贯:'||s_address);
    END

    上面脚本中:

    存储过程名称:DEMO_CDD1, student是学生表,要求查出成绩为100分的那个学生的姓名,年龄,籍贯

    (3).选择语句

    a.IF..END IF

    学生表的sex字段:1-男生;0-女生

    IF s_sex=1 THEN
      dbms_output.put_line('这个学生是男生');
    END IF

    b.IF..ELSE..END IF

    IF s_sex=1 THEN
      dbms_output.put_line('这个学生是男生');
    ELSE
      dbms_output.put_line('这个学生是女生');
    END IF

    (4).循环语句

    a.基本循环

    LOOP
      IF 表达式 THEN
        EXIT;
      END IF
    END LOOP;

    b.while循环

    WHILE 表达式 LOOP
      dbms_output.put_line('haha');
    END LOOP;

    c.for循环

    FOR a in 10 .. 20 LOOP
      dbms_output.put_line('value of a: ' || a);
    END LOOP;

    (5).游标

        Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。

        游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)SQL语句返回。行集合光标保持的被称为活动集合。

    a.下表是常用的游标属性

    属性

    描述

    %FOUND

    如果DML语句执行后影响有数据被更新或DQL查到了结果,返回true。否则,返回false。

    %NOTFOUND

    如果DML语句执行后影响有数据被更新或DQL查到了结果,返回false。否则,返回true。

    %ISOPEN

    游标打开时返回true,反之,返回false。

    %ROWCOUNT

    返回DML执行后影响的行数。

    b.使用游标

    声明游标定义游标的名称和相关的SELECT语句:

    CURSOR cur_cdd IS SELECT s_id, s_name FROM student;

    打开游标游标分配内存,使得它准备取的SQL语句转换成它返回的行:

    OPEN cur_cdd;

    抓取游标中的数据,可用LIMIT关键字来限制条数,如果没有默认每次抓取一条:

    FETCH cur_cdd INTO id, name ;

    关闭游标来释放分配的内存:

    CLOSE cur_cdd;

    3.pl/sql处理存储过程

    (1).新建存储过程:右键procedures,点击new,弹出PROCEDURE框,再点击OK,如下图:

     

    (2).在下面的编辑区,编写存储过程脚本

     

    (3).在这里我们编写一个demo_cdd存储过程,要求输出“hello world”,如下图:

     

    (4).右键刚才新建的存储过程名称,点击“Test”,在点击执行按钮

     

    4.案例实战

    场景:

    有表student(s_no, s_name, s_age, s_grade),其中s_no-学号,也是主键,是从1开始向上排的(例如:第一个学生学号是1,第二个是2,一次类推);s_name-学生姓名;s_age-学生年龄;s_grade-年级;这张表的数据量有几千万甚至上亿。一个学年结束了,我要让这些学生全部升一年级,即,让s_grade字段加1。

    这条sql,写出来如下:

    update student set s_grade=s_grade+1

    分析:

    如果我们直接运行运行这条sql,因数据量太大会把数据库undo表空间撑爆,从而发生异常。那我们来写个存储过程,进行批量更新,我们每10万条提交一次。

    CREATE OR REPLACE PROCEDURE process_student is
    total NUMBER := 0;
    i NUMBER := 0;
    BEGIN
      SELECT COUNT(1) INTO total FROM student;
      WHILE i<=total LOOP
        UPDATE student SET grade=grade+1 WHERE s_no=i;
        i := i + 1;
        IF i >= 100000 THEN
          COMMIT;
        END IF;
      END LOOP;
      dbms_output.put_line('finished!');
    END;
    

    四.存储过程进阶

           在上面的案例中,我们的存储过程处理完所有数据要多长时间呢?事实我没有等到它执行完,在我可接受的时间范围内它没有完成。那么对于处理这种千万级数据量的情况,存储过程是不是束手无策呢?答案是否定的,接下来我们看看其他绝招。

           我们先来分析下执行过程的执行过程:一个存储过程编译后,在一条语句一条语句的执行时,如果遇到pl/sql语句就拿去给pl/sql引擎执行,如果遇到sql语句就送到sql引擎执行,然后把执行结果再返回给pl/sql引擎。遇到一个大数据量的更新,则执行焦点(正在执行的,状态处于ACTIVE)会不断的来回切换。

           Pl/SQL与SQL引擎之间的通信则称之为上下文切换,过多的上下文切换将带来过量的性能负载。最终导致效率降低,处理速度缓慢。

           从Oracle8i开始PL/SQL引入了两个新的数据操纵语句:FORALLBUIK COLLECT,这些语句大大滴减少了上下文切换次数(一次切换多次执行),同时提高DML性能,因此运用了这些语句的存储过程在处理大量数据时速度简直和飞一样。

    1.BUIK COLLECT

        Oracle8i中首次引入了Bulk Collect特性,Bulk Collect会能进行批量检索,会将检索结果结果一次性绑定到一个集合变量中,而不是通过游标cursor一条一条的检索处理。可以在SELECT INTO、FETCH INTO、RETURNING INTO语句中使用BULK COLLECT,接下来我们一起看看这些语句中是如何使用BULK COLLECT的。

    (1).SELECT INTO

    查出来一个结果集合赋值给一个集合变量。

    语法结构是:

    SELECT field BULK COLLECT INTO var_conllect FROM table where colStatement;

    说明:

           field:要查询的字段,可以是一个或多个(要保证和后面的集合变量要向对应)。

           var_collect:集合变量(联合数组等),用来存放查到的结果。

           table:表名,要查询的表。

           colStatement:后面过滤条件语句。比如s_age < 10;

    例子:查出年龄小于10岁的学生姓名赋值给数组arr_name变量

    SELECT s_name BULK COLLECT INTO arr_name FROM s_age < 10;

    (2).FETCH INTO

    从一个集合中抓取一部分数据赋值给一个集合变量。

    语法结构如下:

    FETCH cur1 BULK COLLECT INTO var_collect [LIMIT rows]

    说明:

            cur1:是个数据集合,例如是个游标。

            var_collect:含义同上。

            [LIMIT rows]:可有可无,限制每次抓取的数据量。不写的话,默认每次一条数据。

    例子:给年龄小于10岁的学生的年级降一级。

    --查询年龄小于10岁的学生的学号放在游标cur_no里
    CURSOR cur_no IS 
    		SELECT s_no FROM student WHERE s_age < 10;
    
    --声明了一个联合数组类型,元素类型和游标cur_no每个元素的类型一致
    TYPE ARR_NO IS VARRAY(10) OF cur_no%ROWTYPE;
    
    --声明一个该数组类型的变量no
    no ARR_NO;
    BEGIN
      FETCH cur_no BULK COLLECT INTO no LIMIT 100;
      FORALL i IN 1..no.count SAVE EXCEPTONS
    	UPDATE student SET s_grade=s_grade-1 WHERE no(i);
    END;
    

    说明:先查出年龄小于10岁的学生的学号放在游标里,再每次从游标里拿出100个学号,进行更新,给他们的年级降一级。

    (3).RETURNING

    BULK COLLECT除了与SELECT,FETCH进行批量绑定之外,还可以与INSERT,DELETE,UPDATE语句结合使用,可以返回这些DML语句执行后所影响的记录内容(某些字段)。

    再看一眼学生表的字段情况:student(s_no, s_name, s_age, s_grade)

    语法结构如下:

    DMLStatement
           RETURNING field BULK COLLECT INTO var_field;

    说明:

            DMLStatement:是一个DML语句。

            field:是这个表的某个字段,当然也可以写多个逗号隔开(field1,field2, field3)。

            var_field:一个类型为该字段类型的集合,多个的话用逗号隔开,如下:

            (var_field1, var_field2, var_field3)

     

    例子:获取那些因为年龄小于10岁而年级被将一级的学生的姓名集合。

    TYPE NAME_COLLECT IS TABLE OF student.s_name%TYPE;
    names NAME_COLLECT;
    BEGIN
      UPDATE student SET s_grade=s_grade-1 WHERE s_age < 10
      RETURNING s_name BULK COLLECT INTO names;
    END;

    说明:

           NAME_COLLECT:是一个集合类型,类型是student表的name字段的类型。

           names:定义了一个NAME_COLLECT类型的变量。

    (4).注意事项

    a.不能对使用字符串类型作键的关联数组使用BULK COLLECT 子句。

    b.只能在服务器端的程序中使用BULK COLLECT,如果在客户端使用,就会产生一个不支持这个特性的错误。

    c.BULK COLLECT INTO 的目标对象必须是集合类型。

    d.复合目标(如对象类型)不能在RETURNING INTO 子句中使用。

    e.如果有多个隐式的数据类型转换的情况存在,多重复合目标就不能在BULK COLLECT INTO 子句中使用。

    f.如果有一个隐式的数据类型转换,复合目标的集合(如对象类型集合)就不能用于BULK COLLECTINTO 子句中。

    2.FORALL

    (1).语法

    FORALL index IN bounds [SAVE EXCEPTIONS]     
         sqlStatement;

    说明:

            index是指下标;

            bounds是一个边界,形式是start..end

            [SAVE EXCEPTIONS] 可写可不写,这个下面介绍;

            sqlStatement是一个DML语句,这里有且仅有一个sql语句;

    例子:

    --例子1:移除年级是5到10之间的学生
    FORALL i IN 5..10
           DELETE FROM student where s_grade=i;
    --例子:2,arr是一个数组,存着要升高一年级的学生名称
    FORALL s IN 1..arr.count SAVE EXCEPTIONS
           UPDATE student SET s_grade=s_grade+1 WHERE s_name=arr(i);

    (2).SAVE EXCEPTIONS

    通常情况写我们在执行DML语句时,可能会遇到异常,可能致使某个语句或整个事务回滚。如果我们写FORALL语句时没有用SAVE EXCEPTIONS语句,那么DML语句会在执行到一半的时候停下来。

           如果我们的FORALL语句后使用了SAVE EXCEPTIONS语句,当在执行过程中如果遇到异常,数据处理会继续向下进行,发生的异常信息会保存到SQL%BULK_EXCEPTONS的游标属性中,该游标属性是个记录集合,每条记录有两个字段,例如:(1, 02300);

           ERROR_INDEX:该字段会存储发生异常的FORALL语句的迭代编号;

           ERROR_CODE:存储对应异常的,oracle错误代码;

    SQL%BULK_EXCEPTONS这个异常信息总是存储着最近一次执行的FORALL语句可能发生的异常。而这个异常记录集合异常的个数则由它的COUNT属性表示,即:

           SQL%BULK_EXCEPTONS.COUNT,SQL%BULK_EXCEPTIONS有效的下标索引范围在1到%BULK_EXCEPTIONS.COUNT之间。

    (3). INDICES OF

    在Oracle数据库10g之前有一个重要的限制,该数据库从IN范围子句中的第一行到最后一行,依次读取集合的内容,如果在该范围内遇到一个未定义的行,Oracle数据库将引发ORA-22160异常事件:ORA-22160: element at index [N] does not exist。针对这一问题,Oracle后续又提供了两个新语句:INDICES OF 和 VALUES OF。

    接下来我们来看看这个INDICES OF语句,用于处理稀疏数组或包含有间隙的数组(例如:一个集合的某些元素被删除了)。

    该语句语法结构是:

    FORALL i INDICES OF collection [SAVE EXCEPTIONS]
    
           sqlStatement;

    说明:

    i:集合(嵌套表或联合数组)下标。

    collection:是这个集合。

    [SAVE EXCEPTIONS]和sqlStatement上面已经解释过。

    例子:arr_std是一个联合数组,每个元素包含(name,age,grade),现在要向student表插入数据。

    FORALL i IN INDICES OF arr_stu
           INSERT INTO student VALUES(
               arr_stu(i).name,
                  arr_stu(i).age,
                  arr_stu(i).grade
           );

    (4). VALUES OF

    VALUES OF适用情况:绑定数组可以是稀疏数组,也可以不是,但我只想使用该数组中元素的一个子集。VALUES OF选项可以指定FORALL语句中循环计数器的值来自于指定集合中元素的值。但是,VALUES OF在使用时有一些限制:

           如果VALUES OF子句中所使用的集合是联合数组,则必须使用PLS_INTEGER和BINARY_INTEGER进行索引,VALUES OF 子句中所使用的元素必须是PLS_INTEGER或BINARY_INTEGER;

           当VALUES OF 子句所引用的集合为空,则FORALL语句会导致异常;

    该语句的语法结构是:

    FORALL i IN VALUES OF collection [SAVE EXCEPTIONS]
           sqlStatement;

    说明:i和collection含义如上

    联合数组请看文章(或自行百度):https://blog.csdn.net/leshami/article/details/7372061

    3.pl/sql调试存储过程

    首先,当前这个用户得有能调试存储过程的权限,如果没有的话,以数据库管理员身份给你这个用户授权:

    --userName是你要拿到调试存储过程权限的用户名
    GRANT DEBUG ANY PROCEDURE,DEBUG CONNECT SESSION TO username;

    (1).右键一个存储过程名称,点击测试,如下图:

    这里我用的pl/sql是12.0.4版本的,下面截图中与低版本的pl/sql按钮位置都相同,只是图标不一样。

     

    (2).点击两次step into按钮,进入语句调试,如下图:

     

    (3).每点击一次step into按钮,会想下执行一条语句,也可以查看变量和表达式的值,如下图:

     

    查看变量值:在查看变量区域,在Variable列输入变量i,在Value列点击下,该变量的值就显示出来了。

    4.案例实战

    场景和上面的案例实战是同一个,如下:

    有表student(s_no, s_name, s_age, s_grade),其中s_no-学号,也是主键,是从1开始向上排的(例如:第一个学生学号是1,第二个是2,一次类推);s_name-学生姓名;s_age-学生年龄;s_grade-年级;这张表的数据量有几千万甚至上亿。一个学年结束了,我要让这些学生全部升一年级,即,让s_grade字段加1。

    这条sql,写出来如下:

    update student set s_grade=s_grade+1

    编写存储过程:

    (1).存储过程1

    名称为:process_student1,student表的s_no字段类型为varchar2(16)。

    CREATE OR REPLACE PROCEDURE process_student1 AS
        CURSOR CUR_STUDENT IS SELECT s_no FROM student;
        TYPE REC_STUDENT IS VARRAY(100000) OF VARCHAR2(16);
        students REC_STUDENT;
    BEGIN
      OPEN CUR_STUDENT;
      WHILE (TRUE) LOOP
        FETCH CUR_STUDENT BULK COLLECT INTO students LIMIT 100000;
        FORALL i IN 1..students.count SAVE EXCEPTIONS
          UPDATE student SET s_grade=s_grade+1 WHERE s_no=students(i);
        COMMIT;
        EXIT WHEN CUR_STUDENT%NOTFOUND OR CUR_STUDENT%NOTFOUND IS NULL;
      END LOO;
      dbms_output.put_line('finished');
    END;

    说明:

            把student表中要更新的记录的学号拿出来放在游标CUR_STUDENT,每次从这个游标里抓取10万条数据赋值给数组students,每次更新这10万条记录。循环进行直到游标里的数据全部抓取完。

            FETCH .. BULK COLLECT INTO .. LIMIT rows语句中:这个rows我测试目前最大可以为10万条。

    (2).存储过程2(ROWID)

           如果我们这个student表没有主键,也没有索引呢,该怎么来做呢?

    分析下:

           ROWNUM是伪列,每次获取结果后,然后在结果集里会产生一列,从1开始排,每次都是从1开始排。

            ROWID在每个表中,每条记录的ROWID都是唯一的。在这种情况下,我们可以用ROWID。但要注意的是,ROWID是一个类型,注意它和VARCHAR2之间的转换。有两个方法:ROWIDTOCHAR()是把ROWID类型转换为CHAR类型;CHARTOROWID()是把CAHR类型转换为ROWID类型。

    接下来我们编写存储过程process_student2,脚本如下:

    CREATE OR REPLACE PROCEDURE process_student1 AS
        CURSOR CUR_STUDENT IS SELECT ROWIDTOCHAR(ROWID) FROM student;
        TYPE REC_STUDENT IS VARRAY(100000) OF VARCHAR2(16);
        students REC_STUDENT;
    BEGIN
      OPEN CUR_STUDENT;
      WHILE (TRUE) LOOP
        FETCH CUR_STUDENT BULK COLLECT INTO students LIMIT 100000;
        FORALL i IN 1..students.count SAVE EXCEPTIONS
          UPDATE student SET s_grade=s_grade+1 WHERE ROWID=CHARTOROWID(students(i));
        COMMIT;
        EXIT WHEN CUR_STUDENT%NOTFOUND OR CUR_STUDENT%NOTFOUND IS NULL;
      END LOO;
      dbms_output.put_line('finished');
    END;

    说明:

           我们首先查到记录的ROWID并把它转换为CHAR类型,存放到游标CUR_STUDENT里,

    再每次抓取10万条数据赋值给数组进行更新,更新语句的WHERE条件时,又把数组元素是CAHR类型的rowid串转换为ROWID类型。

    附.参考资料

    存储过程基础:

           https://www.yiibai.com/plsql/plsql_basic_syntax.html

    存储过程进阶之FORALL:

           https://blog.csdn.net/leshami/article/details/7536926

           https://blog.csdn.net/jie1336950707/article/details/49966753

    存储过程进阶之BUIL COLLECT:

           https://blog.csdn.net/leeboy_wang/article/details/7991021

           https://blog.csdn.net/leshami/article/details/7545597

    联合数组:

           https://blog.csdn.net/leshami/article/details/7372061

    展开全文
  • 第三版信息系统项目管理师47个过程的输入输出及工具

    一、项目整体管理

    过程名

    输入

    工具和技术

    输出

    1、制定项目章程

     

    1、项目工作说明书

    2、商业论证

    3、协议(合同,备忘录、意向及协议书)

    4、组织过程资产

    5、事业环境因素

    1、专家判断

    2、引导技术

     

    1、项目章程

     

    2、制定项目管理计划

     

    1、  项目章程

    2、  其他规划过程的输出

    3、  组织过程资产

    4、  事业环境因素

    1、 专家判断

    2、  引导技术

    1、项目管理计划

     

    3、指导与管理项目工作

    1、项目管理计划

    2、批准的变更请求

    3、组织过程资产

    4、事业环境因素

     

     

    1、  专家判断

    2、  项目管理信息系统(PMIS)

    3、  会议

    1、  可交付成果

    2、  工作绩效数据

    3、  变更请求

    4、  项目管理计划更新

    5、  项目文件更新

    4、监控项目工作

    1、  项目管理计划

    2、  进度预测

    3、  成本预测

    4、  确认的变更

    5、  工作绩效信息

    6、  组织过程资产

    7、  事业环境因素

     

    1、  分析技术

    2、  项目管理信息系统

    3、  会议

    4、  专家判断

     

    1、  变更请求

    2、  工作绩效报告

    3、  项目管理计划更新

    4、  项目文件更新

    5、实施整体变更控制

    1、  项目管理计划

    2、  工作绩效报告

    3、  变更请求

    4、  组织过程资产

    5、  事业环境因素

    1、  会议

    2、  变更控制工具

    3、  专家判断

    1、  批准的变更请求

    2、  变更日志

    3、  项目管理计划更新

    4、  项目文件更新

    结束项目或阶段

    1、  项目管理计划

    2、  验收的可交付成果

    3、  组织过程资产

    1、  分析技术

    2、  会议

    3、  专家判断

    1、  最终产品、服务或成果

    2、  组织过程资产更新

     

    二、项目范围管理

     

    过程名

    输入

    工具和技术

    输出

    1、编制范围管理计划(规划范围管理)

    1、  项目管理计划

    2、  项目章程

    3、  组织过程资产

    4、  事业环境因素

    1、  会议

    2、  专家判断

    1、范围管理计划

    2、需求管理计划

    2、收集需求

    1、  范围管理计划

    2、  需求管理计划

    3、  干系人管理计划

    4、  项目章程

    5、  干系人登记册

    1、  访谈

    2、  焦点小组

    3、  引导式研讨会

    4、  群体创新技术

    5、  群体决策技术

    6、  问卷调查

    7、  观察

    8、  原型法

    9、  标杆对照

    10、系统交付图

    11、文件分析

    1、需求文件

    2、需求跟踪矩阵

    3、定义范围

    1、  范围管理计划

    2、  项目章程

    3、  需求文件

    4、  组织过程资产

    1、  产品分析

    2、  专家判断

    3、  备选方案生成

    4、  引导式研讨会

    1、  项目范围说明书

    2、  项目文件更新

    4、创建工作分解结构(WBS)

    1、  范围管理计划

    2、  项目范围说明书

    3、  需求文件

    4、  事业环境因素

    5、  组织过程资产

    1、  分解

    2、  专家判断

    1、  范围基准

    2、  项目文件更新

    5、确认范围

    1、  项目管理计划

    2、  需求文件

    3、  需求跟踪矩阵

    4、  核实的可交付成果

    5、  工作绩效数据

    1、  检查

    2、  群体决策技术

    1、  验收的可交付成果

    2、  变更请求

    3、  工作绩效信息

    4、  项目文件更新

    6、范围控制

    1、  项目管理计划

    2、  需求文件

    3、  需求跟踪矩阵

    4、  工作绩效数据

    5、  组织过程资产

    1、偏差分析

    1、工作绩效信息

    2、变更请求

    3、项目文件更新

    4、项目管理计划更新

    5、组织过程资产更新

     

     

     

    三、项目时间管理

     

    过程名

    输入

    工具和技术

    输出

    1、规划进度管理

    1、 项目管理计划

    2、 项目章程

    3、 组织过程资产

    4、 事业环境因素

    1、 专家判断

    2、 分析技术

    3、 会议

    1、 项目进度管理计划

     

    2、定义活动

    1、 进度管理计划

    2、 范围基准

    3、 组织过程资产

    4、 事业环境因素

    1、 分解

    2、 滚动式规划

    3、 专家判断

    1、 活动清单

    2、 活动属性

    3、 里程碑清单

    3、排列活动顺序

    1、 进度管理计划

    2、 活动清单

    3、 活动属性

    4、 里程碑清单

    5、 事业环境因素

    6、 组织过程资产

    7、 项目范围说明书

    1、 前导图法

    2、 箭线图法

    3、 确定信赖关系

    4、 提前量与滞后量

    1、 项目进度网络图

    2、 项目文件更新

    4、估算活动资源

    1、 进度管理计划

    2、 活动清单

    3、 活动属性

    4、 资源日历

    5、 风险登记册

    6、 活动成本估算

    7、 事业环境因素

    8、 组织过程资产

    1、 专家判断

    2、 备选方案分析

    3、 发布的估算数据

    4、 项目管理软件

    5、 自下而上估算

    1、 活动资源需求

    2、 资源分解结构

    3、 项目文件更新

    5、估算活动持续时间

    1、 进度管理计划

    2、 活动清单

    3、 活动属性

    4、 活动资源需求

    5、 资源日历

    6、 项目范围说明书

    7、 风险登记册

    8、 资源分解结构

    9、 事业环境因素

    10、组织过程资产

    1、 专家判断

    2、 类比估算

    3、 参数估算

    4、 三点估算

    5、 群体决策技术

    6、 储备分析

    1、 活动持续时间估算

    2、 项目文件更新

    6、制定进度计划

    1、 进度管理计划

    2、 活动清单

    3、 活动属性

    4、 项目进度网络图

    5、 活动资源需求

    6、 资源日历

    7、 活动持续时间估算

    8、 项目范围说明书

    9、 风险登记册

    10、项目人员分配

    11、资源分解结构

    12、事业环境因素

    13、组织过程资产

    1、 进度网络分析法

    2、 关键路线法

    3、 关键链法

    4、 资源优化技术

    5、 建模技术

    6、 提前量和滞后量

    7、 进度压缩

    8、 进度计划编制工具

    1、 进度基准

    2、 项目进度计划

    3、 进度数据

    4、 项目日历

    5、 项目管理计划更新

    6、 项目文件更新

    7、控制进度

    1、 项目管理计划

    2、 项目进度计划

    3、 工作绩效数据

    4、 项目日历

    5、 进度数据

    6、 组织过程资产

    1、 绩效审查

    2、 项目管理软件

    3、 资源优化技术

    4、 建模技术

    5、 提前量和滞后量

    6、 进度压缩

    7、 进度计划编制工具

    1、 工作绩效信息

    2、 进度预测

    3、 变更请求

    4、 项目管理计划更新

    5、 项目文件更新

    6、 组织过程资产更新

     

     

     

    四、项目成本管理

     

    过程名

    输入

    工具和技术

    输出

    1、制定成本管理计划(规划成本)

    1、 项目管理计划

    2、 项目章程

    3、 事业环境因素

    4、 组织过程资产

    1、 专家判断

    2、 分析技术

    3、 会议

    1、成本管理计划

    2、成本估算

     

    1、 成本管理计划

    2、 人力资源管理计划

    3、 范围基准

    4、 项目进度计划

    5、 风险登记册

    6、 组织过程资产

    7、 事业环境因素

    1、 专家判断

    2、 类比估算

    3、 参数估算

    4、 自下而上估算

    5、 三点估算

    6、 储备分析

    7、 质量成本

    8、 项目管理软件

    9、 卖方投标分析

    10、群体决策技术

    1、 活动成本估算

    2、 估算依据

    3、 项目文件更新

     

    3、成本预算(制定预算)

    1、 成本管理计划

    2、 范围基准

    3、 活动成本估算

    4、 活动依据

    5、 项目进度计划

    6、 资源日历

    7、 风险登记册

    8、 协议

    9、 组织过程资产

    1、 成本汇总

    2、 储备分析

    3、 专家判断

    4、 资金限制平衡

    5、 参数模型

    1、成本基准

    2、项目资金需求

    3、项目文件更新

    4、成本控制

    1、 项目管理计划

    2、 项目资金需求

    3、 工作绩效数据

    4、 组织过程资产

    1、 挣值管理

    2、 预测

    3、 完工尚需绩效指数

    4、 绩效审查

    5、 项目管理软件(PM软件)

    6、 储备分析

    1、 工作绩效信息

    2、 成本预测

    3、 变更请求

    4、 项目文件更新

    5、 组织过程资产更新

    6、 项目管理计划更新

     

     

     

     

    五、项目质量管理

    过程名

    输入

    工具和技术

    输出

    1、规划质量管理

     

    1、 项目管理计划

    2、 干系人登记册

    3、 风险登记册

    4、 需求文件

    5、 事业环境因素

    6、 组织过程资产

    1、 成本效益分析

    2、 质量成本法

    3、 七种基本质量工具

    4、 标杆对照

    5、 实验设计

    6、 统计抽样

    7、 其他质量管理工具

    8、 会议

    1、 质量管理计划

    2、 过程改进计划

    3、 质量测量指标

    4、 质量核对单

    5、 项目文件更新

    2、实施质量保证

    1、 质量管理计划

    2、 过程改进计划

    3、 质量测量指标

    4、 质量控制测量结果

    5、 项目文件

    1、 质量审计

    2、 过程分析

    3、 质量管理与控制工具

    1、 变更请求

    2、 项目管理计划更新

    3、 项目文件更新

    4、 组织过程资产更新

    3、质量控制(控制质量)

    1、 项目管理计划

    2、 质量测量指标

    3、 质量核对单

    4、 单工作绩效数据

    5、 批准的变更请求

    6、 可交付成果

    7、 项目文件

    8、 组织过程资产

    1、 七种基本质量工具

    2、 统计抽样

    3、 检查

    4、 审查已批准的变更请求

    1、 质量控制测量结果

    2、 确认的变更

    3、 核实的可交付成果

    4、 工作绩效信息

    5、 变更请求

    6、 项目文件更新

    7、 项目管理计划更新

    8、 组织过程资产更新

     

     

     

    六、项目人力资源管理

     

    过程名称

    输入

    工具和技术

    输出

    1、编写人力资源计划(规划人力资源管理)

    1、 项目管理计划

    2、 活动资源需求

    3、 事业环境因素

    4、 组织过程资产

    1、 组织结构图和职位描述

    2、 人际交住

    3、 组织理论

    4、 专家判断

    5、 会议

    1、人力资源管理计划

    2、组建项目团队

    1、 人力资源管理计划

    2、 事业环境因素

    3、 组织过程资产

    1、 事先分派

    2、 谈判

    3、 招募

    4、 虚拟团队

    5、 多维决策分析

    1、 项目人员分配表

    2、 资源日历

    3、 项目管理计划更新

    3、建设项目团队

    1、 人力资源计划

    2、 项目人员分配表

    3、 资源日历

    1、 人际关系技能

    2、 培训

    3、 团队建设活动

    4、 基本规则

    5、 集中办公

    6、 认可与奖励

    7、 人事测评工具

    1、 团队绩效评估

    2、 事业环境因素更新

    4、管理项目团队

    1、 人力资源管理计划

    2、 项目人员分配表

    3、 团队绩效评估

    4、 问题日志

    5、 绩效报告

    6、 组织过程资产

    1、 观察和交谈

    2、 项目绩效评估

    3、 冲突管理

    4、 人际关系技能

    1、 变更请求

    2、 项目管理计划更新

    3、 项目文件更新

    4、 事业环境因素更新

    5、 组织过程资产更新

     

     

     

    七、项目沟通管理

     

    过程名称

    输入

    工具和技术

    输出

    1、制订沟通管理计划(规划沟通管理)

    1、 项目管理计划

    2、 干系人登记册

    3、 事业环境因素

    4、 组织过程资产

    1、 分析沟通需求

    2、 信息传递方法的选择

    1、 项目沟通管理计划

    2、 其他文档的更新

    2、管理沟通

     

    1、 项目沟通管理计划

    2、 工作绩效报告

    3、 组织过程资产

    4、 事业环境因素

    1、 沟通渠道的选择

    2、 信息传递方式的选择

    3、 信息管理系统

    4、 绩效报告

    1、 项目沟通

    2、 项目管理计划更新

    3、 其他项目计划更新

    4、 组织过程资产更新

    3、控制沟通

    1、 项目管理计划

    2、 项目沟通

    3、 问题日志

    4、 工作绩效数据

    5、 组织过程资产

    1、 信息管理系统

    2、 专家判断

    3、 会议

     

    1、 工作绩效信息

    2、 变更请求

    3、 项目管理计划更新

    4、 其他项目计划更新

    5、 组织过程资产更新

     

     

     

    八、项目采购管理

     

    过程名称

    输入

    工具和技术

    输出

    1、编制采购计划(规划采购)

    1、 项目管理计划

    2、 需求文档

    3、 风险登记册

    4、 活动资源要求

    5、 项目进度

    6、 活动成本估算

    7、 干系人登记册

    8、 事业环境因素

    9、 组织过程资产

    1、 自制外购分析

    2、 专家判断

    3、 市场调研

    4、 会议

    1、 采购管理计划

    2、 采购工作说明书

    3、 采购文件

    4、 供方选择标准

    5、 自制外购决策

    6、 变更申请

    7、 项目文件更新

    2、实施采购

    1、 采购管理计划

    2、 采购文件

    3、 供方选择标准

    4、 卖方建议书

    5、 项目文件

    6、 自制外购决策

    7、 采购工作说明书

    8、 组织过程资产

    1、 投标人会议

    2、 建议书评价技术

    3、 独立估算

    4、 专家判断

    5、 刊登广告

    6、 分析技术

    7、 采购谈判

    1、 选择的卖方

    2、 合同

    3、 资源日历

    4、 变更请求

    5、 项目管理计划更新

    6、 项目文件更新

    3、控制采购

    1、 项目管理计划

    2、 采购文件

    3、 合同

    4、 批准的变更请求

    5、 工作绩效报告

    6、 工作绩效数据

    1、 合同变更控制系统

    2、 检查与审计

    3、 采购绩效审查

    4、 报告绩效

    5、 支付系统

    6、 索赔管理

    7、 记录管理系统

    1、 工作绩效信息

    2、 变更请求

    3、 项目管理计划更新

    4、 项目文件更新

    5、 组织过程资产更新

    4、结束采购

    1、 合同

    2、 合同收尾程序

    3、 项目管理计划

    4、 采购文件

    1、 采购审计

    2、 采购谈判

    3、 记录管理系统

    1、 合同收尾

    2、 组织过程资产更新

     

     

    九、项目风险管理

     

    过程名称

    输入

    工具和技术

    输出

    1、规划风险管理

    1、 项目管理计划

    2、 项目章程

    3、 干系人登记册

    4、 事业环境因素

    5、 组织过程资产

    1、 分析技术

    2、 专家判断

    3、 会议

    1、风险管理计划

    2、识别风险

    1、 风险管理计划

    2、 成本管理计划

    3、 进度管理计划

    4、 质量管理计划

    5、 人力资源管理计划

    6、 范围基准

    7、 活动成本估算

    8、 活动持续时间估算

    9、 干系人登记册

    10、项目文件

    11、采购文件

    12、事业环境因素

    13、组织过程资产

    1、 文档审查

    2、 信息收集技术

    3、 核对单分析

    4、 假设分析

    5、 图解分析

    6、 SWOT分析

    7、 专家判断

     

    1、 风险登记册

    3、实施定性风险分析

    1、 风险管理计划

    2、 范围基准

    3、 风险登记册

    4、 事业环境因素

    5、 组织过程资产

    1、 风险概率和影响评价

    2、 概率和影响矩阵

    3、 风险数据质量评估

    4、 风险种类

    5、 风险紧急度评估

    6、 专家判断

    1、 风险登记册更新

    2、 假设条件日志更新

    4、实施定量风险分析

    1、 风险管理计划

    2、 成本管理计划

    3、 进度管理计划

    4、 风险登记册

    5、 事业环境因素

    6、 组织过程资产

    1、 数据收集和表示技术

    2、 定量分析和建模技术

    3、 专家判断

    1、项目的概率分布

    2、实现成本和实现目

    标的概率

    3、量化风险优先级清单

    4、定量风险结果的趋势

    5、规划风险应对

    1、 风险管理计划

    2、 风险登记册

    1、 消极风险或威胁的应对策略

    2、 积极风险或机会的应对策略

    3、 应急响应策略

    4、 专家判断

    1、项目管理计划更新

    2、项目文件更新

    6、控制风险

    1、 项目管理计划

    2、 风险登记册

    3、 工作绩效数据

    4、 工作绩效报告

    1、 风险再评估

    2、 风险审计

    3、 偏差和趋势分析

    4、 技术绩效测量

    5、 储备分析。6、会议

    1、 工作绩效信息

    2、 变更请求

    3、 项目管理计划更新

    4、 项目文件更新

    5、 组织过程资产更新

    十、项目干系人管理

    过程名称

    输入

    工具和技术

    输出

    1、识别干系人

     

    1、 项目章程

    2、 采购文件

    3、 事业环境因素

    4、 组织过程资产

    1、 会议

    2、 专家判断

    3、 干系人分析

    1、干系人登记册

    2、编制干系人管理计划(规划干系人)

    1、 项目管理计划

    2、 干系人登记册

    3、 事业环境因素

    4、 组织过程资产

    1、 会议

    2、 专家判断

    3、 分析技术

    1、 干系人管理计划

    2、 项目文件更新

    3、管理干系人参与(管理干系人)

    1、 干系人管理计划

    2、 沟通管理计划

    3、 变更日志

    4、 组织过程资产

    1、 沟通方法

    2、 人际关系技能

    3、 管理技能

    1、 问题日志

    2、 请求变更

    3、 项目管理计划更新

    4、 项目文件更新

    5、 组织过程资产更新

    4、控制干系人参与

    1、 项目管理计划

    2、 问题日志

    3、 工作绩效数据

    4、 项目文件

    1、 信息管理系统

    2、 专家判断

    3、 会议

    1、 工作绩效信息

    2、 纠正措施

    3、 变更请求

    4、 项目管理计划更新

    5、 组织过程资产更新

    6、 项目文件更新

     

    展开全文
  • 动画:用动画给面试官解释 TCP 三次握手过程

    万次阅读 多人点赞 2019-10-12 07:55:38
    TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单...

    在这里插入图片描述
    作者 | 小鹿
    来源 | 公众号:小鹿动画学编程


    写在前边

    TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。

    对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人,这样将复杂的知识简单化,理解起来也容易了很多,尤其对于一个初学者来说。


    学习导图

    在这里插入图片描述

    一、TCP 是什么?

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    我们知道了上述了解到了 TCP 的定义,通俗一点的讲,TCP 就是一个双方通信的一个规范标准(协议)。

    我们在学习 TCP 握手过程之前,首先必须了解 TCP 报文头部的一些标志信息,因为在 TCP 握手的过程中,会使用到这些报文信息,如果没有掌握这些信息,在学习握手过程中,整个人处于懵逼状态,也是为了能够深入 TCP 三次握手的原理。


    二、TCP 头部报文

    在这里插入图片描述

    2.1 source portdestination port

    两者分别为「源端口号」和「目的端口号」。源端口号就是指本地端口,目的端口就是远程端口。

    一个数据包(pocket)被解封装成数据段(segment)后就会涉及到连接上层协议的端口问题。

    可以这么理解,我们可以想象发送方很多的窗户,接收方也有很多的窗户,这些窗口都标有不同的端口号,源端口号和目的端口号就分别代表从哪个规定的串口发送到对方接收的窗口。不同的应用程度都有着不同的端口,之前网络分层的文章中有提到过。
    在这里插入图片描述

    扩展:应用程序的端口号和应用程序所在主机的 IP 地址统称为 socket(套接字),IP:端口号, 在互联网上 socket 唯一标识每一个应用程序,源端口+源IP+目的端口+目的IP称为”套接字对“,一对套接字就是一个连接,一个客户端与服务器之间的连接。


    2.2 Sequence Numbe

    称为「序列号」。用于 TCP 通信过程中某一传输方向上字节流的每个字节的编号,为了确保数据通信的有序性,避免网络中乱序的问题。接收端根据这个编号进行确认,保证分割的数据段在原始数据包的位置。

    在这里插入图片描述
    再通俗一点的讲,每个字段在传送中用序列号来标记自己位置的,而这个字段就是用来完成双方传输中确保字段原始位置是按照传输顺序的。(发送方是数据是怎样一个顺序,到了接受方也要确保是这个顺序)

    PS:初始序列号由自己定,而后绪的序列号由对端的 ACK 决定:SN_x = ACK_y (x 的序列号 = y 发给 x 的 ACK),这里后边会讲到。


    2.3 Acknowledgment Numbe

    称为「确认序列号」。确认序列号是接收确认端所期望收到的下一序列号。确认序号应当是上次已成功收到数据字节序号加1,只有当标志位中的 ACK 标志为 1 时该确认序列号的字段才有效。主要用来解决不丢包的问题。

    若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

    在这里,现在我们只需知道它的作用是什么,就是在数据传输的时候是一段一段的,都是由序列号进行标识的,所以说,接收端每接收一段,之后就想要的下一段的序列号就称为「确认序列号」。


    2.4 TCP Flag

    TCP 首部中有 6 个标志比特,它们中的多个可同时被设置为 1,主要是用于操控 TCP 的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN

    不要求初学者全部掌握,在这里只讲三个重点的标志:


    2.4.1 ACK

    这个标识可以理解为发送端发送数据到接收端,发送的时候 ACK 为 0,标识接收端还未应答,一旦接收端接收数据之后,就将 ACK 置为 1,发送端接收到之后,就知道了接收端已经接收了数据。
    在这里插入图片描述

    此标志表示「应答域有效」,就是说前面所说的TCP应答号将会包含在 TCP 数据包中;有两个取值:0 和 1,为 1 的时候表示应答域有效,反之为 0;


    2.4.2 SYN

    表示「同步序列号」,是 TCP 握手的发送的第一个数据包。

    用来建立 TCP 的连接。SYN 标志位和 ACK 标志位搭配使用,当连接请求的时候,SYN=1,ACK=0连接被响应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有 SYN 的数据包,如果对方主机响应了一个数据包回来 ,就表明这台主机存在这个端口。看下面动画:
    在这里插入图片描述

    2.4.3 FIN

    表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的 TCP 数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。

    这个很好理解,就是说,发送端只剩最后的一段数据了,同时要告诉接收端后边没有数据可以接受了,所以用FIN标识一下,接收端看到这个FIN之后,哦!这是接受的最后的数据,接受完就关闭了。动画如下:
    在这里插入图片描述

    2.5 Window size

    称为滑动窗口大小。所说的滑动窗口,用来进行流量控制。


    3、为什么进行 TCP 三次握手?

    如果之前你不了解网络分层的话,建议看看写的文章。

    你真的懂网络分层协议吗?

    第一,为了确认双方的接收与发送能力是否正常。第二,指定自己的初始化序列号,为后面的可靠传送做准备。第三,如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

    如果你了解 UDP 的话,TCP 的出现正式弥补了 UDP 不可靠传输的缺点。但是 TCP 的诞生,也必然增加了连接的复杂性。


    4、TCP 三次握手过程?

    TCP 三次握手的过程掌握最重要的两点就是客户端和服务端状态的变化,另一个是三次握手过程标志信息的变化,那么掌握 TCP 的三次握手就简单多了。下面我们就以动画形式进行拆解三次握手过程。
    在这里插入图片描述

    • 初始状态:客户端处于 closed(关闭)状态,服务器处于 listen(监听) 状态。
      在这里插入图片描述
    • 第一次握手:客户端发送请求报文将 SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。

    在这里插入图片描述

    • 第二次握手:服务端受到 SYN 请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号 seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1 以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。

    在这里插入图片描述

    • 第三次握手: 客户端接收到服务端的 SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号 ack = y + 1和数据包的序列号 seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。

    在这里插入图片描述

    5、为什么不是一次、二次握手?

    防止了服务器端的一直等待而浪费资源。

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。如果此时客户端发送的延迟的握手信息服务器收到,然后服务器进行响应,认为客户端要和它建立连接,此时客户端并没有这个意思,但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。


    ----------------------------------------------------------------------- 于2019/11/11 修改 ------------------------------------------------------------------
    主要对文章中存在的笔误和错误进行了修改,动画也进行了重新制作和修改,文章内容也进行的部分内容增加 —— 三次握手过程详细细节部分。再次感谢大家对小鹿文章的支持!

    下一篇:动画:用动画给女朋友讲解 TCP 四次分手过程


    福利:可以在我的公众号『小鹿动画学编程』,后台回复『资源』即可获取。

    ❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

    一些后台小伙伴问我平常如何学习的,学习资料哪里获取,我就不一一回复了!一般我都是通过看一些编程书籍和开源的社区进行自学,一些学习资料和电子书也分享到下边了,有需要的自取。

    编程在于永无止境的去学习,去学习前辈积累的经验,书籍就是最好的一种媒介方式,列出以下自己看过的优秀书籍,整理成了 PDF 版。

    • 前端:《javascript高级程序设计》《JavaScript 权威指南》《你不知道的JavaScript(上中下卷)》等;
    • java:《Effective Java》《Thinking in Java》《Java 编程思想》《java核心技术》等;
    • 算法:《大话数据结构》《算法图解》《算法导论》《编程之美》《数据结构与算法:C语言描述》等;
    • 其他相关计算机书籍;

    搜索我的公众号:「小鹿动画学编程」后台回复关键词

    • 回复「后台」,获取 java 等自学资料
    • 回复「前端」,获取前端等自学资料
    • 回复「电子书」获取一下书籍资料!

    动一动你的小手,点赞就完事了,每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=


    作者Info:

    【作者】:小鹿

    【原创公众号】:小鹿动画学编程。

    【简介】:和小鹿同学一起用动画的方式从零基础学编程,将 Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。先定个小目标,原创 1000 篇的动画技术文章,和各位小伙伴共同努力一起学习!公众号回复 “资料” 送一从零自学资料大礼包!

    【转载说明】:转载请说明出处,谢谢合作!~

    展开全文
  • AES加密过程详解

    万次阅读 多人点赞 2018-07-03 16:55:58
    AES加密过程涉及到4种操作,分别是字节替代、行移位、列混淆和轮密钥加。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。...
  • Mysql 存储过程简介--实现存储过程

    万次阅读 多人点赞 2019-01-23 13:35:44
    什么是存储引擎: Mysql中的数据用各种不同的技术存储在文件(或者内存)中, 每一种技术都使用不同的存储机制, 索引技巧 锁定水平并且最 终提供广泛的不同的功能和能力。通过选择不同的额技术你能过够获得额外 ...
  • 动画:用动画给女朋友讲解 TCP 四次分手过程

    万次阅读 多人点赞 2019-10-21 07:57:56
    作者 | 小鹿 来源 | 公众号:小鹿动画学编程 ...很多读者留言说什么时候用动画讲一讲 TCP 四次挥手的过程,为了应大家的要求,今天我们就生动有趣的用动画给大家分享 TCP 四次挥手(分手)过程。 动画:用动画给...
  • MySQL数据库存储过程讲解与实例

    万次阅读 多人点赞 2018-06-03 00:48:17
    存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用...
  • SQL存储过程使用介绍

    万次阅读 多人点赞 2017-04-25 13:54:13
    在数据库编程过程中经常会用到存储过程 , 相比 SQL 语句 , 存储过程更方便 , 快速 , 安全 ; 先将存储过程的相关介绍和使用方法总结如下 ;1. 存储过程的概念存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组...
  • Oracle存储过程及举例(几种参数情况的存储过程

    万次阅读 多人点赞 2017-05-06 22:22:50
    Oracle存储过程及举例(几种参数情况的存储过程
  • 图解数据在网络中的传输过程

    万次阅读 多人点赞 2020-10-30 10:50:31
    数据在网络中的传输过程 在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的,这是本文探究的重点。 下图是本文中使用的网络拓扑图,数据从客户端发送给服务器端。 客户端各层对数据的封装 java...
  • 矩阵卷积运算的具体过程,很简单

    万次阅读 多人点赞 2019-04-24 18:45:14
    最近在看图像处理,卷积运算这一块也查了很多,但是感觉都写的太复杂,我这里简单的写一下卷积到底是一个什么计算过程。 假设有一个卷积核h,就一般为3*3的矩阵: 有一个待处理矩阵x: h*x的计算过程分为三步...
  • mysql 在存储过程中输出日志信息

    万次阅读 2018-04-02 17:17:05
    mysql 在存储过程中输出日志信息 更多原创性能测试文章关注 十年性能测试专家&7DGroup公众号 直接用select 打印输出 SELECT 'Comment'; 用concat连接变量输出 declare myvar INT default 0; SET myvar...
  • MYSQL存储过程调试过程

    万次阅读 2018-07-14 11:57:00
    mysql不像oracle有plsqldevelper工具用来调试存储过程,所以有几种简单的方式追踪执行过程:1、用一张临时表,记录调试过程;2、直接在存储过程中,增加select xxx,在控制台查看结果:3、把存储过程的sql复制到...
  • 随机过程之平稳过程与各态历经过程

    千次阅读 多人点赞 2018-12-28 16:44:55
    1.平稳过程 平稳随机过程是一类重要的随机过程,在很多工程领域中,有很多随机过程是平稳的或近似平稳的。平稳随机过程的分析要比一般随机过程简单,因此,对它的分许是重要的和必要的。如果随机过程的统计特性并不...
  • 【总结】访问一个网页的全过程

    万次阅读 多人点赞 2017-12-08 18:03:35
    整个过程发生了什么?其中的原理是什么?以下进行整理和总结。 整个过程可以概括为几下几个部分: 域名解析成IP地址; 与目的主机进行TCP连接(三次握手);发送与收取数据(浏览器与目的主机开始HTTP访问过程);...
  • 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 项目整体管理 1、制定项目章程 2、制定项目管理计划 3、指导与管理项目工作 4、监控项目工作5、实施整体变更控制 6、结束项目或阶段 项目...
  • 存储过程调用存储过程

    千次阅读 2018-03-12 23:58:24
    存储过程引用存储过程在存储过程B中,调用存储过程A。当存储过程A中RETURN时,跳出A过程。但是在B过程引用处继续往下执行。CREATE OR REPLACE PROCEDURE A AS BEGIN dbms_output.put_line('调用'); return; dbms...
  • 前后端分离标准化应用的开发过程管理 背景 最近一段时间系统维护过程中暴露出很多问题,甚至是事故。集中复盘之后,认为是当前的开发过程过于“自由”,开发人员甚至可以本地编译后直接拷贝到生产服务器投产。 基于...
  • hawkes过程

    千次阅读 2019-08-29 21:12:27
    最近由于项目需要,需要了解下hawkes过程相关理论,可是在百度或者其他搜索引擎上却搜索不到相关内容,倒是搜出来不少有关文章,可是大都是基于hawkes理论的应用。于是下面是我对hawkes过程的介绍: 不同于非时齐...
  • mysql存储过程学习笔记

    万次阅读 多人点赞 2019-02-22 17:09:36
    本文主要记录了本人学习mysql存储过程时的笔记,文档中用到的表结构在文档结尾处有说明。 一、定义  存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,...
  • 基于项目实例解析ng启动加载过程前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理。回过头来总结一下angular的启动过程。 下面以实际项目为例进行简要讲解。1.载入ng库2.等待,直到DOM树构造完毕。3....
  • HTTP请求的完全过程

    万次阅读 多人点赞 2019-05-27 11:22:45
    DNS查找过程如下: 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束...
  • Mysql修改存储过程相关权限问题

    万次阅读 2020-09-21 21:44:14
    在使用mysql数据库经常都会遇到这么一个问题,其它用户定义的存储过程,现在使用另一个用户却无法修改或者删除等;正常情况下存储过程的定义者对它有修改、删除的权限;但是其它的用户就要相于的授权,不然无法查看...
  • 平稳过程

    千次阅读 2019-01-04 01:20:12
    设是一个随机过程: n维随机变量与有相同的n维联合分布函数。 则称随机过程为严平稳过程。 宽平稳定义: 如果随机过程是二阶矩过程,即,且满足: 1、E[X(t)]=m 2、R(s,t)=E[X(s)X(t)]=R(t-s) 定理1: 严...
  • 软件过程

    千次阅读 2018-06-18 20:51:08
    软件过程也称为软件生存周期过程,是指软件生存周期中的一系列相关过程。 为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。 2、软件过程的七大元素 活动:开发、维护、管理等;...
  • JVM类加载过程

    万次阅读 多人点赞 2019-06-20 15:10:25
    1. JVM类加载过程 1.概述 从类的生命周期而言,一个类包括如下阶段: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下...
  • 数据预处理过程

    万次阅读 2018-12-27 16:50:05
    数据预处理过程会占用很多时间,虽然麻烦但也是必不可少且非常重要的一步。在数据能用于计算的前提下,我们希望数据预处理过程能够提升分析结果的准确性、缩短计算过程,这是数据预处理的目的。本文只说明这些预处理...
  • 存储过程授权给子用户

    万次阅读 2020-06-06 00:06:03
    --存储过程案例(清空表数据) --存储过程案例(清空表数据) CREATE OR REPLACE PACKAGE USER_A.PKG_TRA_TAB_OPERATION IS PROCEDURE P_TAB_TRUNCATE_A; -- 方法一 PROCEDURE P_TAB_TRUNCATE_B; -- 方法二 END ...
  • MySQL存储过程模板

    万次阅读 2017-12-24 22:22:51
    MySQL存储过程的范例模板,带返回值和异常处理的功能。 DROP PROCEDURE IF EXISTS sp_sample; CREATE PROCEDURE sp_sample(OUT errno INT) root:BEGIN /* 功能: IN参数: OUT参数: errno 存储过程异常标志...

空空如也

1 2 3 4 5 ... 20
收藏数 2,081,258
精华内容 832,503
关键字:

过程