Oracle数据库快速入门
关于Oracle数据库
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境.它是一种高效率、可靠性好的、适应高吞吐量的数据库方案.
集成开发环境PLSQL
PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。类比于Java和eclipse.
PLSQL下载破解及汉化教程
程序结构
在PLSQL新建SQL窗口
Oracle中词法不区分大小写,但尽可能使用大写形式(Oracle数据库中,执行会先将各个小写关键字转换成大写关键字后再编译执行)
--Createdd
DECLARE
--Local Variables here
--声明变量,游标
i INTEGER;
BEGIN
--Test stastements here
--执行语句
--[异常处理]
END;
其中DECLARE部分用来声明变量或游标(结果集类型变量,可以当做一个类),如果程序中无声明可以省略
Hello World
--Createdd
DECLARE
--Local Variables here
i INTEGER;
BEGIN
--Test stastements here
--java: System.out.printlm("hello world!");
dbms_output.put_line('hello world!');
END;
因为没有使用到变量,也可以:
BEGIN
--Test stastements here
--java: System.out.printlm("hello world!");
dbms_output.put_line('hello world!');
END;
通过命令窗口的模式,输入全部SQL后需要在末尾加一斜杠\代表命令结束.要看见输出的信息,则需要set serveroutput on 打开输出
变量
PLSQL编程中将常见的变量分为两大类:
- 普通数据类型(char, varchar2, date, number, boolean, long)
- 特殊变量类型(引用型变量, 记录型变量)
声明变量的方式为:
变量名 变量类型(变量长度)
例如: V_Name Varchar2(20);
1.普通数据类型(char, varchar2, date, number, boolean, long)
变量赋值的方式有两种:
- 直接复制语句 :=
- 语句赋值, 使用 select … into … 赋值 ; (语法 select 值 into 变量 )
[示例]打印人员个人信息,包括:姓名, 薪水, 地址
-- 打印人员个人信息,包括: 姓名, 薪水, 地址
DECLARE
--姓名
v_name VARCHAR2(20) := '张三'; --初始赋值
v_sal NUMBER;
v_addr VARCHAR2(200);
BEGIN
-- 直接赋值
v_sal := 5000;
--语句赋值
SELECT '北京中关村' INTO v_addr FROM dual; --dual (Oracle提供的最小的工作表)
--打印输出
dbms_output.put_line('姓名:' || v_name || ' 薪水:' || v_sal || ' 地址:' || v_addr);
END;
结果:
2.特殊变量类型(引用型变量, 记录型变量)
2.1引用类型变量
变量的类型和长度取决于表中字段的类型和长度
通过表名.列明%Type指定变量的类型和长度,例如: v_name emp.ename%TYPE;
[示例]查询emp表中2号员工的个人信息,打印姓名和薪水
首先创建表emp
-- Create table
create table EMP
(
empno VARCHAR2(30),
ename VARCHAR2(20),
sal NUMBER,
addr VARCHAR2(200)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
再插入基础数据
INSERT INTO EMP (EMPNO, ENAME, SAL, ADDR)
VALUES ('1', '张三', 1500, '北京');
INSERT INTO EMP (EMPNO, ENAME, SAL, ADDR)
VALUES ('2', '李四', 2500, '上海');
INSERT INTO EMP (EMPNO, ENAME, SAL, ADDR)
VALUES ('3', '王五', 3500, '广州');
执行实例,一般情况下的多值插入
-- 打印人员个人信息,包括: 姓名, 薪水, 地址
DECLARE
--姓名
v_name VARCHAR2(20);
v_sal NUMBER;
BEGIN
--语句赋值
SELECT T.ENAME, T.SAL INTO v_name, v_sal FROM EMP T WHERE T.EMPNO = '2';
--打印输出
dbms_output.put_line('姓名:' || v_name || ' 薪水:' || v_sal);
END;
执行实例,使用引用类型变量的多值插入
-- 打印人员个人信息,包括: 姓名, 薪水, 地址
DECLARE
--姓名
v_name EMP.ENAME%TYPE;
v_sal EMP.SAL%TYPE;
BEGIN
--语句赋值
SELECT T.ENAME, T.SAL INTO v_name, v_sal FROM EMP T WHERE T.EMPNO = '2'; --dual (Oracle提供的最小的工作表)
--打印输出
dbms_output.put_line('姓名:' || v_name || ' 薪水:' || v_sal);
END;
结果都是:
引用类型变量的好处:
使用普通变量定义方式,需要知道表中列的类型,而使用引用类型,不需要考虑列的类型,使用%TYPE是非常好的编程风格,因为它是的PL/SQL更加灵活,更适应于数据库定义的更新
2.2记录型变量
接受表中的一整行记录,相当于Java中的一个对象
语法 变量名称 表名%ROWTYPE
例如: v_emp emp%rwotype ;
示例:
-- 打印人员个人信息,包括: 姓名, 薪水, 地址
DECLARE
--记录型变量
v_emp emp%ROWTYPE;
BEGIN
--语句赋值
SELECT * INTO v_emp FROM EMP T WHERE T.EMPNO = '3'; --dual (Oracle提供的最小的工作表)
--打印输出
dbms_output.put_line('姓名:' || v_emp.ename || ' 薪水:' || v_emp.sal || '地址: '|| v_emp.addr );
END;
输出:
适用场景:如果有一个表,有100个字段,那么你程序如果要使用这100字段的话,如果你使用引用型变量一个个声明,会特别麻烦,记录型变量可以方便解决这个问题.
注意,记录型变量一次只能记录一行,并且最好使用 * 进行插入
流程控制
1.条件分支
语法:
BEGIN
--IF判断语法
IF 条件语句1 THEN
执行语句1
ELSIF 条件语句2 THEN
执行语句2
ELSE 执行语句3
END IF;
END;
注意关键字 : ELSIF
[示例]判断emp表中记录是否超过20条,10-20条之间,或者10条以下
--判断emp表中记录是否超过20条,10-20条之间,或者10条以下
DECLARE
--声明变量接收emp中的数量
v_count NUMBER;
BEGIN
SELECT COUNT(1) INTO v_count FROM emp t;
IF v_count > 20 THEN
dbms_output.put_line('emp表汇总的记录数超过了20条为: ' || v_count);
ELSIF v_count >= 10 THEN
dbms_output.put_line('emp表汇总的记录数在10-20条为: ' || v_count);
ELSE
dbms_output.put_line('emp表汇总的记录数在10条以下为: ' || v_count);
END IF;
END;
结果:
2.循环
在Oracle中有三种循环方式,这里我们不展开,只介绍一种:loop循环
语法:
BEGIN
LOOP
EXIT WHEN 退出循环条件
END LOOP;
END;
[示例]打印数字1-10 :
--打印数值1-10
DECLARE
--声明变量
v_num NUMBER := 1;
BEGIN
LOOP
EXIT WHEN v_num > 10;
dbms_output.put_line(v_num);
--循环控制变量自增
v_num := v_num + 1;
END LOOP;
END;
结果:
游标
1.什么是游标
用于临时存储一个查询返回的多行数据(结果集,类似于Java的jdbc连接返回的ResultSet集合),通过遍历游标,可以逐行访问处理该结果集的数据.
游标的使用方式: 声明–> 打开 --> 读取 --> 关闭
2.语法
游标声明:
CURSOR 游标名[(参数列表)] is 查询语句;
游标的打开:
OPEN 游标名;
游标取值:
FETCH 游标名 INTO 变量列表;
游标的关闭:
CLOSE 游标名;
2.3游标的属性
游标的属性 | 返回值的类型 | 说明
游标的属性 | 返回值的类型 | 说明 |
---|---|---|
%ROWCOUNT | 整型 | 获得FETCH语句返回的数据行数 |
%FOUND | 布尔型 | 最近的FETCH语句返回一行数据则为真,否则为假 |
%NOTFOUND | 布尔型 | 与%FOUND属性返回值相反 |
%ISOPEN | 布尔型 | 游标已经打开时值为真,否则为假 |
其中%NOTFOUND是在游标中找不到元素的时候返回True,通常用来判断退出循环
2.4 创建和使用
[示例]使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
DECLARE
--声明游标
CURSOR c_emp IS SELECT t.ename ,t.sal FROM emp t;
--声明变量接受游标中的数据
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
--打开游标
OPEN c_emp;
--遍历游标
LOOP
--获取游标中的数据
FETCH c_emp INTO v_ename ,v_sal;
--退出循环条件
EXIT WHEN c_emp%NOTFOUND;
dbms_output.put_line(v_ename || '---' || v_sal);
--循环控制变量自增
END LOOP;
END;
结果:
2.5带参数的游标
先对表中添加数据
insert into emp (EMPNO, ENAME, SAL, ADDR)
values ('1', '张三', 1500, '北京');
insert into emp (EMPNO, ENAME, SAL, ADDR)
values ('2', '李四', 2500, '上海');
insert into emp (EMPNO, ENAME, SAL, ADDR)
values ('3', '王五', 3500, '广州');
insert into emp (EMPNO, ENAME, SAL, ADDR)
values ('4', '赵六', 2500, '深圳');
insert into emp (EMPNO, ENAME, SAL, ADDR)
values ('5', '刘七', 2500, '西安');
使表中数据为:
EMPNO ENAME SAL ADDR
1 1 张三 1500 北京
2 2 李四 2500 上海
3 3 王五 3500 广州
4 4 赵六 2500 深圳
5 5 刘七 2500 西安
带参数游标的使用
--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
DECLARE
--声明游标
CURSOR c_emp(v_sal emp.sal%type) IS SELECT t.ename ,t.sal FROM emp t WHERE t.sal = v_sal;
--声明变量接受游标中的数据
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
--打开游标,并且对游标参数指定要薪水为2500的员工
OPEN c_emp(2500);
--遍历游标
LOOP
--获取游标中的数据
FETCH c_emp INTO v_ename ,v_sal;
--退出循环条件
EXIT WHEN c_emp%NOTFOUND;
dbms_output.put_line(v_ename || '---' || v_sal);
--循环控制变量自增
END LOOP;
END;
其中特别要注意
–获取游标中的数据
FETCH c_emp INTO v_ename ,v_sal;
和
–退出循环条件
EXIT WHEN c_emp%NOTFOUND;
位置不要混淆,导致最后多拿取一次数据