Oracle学习笔记——PL/SQL编程基础

时间:2021-07-21 23:00:47

PL/SQL编程基础:

1.PL/SQL块基本结构:

declare    (可选项,用于声明变量)

……

begin

……

exception (异常处理)

……

end

/

2.PL/SQL变量声明:

变量声明所要做的主要工作:赋予变量适当的名称,正确的数据类型,控制变量的作用范围。

变量命名规则:由字母开头,可以包含数字,下划线(_)$#等,不区分大小写,不可以是系统关键字。

一个简单的PL/SQL变量声明的例子如下:

declare

x varchar2(10);

begin

x:=’This is x…..’;                                     --为变量x赋值,赋值符号为(:=)

DBMS_output.put_line(‘x的值为:’|| x);    --在命令行控制台打印输出变量x的值

end;

/                                                              --执行该PL/SQL程序块

3.PL/SQL中的分支语句:

PL/SQL中有两种分支语句:if分支和case分支。

(1).if分支:

if …… then

       ……

elsif …… then            --注意Oracle中的elseif写法为(“elsif”),比较特殊

……

else

……

end if;

(2).case分支:

case

when …… then ……

when …… then ……

else ……

end case;

4.PL/SQL中的循环:

PL/SQL中有三种循环:基本循环,while循环和for循环:

(1).基本循环(loop)

loop

……

end loop;

(2).While循环:

while expression loop

……

end loop;

(3).for循环:

for counter in[reverse] start_value .. end_value loop    --注意:reverse是从大到小,默认是从小                                                  --到大。start_valueend_value之间是两个点(..)

……

end loop;

注意:若想要在PL/SQL循环中跳出循环,可以使用以下两种方法:

a. if …… then

       exit;

end if;

b.exit when ……;

5.PL/SQL for循环的简单例子:

设置Oracle控制台屏幕输出命令:set serveroutput on.

PL/SQL for循环的简单例子:

begin

for i in 1..5 loop

DBMS_output.put_line(‘i=’|| i);

end loop;

end;

/

6.PL/SQL中支持goto跳转语句:

在很多编程语言中,goto语句都不支持或者不推荐使用,在PL/SQL中是支持goto跳转的,其使用方法如下:

declare

x number;

begin

x:=0;

<<repeat_loop>>           --goto跳转标记

x:=x+1;

DBMS_output.put_line(‘x=’||x);

if x < 3 then

goto repeat_loop;           --程序跳转到goto跳转标记处

end if;

end;

/

7.PL/SQL中的异常处理:

语法:exception

when …… then

……

例子如下:

exception

when no_data_found then            --oracle系统异常

DBMS_output.put_line(‘自定义异常信息’);

注意:PL/SQL异常必须在beginend之间使用。

8.PL/SQL自定义异常:

PL/SQL自定义异常很简单,要使用自定义异常必须显示抛出自定义异常,例子如下:

declare

test varchar2(20);

e      exception;              --声明自定义异常变量

begin

select ename into test from emp where empno= ‘……’;

if test <> ‘KING’ then

raise e;                         --显示抛出自定义异常

end if;

DBMS_output.put_line(‘ename=’||test);

exception

when e then

DBMS_output.put_line(‘自定义异常信息’);

end;

/

9.PL/SQL中记录:

PL/SQL中有一种数据结构叫做记录,记录是由几个相关值构成的复合变量,常用于支持select语句的返回值,使用记录可以将一行数据看成一个单元进行处理,而不必将每列单独处理。

(1).记录的声明:

type 记录名 is record(

       变量名1 datatype[,

       变量名2 datatype[,

       ……

);

记录引用名 记录名;           --使用引用名引用记录

注意:PL/SQL记录的注意事项:

a.在记录中指定数据类型时,可以使用如”emp.id%type”的方式,意思是和emp表中的id数据类型相同。

b.也可以使用记录名 表名%rowtype”方式,意思是记录中的变量名和数据类型和表中的列完全相同。

c.PL/SQL中不能直接使用select … from …,必须使用select … into 变量 from …方式将查询的记录存放在变量中。

(2).记录使用例子1

declare

myrecord emp%rowtype;      --声明记录和emp表中的记录完全一致

begin

select * into myrecord from emp where ……;

DBMS_output.put_line(“empno=”||myrecord.empno);--打印输出记录中的empno变量的值

end;

/

(3).记录使用例子2

declare

type myrecord is record(

       idvarchar2(20),

       namevarchar2(50)

);

test_record myrecord;   --使用test_record引用自定义的记录

begin

select empno,ename into test_record fromemp where ……

DBMS_output.;put_line(‘id=’||test_record.id || ‘,name=’ || test_record.name);

end;

/

10.游标:

游标是一种PL/SQL控制结构,可以对SQL语句的处理进行显式控制,便于对表的行数据逐条进行处理。游标分为显式游标和隐式游标。

11.显式游标:

显式游标是显式声明和定义的游标,需要显式地打开和关闭。

(1).显式游标的简单实用例子:

declare

cursor mycur is select * from emp;             --显式游标的声明方式

myrecord emp%rowtype;                    --声明记录

begin

open mycur;                                      --打开游标

fetch mycur into myrecord;                 --将游标中一条数据放入记录中

while mycur%found loop                    --游标中还有数据

DBMS_output.put_line(‘empno=’ ||myrecord.empno || ‘,ename=’ || myrecord.ename);

fetch mycur into myrecord;                 --将游标中下一条数据放入记录中

end loop;

close mycur;                                      --关闭游标

end;

/

注意:游标的常用属性有:%found%isopen%notfound%rowcount

(2).使用游标参数例子:

可以通过给游标传递参数,从而得到相应的游标值,如:

declare

cursor cur_param(id varchar2) is                                    --游标参数不需要指定数据长度

select ename from emp where empno = id;

begin

DBMS_output.put_line(‘result set is:’);

for cur in cur_param(7389) loop                               --此处的cur是一个隐式游标

DBMS_output.put_line(‘ename=’ ||cur.ename);

end loop;

end;

/.

(3).利用游标修改数据的例子:

declare

cursor cur is

select ename from emp for update;                     --注意:修改数据必须加上“for update

text varchar2(20);

begin

open cur;

fetch cur into text

while cur%found loop

update emp set ename = ename || ‘_testupdate’where current of cur; --修改游标所在行

fetch cur into text;

end loop;

close cur;

end;

/

12.隐式游标:

隐式游标不需要在declare块中先是声明定义,也不需要手动打开和关闭,一个简单的隐式游标的例子如下:

begin

for cur in (select ename from emp) loop                           --此处的cur就是隐式游标

DBMS_output.put_line(‘ename=’ ||cur.ename);

end loop;

end;

/

13.存储过程:

存储过程是一组实现特定功能的PL/SQL语句块,被数据库编译编译以提高效率。

(1).创建存储过程的语法:

create [or replace] procedure 存储过程名

[(param1 [{in | out | in out}])] 参数类型1   --in是输入参数,out是输出参数

[(param2 [{in | out | in out}])] 参数类型2   -- in out是输入输出参数,不指定时默认是in

……

is | as

……

begin

存储过程体

end;

/

注意:当存储过程编译出错时,可以使用”show errors procedure 存储过程名来显示错误信息。

(2).创建存储过程的例子:

create or replace procedure myProc(id invarchar2)

is

begin

select ename from emp where empno=id;

end;

/

(3).执行存储过程:

存储过程的调用有以下三种方法:

a.PL/SQL中调用,如:

begin

myProc(7900);

end;

/

b.使用call来调用,如:

call myProc(7900);

c.通过execute调用,如:

execute myProc(7900);

注意:execute调用存储过程时,要么不带任何参数,要么只能是输入参数。

(4).带输出参数的存储过程:

create or replace procedure myProc2(id invarchar2, name out varchar2)

is

begin

select ename into name from emp where empno= id;

end;

/

带输出参数的存储过程不能使用execute来调用。

调用例子如下:

declare

tid varchar2(10);

tname varchar2(20);

begin

tid:=7900;

myProc2(tid, tname);                                 --调用带输出参数的存储过程

DBMS_output.put_line(‘ename=’ || tname);

end;

/