Oracle数据库基础--存储过程和函数 一、存储过程和函数 二.首先看一下SQL基础  三、游标(cursor)  四、存储过程(procedure) 五、函数(function) 六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

  存储过程: 对一个模块的封装
  函数: 功能与存储过程几乎一样

  区别:
    函数必须通过return 关键字返回一个值
  存储过程:
    不需要return返回值

  参数:
    输入型参数
    输出型参数
    输入(输出)型参数

  什么时候用存储过程, 什么时候用函数
    一般来讲, 当只有一个返回值的时候用函数,
    当没有返回值或者需要多个返回值的时候, 用存储过程

二.首先看一下SQL基础

先看要举例的表的内容:

Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

下面开始操作:

首先建一个新的SQL Window:

DECLARE
  --声明变量
  /*
    引用型变量--当前用户下表中的某一列
    记录型变量--当前用户下表中的某一行
  */

  I NUMBER;
  A STUDENT.SNAME%TYPE; --引用型变量,指student表中的sname列
  B STUDENT%ROWTYPE; --记录型变量,当前用户下表中的某一行,根据附加条件选出是哪一行

BEGIN
  --开始

  I := 107;
  SELECT S.SNAME INTO A FROM STUDENT S WHERE S.SNO = I;
  DBMS_OUTPUT.PUT_LINE('查询结果,a的值为:' || A); --SOL中字符串的拼接用 ||

  SELECT * INTO B FROM STUDENT S WHERE S.SNO = I;
  DBMS_OUTPUT.PUT_LINE('查询结果,b的值为:' || B.SNAME); --通过b.~的形式把b中的某一列取出来

END; --结尾

Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

 三、游标(cursor)

学会使用游标遍历student表中的学生姓名

--游标(可以看作集合,里面装的是一个个记录型变量),有四个属性,

/*
ISOPEN --游标是否打开
NOTFOUND --bolean值,返回true 或者 false
FOUND --bolean值,返回true 或者 false
ROWCOUNT --已经取出的记录的行数,相当于改变几行就输出几
*/

DECLARE
  STU STUDENT%ROWTYPE;

  CURSOR STUS IS
    SELECT * FROM STUDENT;

BEGIN

  OPEN STUS;
  
  LOOP
    FETCH STUS
      INTO STU;
    EXIT WHEN STUS%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(STU.SNAME);
  END LOOP;
  
  CLOSE STUS;
  
END;

Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)


 四、存储过程(procedure)

输入student表中的班级号,输出学生姓名

第一步:新建SQL Window,编译一段SQL语句,把编译好的语句放到了procedures文件目录下(这是一个查询的存储过程)

CREATE OR REPLACE PROCEDURE HANQI(SCLA IN NUMBER) AS
  CURSOR STUS IS
    SELECT * FROM STUDENT S WHERE S.CLASS = SCLA;
  STU STUDENT%ROWTYPE;

BEGIN

  OPEN STUS;

  LOOP
    FETCH STUS
      INTO STU;
    EXIT WHEN STUS%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(STU.SNAME);
  END LOOP;

  CLOSE STUS;

END;

第二步、重新建立一个Test Window,调用一下存储过程

-- Created on 2017/8/18 by ASUS 
declare 
  -- Local variables here
  i integer;
begin
  -- Test statements here
  hanqi(95031);--在Test窗口中,直接调用就可以了
end;


输出信息为:
Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

第三、看一下命令窗口 Command Window,也可以调用存储过程

Connected to Oracle Database 11g Express Edition Release 11.2.0.2.0 
Connected as test@XE

SQL> select * from student;
SNO SNAME  SSEX SBIRTHDAY        CLASS
--- ------ ---- ----------- ----------
108 曾华   男   1977/9/1         95033
105 匡明   男   1975/10/2        95031
107 王丽   女   1976/1/23        95033
101 李军   男   1976/2/20        95033
109 王芳   男   1975/2/10        95031
103 陆君   男   1974/6/3         95031
6 rows selected

SQL> set serveroutput on;
SQL> execute hanqi(95031);
匡明
王芳
陆君
PL/SQL procedure successfully completed

五、函数(function)

函数的构造方法和存储过程类似

CREATE OR REPLACE FUNCTION CAL_ADD(A IN NUMBER, B IN NUMBER) RETURN NUMBER AS
  C NUMBER;
BEGIN
  C := A + B;
  RETURN C;
END;

直接调用函数:

Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

新建Sql Window:

CREATE OR REPLACE PROCEDURE HANQI3(SCLA IN NUMBER, VARI OUT NUMBER) AS

BEGIN
  UPDATE STUDENT S SET S.SSEX = '' WHERE S.CLASS = SCLA;
  SELECT COUNT(*) INTO VARI FROM STUDENT S WHERE S.CLASS = SCLA;
END;

新建Test Window:

-- Created on 2017/8/18 by ASUS 
DECLARE
  -- Local variables here
  I INTEGER;
BEGIN
  -- Test statements here
  HANQI3(95031, I);
  DBMS_OUTPUT.PUT_LINE('被修改的记录条数:' || I);--有输出型参数的得在Text Window下调用,并打印
END;

执行结果为:
Oracle数据库基础--存储过程和函数
一、存储过程和函数
二.首先看一下SQL基础
 三、游标(cursor)
 四、存储过程(procedure)
五、函数(function)
六、输出型参数(可以用来当作一个存储过程的返回值,可以是一个,也可以是多个)

可以通过输出型参数,让存储过程有返回值