1.什么是PL/SQL?
PL/SQL(Procedure Language/SQL)
PLSQL是Oracle对sql语言的过程化扩展
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。
2.SQL优点: 1.交互式非过程化;
2.
数据操纵功能强;
3.
自动导航语句简单;
4.
调试容易使用方便。
3.PL/SQL优点:
把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,
使得PLSQL面向过程但比过程语言简单、高效、灵活和实用。
4.PL/SQL的程序结构:
declare
说明部分
变量说明,光标申明,例外说明 〕
begin
语句序列 (DML语句〕…
exception
例外处理语句
End;
/
5.注意:如果要在屏幕上输出信息,
需要将serveroutput开关打开
: set serveroutput on ---》在declare之前
6.变量和常量说明
一般声明变量:pid char(12); psal number(7,2);
一般声明常量:married boolean := true;
引用型变量:my_name emp.ename%type;----->my_name的类型与emp表中的ename列的类型一样
记录型变量:emp_rec emp%rowtype;-------->emp_rec的类型是emp表中整个所有列的类型,该emp_rec值是一个数组
7.if else 语句
IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
-----》elseif的词为elsif 不要用错
ELSE 语句;
END IF;
8.提示
从键盘输入:
accept num prompt '请输入一个数字';---》接收键盘输入 num 是一个地址值(类似指针)
得到键盘输入的值:
pnum number := #
9.SQL优化: num绑定变量(尽量使用绑定变量)
select * from emp where deptno=10; --> 执行计划
select * from emp where deptno=20; --> 执行计划
上面2条语句在Oracle内部机制中认为是不同的语句,其执行计划是不同的,所以要开启2次执行计划,性能降低
优化采用的方式:select * from emp where deptno=# 只开启一次执行计划
10.循环
我个人采用的:
Loop
EXIT [when 条件];
……
End loop;
11.光标
说明光标语法:
CURSOR 光标名
[(参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句;
作用:
用于存储一个查询返回的多行数据
打开光标: open c1;(打开光标执行查询)
取一行光标的值:fetch c1 into pjob; (取一行到变量中)
关闭光标: close c1;(关闭游标释放资源)
光标的属性:
1.%isopen 是否被打开
2.%rowcount 行数
3.%notfound 是否有值
带参数光标:
cursor c2(jobc varchar2) is
select ename, sal from emp
where job=jobc;
执行open('xxx');
SQL>show parameters cursor;---->用于显示光标参数的默认值等信息
12.Oracle的异常处理
系统定义例外
1.
No_data_found (没有找到数据)
2.Too_many_rows (select …into语句匹配多个行)
3.
Zero_Divide (被零除)
4.
Value_error (算术或转换错误) 5.Timeout_on_resource (在等待资源时发生超时)
用户自定义例外
DECLARE
My_job char(10); v_sal emp.sal%type;
No_data exception;----》自定义No_data例外
cursor c1 is select distinct job from emp order by job; BEGIN
open c1;
Fetch c1 into v_job;
IF c1%notFOUND then raise no_data;--->抛出例外
end if;
…
EXCEPTION
WHEN no_data THEN insert into emp values(‘fetch语句没有获得数据或数据已经处理完');
END;