oracle存储过程
公司属于外包公司,公司所用的是oracle数据库,所以,避免不了操作oracle数据库,而且动不动就是调用存储过程,但是发现一个问题,对于存储过程的学习还是有相对有限的系统性的学习资料。都是一些零碎的学习资料,东一榔头西一棒槌。所以本人在这里就给大家操作一波存储过程,从基础语法到java程序调用存储过程。这几篇文章只是学习的起步,但又是学习存储过程至关重要的一个环节,相信你看完这篇文章可以说是对存储过程已经学习了三分之一了。因为存储过程没有太多复杂的语法,作为plsql语言,我认为学习他可以参考一们语言来比对学习可以达到事半功倍的效果。废话不多说了,开始学习之旅吧。
学前准备工具
- plsql开发工具
- oracle客户端
- oracle服务器
关于安装oracle教程这里就不再一一细说了,我的服务端是安装在本机虚拟机上的windosxp上的。因为我尝试了不下于五次来安装到linux。所以就放弃了linux的安装,这个无关紧要。
基础语法部分:
首先打开plsql工具,点击File---->new --->Test window
-- Created on 2018/9/12 by LENOVO
declare
-- Local variables here
i integer;
begin
-- Test statements here
end;
上边就是一个plsql能够执行的基本架构(并不是存储过程),其中
declare 顾名思义就是描述的意思就是在这个下边可以对变量进行声明。
声明变量有大概如下两三种方式
1. v_temp varchar(10)
2.v_temp tablename.property%type(表明属性名%type就是该表属性的类型,这样可以灵活使用)
3.v_stu student%rowtype;(这种类型就是定义一个变量为表数据的行类型用于接受查询的一行数据,注意是一行数据)
接下来可以看到begin,这里的begin类似于我们的java中的main函数这里可以对变量进行赋值,而且程序是从这来开始来正式执行的。所以一般我们在这里对变量进行赋值
-- Created on 2018/9/9 by LENOVO
--声明变量,声明一个人的姓名,薪水,地址
declare
-- Local variables here
--姓名
v_name varchar2(50) :='张三丰';
--薪水
/* v_salary number(6,2);*/
v_salary emp.ename%type;
--地址
v_address varchar2(100);
v_stu student%rowtype;
begin
-- Test statements here
--dbms_output.put_line('hello world');
v_salary:=1500;
--语句赋值操作。
上边这里begin下边就是对v_salary进行赋值,这里有一点需要注意:plsql中的复制是:=而不是单个=,单个=是判断是否相等意思。这一点需要大家注意。
既然变量也声明了,也赋值了,那么我们需要测试如何输入该值。
接下来就来告诉大家一个输出操作语句 dbms_output.put_line()
上边这个语句类似于System.out.println()操作,是不是很像哈哈。
来个完成的程序,大家可以复制粘贴进你的test窗口里,执行它
-- Created on 2018/9/9 by LENOVO
--声明变量,声明一个人的姓名
declare
-- Local variables here
--姓名
v_name varchar2(50) ';
begin
v_name:=:='张三丰;
dbms_output.put_line('姓名---〉'||v_name);
end;
上边这个程序中就可以按一下F8(快捷键)来执行了,执行结果可以在下边这个方框里查看了。
其中dbms_output.put_line是输出的重要操作。
循环:
下边讲一下关于plsql中关于循环的使用。
loop关键词就是循环的意思,不论大家学习哪门语言都会发现循环的特点就是有入口,有出口(不可能让其死循环)。
这里也不例外。下边是一个栗子:
declare
vcc number;
begin
vcc:=1;
loop
exit when vcc>10;
dbms_output.put_line(vcc);
vcc:=vcc+1;
end loop;
end;
栗子有了,那么就开始剖析了,声明变量就不说了,目的就是为了给出入口,下边就是开始写loop,那么既然有loop肯定要有end loop 就如你写for(int i=0;i<10;i++){ }总不能只写前边这个花括号就把后边给忘记了哈。loop与end loop 就可以真正执行循环了,那么什么时候能够跳出循环呢,这里有一个关键字exit 很显然退出嘛:什么时候退出呢,when 呀,当满足when后边的条件就退出了,可见when 后边跟的是一个boolean结果的表达式。dbms_output.put_line(vcc);就是真正执行的循环语句。
游标
游标一词我们在数据库中估计很少听说吧,不过你是否记得在学习jdbc操作的时候返回的结果集。ResultSet呢其实这里的结果集就可以通过游标来取的。如果你一脸蒙蔽只能说你jdbc学的不咋地哦。那就继续加油哦。
游标这个是非常重要的知识点,希望大家认真学哦。
先来说说游标的属性:
--游标的属性:
-- %rowcount 整型 获得fetch语句返回的数据行数
--%found 布尔型 最近的fetch语句返回一行数据则为真,否则为假
--%notfound 布尔型 与%found属性的返回值相反
--%isopen 布尔型 游标已经打开则为真,否则为假
--其中%notfound是游标中找不到元素时候返回true,通常用来判断推退出循环。
游标的使用需要有四个步骤,记住这四个步骤即可。
声明------》打开-----》取值-----》关闭
--声明游标:利用关键字 cursor + 任意名字[参数列表(可有可无)] +is +你的sql语句
eg:cursor cur is
select name,age from student;
这里就是声明了一个游标并且给其赋值。
打开游标:open + 游标;
eg:open cur;
这里没有什么可说的就类似于jdbc 的connection的open方法
取值:取值有一个关键字叫做fetch英文翻译来就是抓取的意思 使用方法如下::
fetch +游标名称 into 你定义的变量;就是将抓取的游标赋给你之前定义的其他变量。
因为既然使用了游标肯定是有多行数据。所以一般这里的fetch都是放在loop里边的。
eg:
--声明变量接受游标中的数据。
v_name student.name%type;
v_num student.age%type;
begin
--打开游标
open cur;
--遍历取值
loop
--获取游标中德数据,如果有则赋值变量,否则退出
fetch cur into v_name v_num;
exit when cur%notfound dbms_output.put_line('姓名:' || v_name || '年龄:' ||v_num);
end loop;
--关闭游标
close cur;
关闭游标:当便利完毕关闭游标即可:close +游标名;
上边有个语法叫做exit when cur%notfound dbms_output.put_line('姓名:' || v_name || '年龄:' ||v_num);
这里的属性cur%notfound就是如果游标中没有值返回true,因为每次游标都是向下读取的。读到没有数据就会返回cur%notfound为true。
存储过程的建立
上边只是存储过程中的一些语法,下边我们开始建立存储过程:
右键单击这个--->new
然后name写上存储过程名号曾,parameters可以不写。
下边就是一个模板:
然后就可以在这里写具体业务逻辑了。其实这里的declare没有了但我们声明变量直接在begin上边生命,begin里进行赋值然后写业务逻辑即可。
create or replace procedure p_hello is
--无参的存储过程。
--声明变量
--调用方法1.新建一个TEST WINDOW begin与end之间输入 p_hello;即可执行
--在控制台里输入 exec 存储过程名
begin
dbms_output.put_line('hello world');
end p_hello;
/
上边就是一个helloworld版本的存储过程。存储过程是不能直接执行的我们可以借助上边用的Test window来调用存储过程。
declare
begin
p_hello;
end;
这样执行f8就可以看到输出helloworld至此调用存储过程成功。
上边是无参的存储过程。不过不早了,明天还要上班呢,明天晚上再写一篇。希望大家看了以后如果感觉有用还希望给个赞,不嫌弃的话就加个关注吧,最近会在存储过程以及springboot springcloud docker上进行研究。