1. 面向过程的语言
打印hello word
declare
-- 说明部分(变量,光标或者例外)
begin
--程序体
dbms_output.put_line("Hello Word");
end;
/ --退出编译环境,并执行这个程序
--打开输出开关
set serveroutput on
/ --执行
------输出结果-------
Hello World
--查看程序包的结构
desc dbms_output
官方语法文档
database-pl-sql-language-reference.pdf
程序包的相关文档
database-pl-sql-packages-and-types-reference.pdf
定义基本变量
类型 :char,varchar2,date,number,boolean,long
举例: var1 char(15);
married boolean := true;
psal number(7,2);
引用型变量
pename emp.ename%type ; --pename 变量类型会随着emp表中ename 字段的类型变化而变化
类似于 pename varchar2(64);
记录性型变量
注意:代表一行记录,一行记录中有不同类型
emp_rec emp%rowtype;
select * into emp_rec from emp where empno= 7839;
if语句的使用
第一种类型
IF 条件 THEN 语句1;
语句2;
END IF;
第二种类型
IF 条件 THEN 语句1;
ELSE 语句2;
END IF;
第三种类型
IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句;
END IF;
从键盘输入一个数字
循环语句
第一种类型
While total <= 25000 Loop
.....
total := total+salary;
END LOOP;
第二种类型
Loop
EXIT[when 条件];
......
End loop;
第三种类型
FOR I IN 1...3 LOOp
语句序列;
END LOOP;
光标(相当于Java结果集 Resultset)
光标的属性
%fund %notfund 判断光标是否取到一条记录
%isopen: 判断光标是否打开
%rowcount 影响的行数
CURSOR 光标名[(参数名 数据类型[,参数名 数据类型]...)] IS SELECT 语句;
例如 cursor c1 is select ename from emp;
光标数的限制
默认情况下,oracle 数据库只允许在同一个会话中,打开300个光标
查询参数
修改光标的数量
alter system set open_cursors=400 scope=both;
打开光标:
open c1;打开光标执行查询
关闭光标:
close c1;关闭游标释放资源
取一行光标的值:
fetch c1 into pename;取一行到变量中
fetch的作用:
1)把当前指针指向的记录返回
2)将指针指向下一条记录
光标的使用
1.定义一个光标 cursor cname is select ......
- 为光标定义一个变量 pename emp.ename%type ; (引用类型变量)
- 打开光标 open cname
- 取一条记录 fetch cname into pename
- 关闭光标 close cname
set serveroutput ondeclare-- 定义一个光标cursor cemp is select ename,sal from emp;--定义一个带参数的光标cursor cemp(dno number) is select ename from emp where deptno = dno;--为光标定义相对的变量pename emp.ename%type;psal emp.sal%type;begin --打开游标open cemp; loop --取一条记录 fectch cemp into pename,psal; exit when cemp%notfound; -- 打印 dbms_output.putline(pename || '的新水量'|| psal); end loop; --关闭光标 close cemp; end; /
注意: 如果PL/SQL 中对数据进行了修改操作,一定要记得commit ;
对于Oracle ,默认的事务隔离级别是read commiteed ;
异常
抛异常
declare 说明部分(变量说明、光标申明、例外说明)begin 语句序列exception 例外处理语句end;/举例:exception when no_data_fund then dbms_output.put_line("没有找到该员工"); when others then dbms_output.put_line('其他例外');end;/
常见异常
no_data_fund 没有发现数据
too_many_rows 返回多行数据
zero_divide : 0不能做除数
value_error: 算术或转换错误,就是比如字符串类型的变量转换成数字变量。
自定义异常
当抛出异常没有直接正常关闭光标时,Oracle 会自动启动pmon进程(Process Monitor) 会自动回收垃圾进程,有点像Java中的GC
有不对的地方,欢迎大家一起讨论。 最后,欢迎大家关注我的微信号“涛涛之海”,您的点赞,收藏,转发就是对我的最大鼓励。