存储过程
理解
孙老师竟然说它是一个类似于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; 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;
|