1. 需要开启的服务: 本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开:
OracleDBConsoleorcl
OracleOraDb10g_home1iSQL*Plus
OracleOraDb10g_home1TNSListener
OracleServiceORCL 这个后面的ORCL就是数据库名字,官方术语叫做数据库sid
2.打开PL/SQL工具,用户名scott 登陆sid为ORCL的数据库, 密码 tiger
3.打开一个测试窗口,如下
1 -- Created on 2018/6/3 by ADMINISTRATOR
2 declare
3 -- 声明本地变量的地方,包括游标(结果集类型变量),如果没有,declare可以去掉
4 --相当于java的 public class A{}
5 i integer;
6 begin
7 -- 执行部分
8 --相当于Java的public static void main(String[] args)
9 --异常处理
10 end;
4.打印helloworld
结果如下:
dbms_output是oracle的程序包,put_line()是调用的方法
在命令行中打印:需要先设置 set serveroutput on ,才会将打印语句打印出来,否则只执行不打印。
5. PLSQL变量的使用:
PLSQL中的变量分两种:
(1)普通数据类型:char varchar2 date number(整数和小数) boolean long
(2)特殊变量类型(引用变量、记录型变量)
变量的声明方式为:变量名 变量类型(变量长度) ,例如:v_name varchar2(20)
变量赋值:
(1)声明时使用 := 直接赋值:v_name varchar2(20) := ‘zhangsan’ 只写=,则是进行比较
(2)语句赋值: select 值 into 变量名
5.1 普通变量的使用
1 -- 声明一个人的信息 姓名 薪水 地址
2 declare
3 -- 姓名 不能使用name,这是保留字
4 v_name varchar2(50) := '张三';
5 -- 薪水 小数:number(总长度(小数加整数的位数),小数位数) v_sal number(6,2) --1000.00
6 v_sal number;
7 --地址
8 v_addr varchar2(200);
9 begin
10 --直接赋值
11 v_sal := 15000;
12 --语句赋值
13 select '上海市南京路' into v_addr from dual; --实际工作中应该是from 某个表
14 -- 打印变量 || 是拼接符,相当于java 的+
15 dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal || ',地址:' || v_addr);
16 end;
执行结果:
5.2 引用变量的使用
引用变量:变量的类型和长度取决于表中字段的类型和长度(变量的类型和长度引用表中字段的类型和长度),通过 表名.列名%TYPE 指定变量的类型和长度,例如 v_name emp.ename%TYPE
引用型变量的好处:使用普通变量定义方式,需要知道表中列的类型,而使用引用类型不需要考虑列的类型,使用%TYPE是非常号的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
1 -- 查询emp表中7839号员工的个人信息,打印姓名和薪水
2 declare
3 -- 姓名 定义的是引用变量
4 v_ename emp.ename%TYPE;
5 -- 薪水
6 v_sal emp.sal%TYPE;
8 begin
9 --查询姓名和薪水并赋值给变量,。使用select into 语句赋值
10 select ename, sal into v_ename, v_sal from emp where empno = 7839;
11 dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
13 end;
5.3 记录型变量
记录型变量 默认接接收 表中的一行数据,不能指定字段,相当于java中的一个对象。
语法: 变量名称 表名%ROWTYPE 例如 v_emp emp%rowtype; 通过 变量名.字段名 的方式获取变量中的值
1 --记录型变量示例:用该变量接收表中一行sql的信息
2 declare
3 -- 记录型变量
4 v_emp emp%ROWTYPE;
6 begin
7 --查询所有字段并赋值给变量,字段名用v_emp.字段名 表示
8 select * into v_emp from emp where empno = 7839;
9 dbms_output.put_line('姓名:' || v_emp.ename || ',薪水:' || v_emp.sal);
11 end;
6.流程控制:
6.1 条件分支,语法:
BEGIN
IF 条件1 then 执行1;
Elsif
条件2 then 执行2 ; --注意不是 elseif ,是elsif
Else 执行3
End if;
1 -- 判断emp表中记录是否超过20条,10-20 之间,或者10条以下
2 declare
3 --声明变量接收emp表中记录数
4 v_count number;
5 begin
6 -- 查询并赋值给变量
7 select count(1) into v_count from emp;
8 --判断打印
9 if v_count > 20 then
10 dbms_output.put_line('emp表中的记录数在20条以上为' || v_count);
11 elsif v_count >= 10 then
12 dbms_output.put_line('emp表中的记录数在10-20条之间为' || v_count);
13 else
14 dbms_output.put_line('emp表中的记录数在10条以下为' || v_count);
15 end if;
17 end;
执行结果:
select * 结果如下:
6.2 loop循环.此处只记录loop循环的使用。 循环两个要点:1.循环变量初值,循环体中循环变量值要发生变化,
1 -- 循环打印1-10
2 declare
3 -- 声明一个循环变量并赋初值
4 v_num number := 1;
5 begin
6 loop
7 exit when v_num > 10;
8 dbms_output.put_line(v_num);
9 --循环变量的自增长
10 v_num := v_num + 1;
11 end loop;
12 end;
7.特殊的变量—— 游标,本质上是一条查询语句的结果的封装,只能往前,不能往后
用于临时存储一个查询返回的多行数据(结果集,类似于Java的jdbc连接返回的resultset集合),通过遍历游标,可以逐行访问处理该结果集的数据
游标使用方法:声明 打开 读取 关闭
游标声明: CURSOR 游标名[(参数列表)] IS 查询语句
游标打开: Open 游标名;
游标的取值: FETCH 游标名 into 变量列表;
游标关闭: CLOSE 游标名
游标属性:
%NOTFOUND 是在游标中找不到元素时返回TRUE,通常用于判断,退出循环
7.1 不带参数的游标 示例:
1 -- 使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
2 declare
3 -- 声明游标
4 cursor c_emp is
5 select ename, sal from emp;
6 --声明变量接收游标中的数据
7 v_ename emp.ename%TYPE;
8 v_sal emp.sal%TYPE;
9 begin
10 -- 打开游标
11 open c_emp;
12 -- 遍历游标
13 loop
14 --获取游标中的数据,如果有的话就赋值给变量
15 fetch c_emp
16 into v_ename, v_sal;
17 exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
18 dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
19 end loop;
21 --关闭游标
22 close c_emp;
24 end;
结果如下:
7.2 带输入参数的游标:
1 -- 使用游标查询emp表中某个部门员工的姓名和工资,并将其依次打印出来
2 declare
3 -- 声明带参数的游标,在声明时加上形参,select语句里面加上查询条件
4 cursor c_emp(v_deptno emp.deptno%TYPE) is
5 select ename, sal from emp where deptno = v_deptno;
6 --声明变量接收游标中的数据
7 v_ename emp.ename%TYPE;
8 v_sal emp.sal%TYPE;
9 begin
10 open c_emp(10); -- 打开游标时加上实参
11 loop -- 遍历游标
12 fetch c_emp into v_ename, v_sal; --获取游标中的数据,如果有的话就赋值给变量
13 --在判断之前先获取一下数据,看有还是没有
14 exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
15 dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
16 end loop;
17 close c_emp; --关闭游标
19 end;
上述游标使用语句,相当于一个匿名的函数,当测试窗口关闭,语句也就没有了,无法实现复用。如果想要在窗口关闭了之后还能使用上面那段语句,就需要存储过程了。参见下文存储过程学习记录。
pl
sql
以及
存储过程
pl
sql
编程概念和目的什么是
PL
/
SQL
PL
/
SQL
的好处程序结构
变量
的声明及使用流程控制条件分支循环集合类型的
变量
游标带参数的游标
存储过程
概念与介绍
存储过程
的作用语法Java 程序调用
存储过程
pl
sql
编程
概念和目的
什么是
PL
/
SQL
PL
/
SQL
:procedure language/
SQL
PL
/
SQL
是
Oracle
对
sql
语言的过程化扩展
指在
sql
命令语言中增加了过程处理语句(如分支、循环等),使得
sql
语句具有过程处理能力。
PL
/SQ
有参又分为 in、out、in out 三种 分别代表传递给储存过程,从储存过程传出,以及对
存储过程
传入和传出。3.3 IN OUT类型--同时满足向
存储过程
输入和
存储过程
向外输出。
存储过程
是一个要被预编译的代码块,一次编译,多次调用。由于调用的代码较少,减少了网络流量,降低了网络负担。2.1有参、
存储过程
调用
存储过程
。二.
存储过程
1.无参
存储过程
。
存储过程
分为有参和无参两种。--不是有效函数或过程名。4.
存储过程
调用游标。...
以上几个稽核每个都分为语句块或单独写了一个
存储过程
。
最后需要整合到一起 通过package包实现。分两部分包头 与 包体
变量
一开始是每个
存储过程
单独定义每个判断单元都给一个字符
变量
赋值并打印相应结果。
例如vstr1 ,vstr2 ,v...
begin
#类似于 java System.out.println('hello world'),put()输出;put_lint()换行输出;
Dbms_Output.put_line('hello world!');
#方法结束
PL
SQL
编程中常见的
变量
分两大类:
1.普通数据类型(char,varcher2,date,number,boolea,long
存储过程
和函数
ORACLE
提供 可以把
PL
/
SQL
程序存储在数据库中,并可以在任何地方来运行它。这样就叫
存储过程
或函数。
存储过程
和函数统称为
PL
/
SQL
子程序,他们是被命名的
PL
/
SQL
块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。
存储过程
,就是一段存储在数据库中执行某块业务功能的程序模块。它是由一段或者多段的
PL
/
SQL
代码块或者
SQL
语句组成的一系列代码块。
--创建
存储过程
的
先来讲一个小故事,2015年6月份,有个客户迁移了数据库,由单实例数据库变成了RAC。JAVA应用程序出现了无法连接数据库的情况,但是
PL
/
SQL
能连接上数据库。由于项目比较庞大,虽...
PL
/
SQL
Developer(
pl
/
sql
)是一个集成开发环境,专门面向
Oracle
数据库存储程序单元的开发。
<br>此版本包含注册文件和简体中文语言安装包
<br>Enhancements in
PL
/
SQL
Developer 7.1.5
====================...