PL/SQL的介绍
PL/SQL:Procedural Language/SQL 过程SQL;
是对SQL的扩展; PL/SQL中存在过程构造和数据库访问;在Oralce服务器和客户机应用程序中使用; 支持大型对象和集合; 实质是在过程语言中嵌入了SQL而不是相反; SQL可以对数据库进行处理,但是它是单条执行的,无法进行连续的处理,也就是说没有逻辑;
特点:
支持对象类型和集合; 调用外部函数和过程; 支持SQL; 支持OOP; 可以在Oracle各个版本间移植,与Oracle集成在一起;
PL/SQL执行原理
PL/SQL块: 包括一组语句: 声明部分:所有变量的声明; 可执行部分:必须有;异常处理部分;
结构:
Declare
Declarations //声明区域
Degin
Executable statements
Exception
Handlers; //如果没有这个处理语句,则会交给系统处理,类似给虚拟机;
End;
实例:
Declare
Eno emp.empno%type;
Name emp.ename%type;
Begin
Select empno,ename into eno,name from emp where empno=8933;
Dbms_output.put_line(‘empno:’||eno||’ ‘||’ename:’||name);
Exception
When no_data_found then
Dbms_output.put_line(‘没有数据’);
End;
出现错误后,错误后的语句不再执行,跳转到错误处理块执行;
变量的定义
变量是数据的临时存储; 可直接对其赋值; 数据类型:
内置数据类型:
标量:一般数据类型,容纳单个值,number(38位),character(有个long子类型),date,boolean(不能用来定义字段)
复合:可变数组,对象类型;record,varray,nested table;
引用:类似游标 ref cursor;
LOB:大型对象类型
*****SQL-Plus的回显服务器端信息的命令:set serveroutput on
SQL> r
1 declare
2 eno varchar(10):='000';
3 ename varchar(20);
4 isExisted boolean default false;
5 empName constant varchar(10):='Mike';
6 begin
7 eno:='7890';
8 ename:='smith';
Dbms_output.put_line(‘eno=’||eno||’ ‘||’ename=’||ename);
9* end;
eno=7890 ename=smith
PL/SQL 过程完成;
如果想动态输出数据库中的信息的话,可以在begin后面这样写:
Select empno,ename to eno,ename from emp where empno=’7002’;
这里如果不加where 语句,则会抛出:实际返回的行数超出请求的行数异常;
SQL> r
1 declare
2 eno varchar(10):='000';
3 ename varchar(20);
4 isExisted boolean default false;
5 empName constant varchar(10):='Mike';
6 begin
7 select empno,ename into eno,ename from emp;//这里没有where
8 Dbms_output.put_line('eno='||eno||' '||'ename='||ename);
9* end;
declare
*
ERROR λÓÚµÚ 1 ÐÐ:
ORA-01422: ʵ¼Ê·µ»ØµÄÐÐÊý³¬³öÇëÇóµÄÐÐÊý
ORA-06512: ÔÚline 7
在SQL语句中对变量赋值用into,在SQL以外用 :=来赋值;
匿名PL/SQL程序块;
注释:-- /* */;
属性
%type 引用数据库列
%rowtype 代表表中的行
也就是说为了防止发生定义的变量长度小于选择的数值长度的异常,我们用这两个属性来做为自适应的变量定义;
SQL> r
1 declare
2 eno emp.empno%type;
3 ename emp.ename%type; ---代表相应字段的类型
4 emprow emp%rowtype; --代表一行
5 isExisted boolean default false;
6 empName constant varchar(10):='Mike';
7 begin
8 select empno,ename into eno,ename from emp where empno=7902;
9 select * into emprow from emp where empno=7788; --使用emprow返回一行
10 Dbms_output.put_line('eno='||eno||' '||'ename='||ename);
11 dbms_output.put_line('empno:'||emprow.empno||'ename:'||emprow.ename);
12* end;
eno=7902 ename=FORD
empno:7788ename:SCOTT
PL/SQL ¹ý³ÌÒѳɹ¦Íê³É¡£
比较运算
Dbms_output.put_line('eno='||eno||' '||'ename='||ename);
只能输出字符型的,所以如果你要输出一个date型的,必须首先用to_char(date,’’)转换日期型数据,正如我们经常to_date(char,’’)一样;
SQL> r
1 declare
2 eno emp.empno%type;
3 ename emp.ename%type;
4 emprow emp%rowtype;
5 thisday date;
6 begin
7 thisday:=sysdate;
8 dbms_output.put_line('this is day:'||to_char(thisday,'YYYY-mm-dd'));
9* end;
this is day:2005-10-24
比较日期的练习:
SQL> r
1 declare
2 eno emp.empno%type;
3 ename emp.ename%type;
4 emprow emp%rowtype;
5 thisday date;
6 begin
7 thisday:=sysdate;
8 if thisday>todate(‘2005-10-23’,’yyyy-mm-dd’) then
9 dbms_output.put_line('this is day:'||to_char(thisday,'YYYY-mm-dd'));
10 else
11 dbms_output.put_line('this is kao');
12 end if;
13* end;
this is day:2005-10-24
控制语句
1,条件控制:f then ,if then else , if then elsif , case
语句块结束的时候必须写end if;
2,循环控制:
计算1加到100:
3,顺序控制:goto 不建议使用;
Null :空语句;有时候暂时不想在需要有代码的地方编代码时用null语句就行;
错误处理
两重类型的异常:预定义的; 用户定义的;raise语句可手工引发异常;TMD跟Java一模一样;