oracle PL_SQL编程基础,学习笔记与总结

PL/SQL基础

1.语法:
{
[declare]
定义部分
[begin] 开始
[exception] 异常
[end;]结束
}

2.变量的赋值有两种:
a.[变量]:==[相应的值]
b.select [列] into [变量] from [表]····

3.过程调试的输出方法:
dbms_output.put_line('[字符串内容]');


4.DBMS_LOB包提供操作BLOB、CLOB、NCLOB、BFILE和临时LOB对象大的部分或全部数据的方法
{
dbms_log.read(lob_name,i,j,to_lob_name)从lob_name变量里面从i位置开始读取j个字符到to_lob_name里面。
····还有很多,这里不说以后用到了再说
}




5.数据类型:

---------------------------------
---------------------------------
A.标量类型(scalar),只能存放单个数值的标量
{
varchar2(n) 1-32767
varchar(n) 1-32767
char(n) 1-32767
number(p,s)
date
timestamp 它还会显示上下午标记
bollean 值为:true,false,null
long
long raw
integer
int
nchar



}

---------------------------------
---------------------------------
B.复合类型(composite)


{

1.%TYPE :引用变量和数据库列的数据类型(引用某列的类型,把类型与某列绑定起来,使得更加灵活),它主要是避免某表某列的数据类型或长度后来改变的,而PL/SQL维护比较困难耗时间和容易出错;
(
eg:
原来的:
declare
id number;
后来的:
declare
id scott.emp.eno%TYPE
)



2.record :记录赋值,它的用法与C语言里面的结构很相似,它
举一个例子:



select * from student.emp_info

declare
type re1 is record(
sname varchar(6)
);
type re3 is record(
sname1 varchar(6)
);

re2 re1;
re4 re3;
re5 emp_info%rowtype;
begin
--前提是它只有一条数据
select ename into re2 from emp_info where eno=2;
select ename into re4.sname1 from emp_info where eno=3;
select * into re5 from emp_info where eno=3;

dbms_output.put_line('name='||re2.sname);
dbms_output.put_line('name='||re4.sname1);
dbms_output.put_line('name='||re5.ename);
end;



}


3.%ROWTYPE:是record的升级简化版,它比较方便,但record比较灵活,其实二者没什么很大的区别。有一个例子,就像2的例子就有提到该类型用法。





---------------------------------
---------------------------------
C.LOB类型(Large Object)

管理LOB类型有两种方法:
a:dbms_lob 包
b:oracle call interface(OCL)

{

BLOB:用于存储(在数据库中)大量二进制数据,比如图形,视频
CLOB/NCLOB:用于存储(在数据库中)大量的字符数据
BFILE:存储指向OS(操作系统中)文件的指针
}



---------------------------------
---------------------------------
D.参照(引用)类型(reference)(还没好)
{

}




6.PL/SQL控制结构
{

A.条件分支结构:
a:
if [逻辑表达式] then
elseif [逻辑表达式] then
else
end if;
b:
-----------------------
case [指定的

条件变量]
when [值1] then [要执行的操作]
when [值1] then [要执行的操作]
when [值1] then [要执行的操作]
else [要执行的操作]
end case;
-----------或者--------
case
when [逻辑表达式1] then [要执行的操作]
when [逻辑表达式2] then [要执行的操作]
when [逻辑表达式3] then [要执行的操作]
else [要执行的操作]
end case;

-----------------------

B.顺序结构


C.循环结构


a:基本循环(有点类似于JAVA的do..while();)
loop
[要执行的操作]
exit(这一步一点要做) [when [逻辑表达式](当..就退出)]
end loop;
0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-

b.while循环(在这里loop有点类似于JAVA的"{"号,而end loop则是"}")
while [逻辑表达式]
loop
[要执行的操作]
end loop;

c.for 循环

for [变量] in [reverse(自减1,默认自增1)] lower_bound..(只有两个点)upper_bound
loop
[要执行的操作]
end loop;
说明:循环的次数由lower_bound和upper_bound决定.它会把n赋初始值为lower_bound.

}



7.异常处理
{
个人理解:
只要在执行PL/SQL过程中有出现异常错误,该PL/SQL会马上停止工作,触发异常机制,用[sqlcode]显示错误号(eg:ORA-0001),[sqlerrm]显示错误信息,而exception中when中,系统内部的异常只有二十几个而已,有一些是无法从when直接接收到的(并不是所有的错误号都有对应的异常错误信息名称),而单纯用others[是一个错误信息的名称,指的是其它所有未被捕获或处理的错误信息]不能解决所有问题,这个时候只能用[非预]定义异常绑定其错误编码,就是说创建一个"异常错误信息名称",然而,一些没有"错误号"的异常,也就是说编码人本身想要创建一个"异常"的话怎么办?于是有了用户自定义异常
}


a.[预]定义异常:系统内部异常,现有20多个,会并自动抛出。
语法:
declare
--不用声明
begin
exception
when [异常错误信息名称]
then [要执行的操作eg:dbms_output.put_line(sqlcode||'----'||sqlerrm);
when others then [其它可能发生的错误]
end;


b.[非预]定义异常:用于处理预定义异常所不能处理的oracle错误。
declare:
[创建新的异常信息名称] exception;
pragma exception_init([要绑定的异常信息名称,通常会新建一个实例名称],[错误号]);

begin
[要执行的操作......]
exception
when [异常错误信息名称,一般是新建的那个错误信息的名称]
[要执行的操作eg:dbms_output.put_line(sqlcode||'----'||sqlerrm);
end;

c.[用户自]定义异常:顾名思义,用户自己定义的异常,并且由用户自己手动抛出异常,实际上是比[非预]定义异常多了个raise触发异常的方法而已。

语法:
declare:
[创建新的异常信息名称] exception;

begin
[要执行的操作.........]
[当想触发抛出异常时:]
raise [刚创建

的那个异常信息名称]
exception
when [异常错误信息名称,一般是新建的那个错误信息的名称]
[要执行的操作eg:dbms_output.put_line('有异常');
end;




8.execute immediate 执行动态SQL语句
解析:它常被放在PL/SQL语句里面,可以执行增删改查操作,也可以放语句块(eg:begin select * from xxx; end;),但查询语句最多只能返回一行的数据
语法:
declare
xxxx;
begin
execute '这里是执行语句(:1,:2,:3)'[||][连接起来的执行语句]
[into]
[用于接收数据的变量1],
[用于接收数据的变量2],
[用于接收数据的变量3]
{或者 [record 类型]}
{或者 [%rowtype类型]}

[using(输出)] {[in] [out] [变量参数1],
[in] [out] [变量参数2],
[in] [out] [变量参数3]}

end;





























相关文档
最新文档