一、什么是存储过程
存储过程: 百度百科上是这样解释的,存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。
简单的说就是专门干一件事一段sql语句。
可以由数据库自己去调用,也可以由java程序去调用。
在oracle数据库中存储过程是procedure。
二、为什么要写存储过程
1.效率高
存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本 上),都要先分析编译才会执行。所以想对而言存储过程效率更高。
2.降低网络流量
存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。
3.复用性高
存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。
4.可维护性高
当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。
5.安全性高
完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。
三、存储过程结构
(1)基本结构
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常(可写可不写,要增强脚本的容错性和调试的方便性那就写上异常处理)
(2)无参存储过程
/**
name_procedure就是自己自定义的存储过程名
*/
create or replace procedure name_procedure AS/IS
变量名1 数据类型;
变量名2 数据类型;
BEGIN
--要处理的业务逻辑
EXCEPTION --存储过程异常
END name_procedure;
(3).有参存储过程
普通参数存储过程
/*
age 类型为number 初始化为20;
*/
CREATE OR REPLACE PROCEDURE name_procedure (param1 TYPE)
AS/IS
name varchar(20);
age number :=20;
BEGIN
--业务处理.....
END ;
带参数的存储过程并且进行赋值
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行:做异常处理
存储过程语法
(1)运算符
(2)SELECT INTO STATEMENT语句
将查询结果赋值给一个变量或多个变量
- 需求
- 查出成绩为100分的那个学生的姓名,年龄,籍贯
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
(3)选择语句
//if 后面一定要添加THEN 相当于Java中的 大括号
IF s_sex=1 THEN
dbms_output.put_line('这个学生是男生');
ELSE IF 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循环
//a 1 到 20 范围
FOR a in 10 .. 20 LOOP
dbms_output.put_line('value of a: ' || a);
END LOOP;
Oracle存储过程 转载于 https://blog.csdn.net/weixin_41968788/article/details/83659164