存储过程

理解

孙老师竟然说它是一个类似于c++的类。满足事务性,比函数更高效。

语法

其中参数的IN,OUT,INOUT,分别代表输入参数,输出参数,输入后可输出参数。

  • IN 实参传给形数,只读不写
  • OUT 形参给实参,可读可写
  • INOUT 用膝盖想想
  • defualt 默认是IN
  • 命名以“sp+内容”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE [OR REPLACE] PROCEDURE procedure_name
    [(parameter[{IN|OUT|IN OUT}]) date_type,……]
    RETURN return_type;
    {IS|AS}
    declaration section
    BEGIN
    Executable statements
    EXCEPTION
    Exception handlers;
    END ;

样例

我现在有这么一张表,来创造一个存储过程。
样例

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE PROCEDURE InsertCourse
(course_name in varchar , course_id in number)
IS
BEGIN
INSERT INTO course
VALUES(course_name,course_id);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('重复编号');
WHEN OTHERS THEN
dbms_output.put_line('发生其他错误');
END InsertCourse;
/

调用

1
2
3
4
5
EXECUTE InsertCourse('日语',6);
BEGIN
InsertCourse('扶他奶茶',7);
END;

有输出参数

函数

语法

1
2
3
4
5
6
7
8
9
10
CREATE [OR REPLACE] FUNCTION function_name
[(parameter[{IN|OUT|IN OUT}]) date_type,……]
RETURN return_type;
{IS|AS}
declaration section
BEGIN
Executable statements
EXCEPTION
Exception handlers;
END [function_name];

样例

写一个求阶乘的函数

1
2
3
4
5
6
7
8
9
10
create or replace function Fac(n in number)
return number
as
res number:=1;
begin
for i in 1..n loop res:=res*i;
end loop;
return res;
end Fac;
/

调用

样例

理解

PL/SQL语言是数据库语言,这里的“包”类似与面向对象语言java中的包,是一组相关的过程、函数、变量、常量和游标等元素组合。这本来是一个比较复杂的内容,结果孙老师简单讲了讲就不说了,估计也就是了解的水平,那我也懒得说。不过要提醒读者一下,包还有私有成员、实例化、重载、管理程序包和执行权限等精彩内容,大家慢慢探索。

包头

只申明,无具体内容

1
2
3
4
5
CREATE OR REPLACE PACKAGE course_pkg
IS
PROCEDURE InsertCourse(course_name in varchar,course_id in number);
FUNCTION Fac(n in number) return number;
END course_pkg;

包体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE PACKAGE BODY course_pkg
IS
PROCEDURE InsertCourse(course_name in varchar,course_id in number)
IS
BEGIN
INSERT INTO course
VALUES(course_name,course_id);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('重复编号');
WHEN OTHERS THEN
dbms_output.put_line('发生其他错误');
END InsertCourse;
----------------
function Fac(n in number) return number
as
res number:=1;
begin
for i in 1..n loop res:=res*i;
end loop;
return res;
END Fac;
END course_pkg;
/

调用

1
2
3
4
5
6
7
8
set serveroutput on
declare
begin
course_pkg.InsertCourse('哲学',10);
dbms_output.put_line('5! answer is'||course_pkg.Fac(5));
END;
/
select * from course;

结果