一、什么是PL/SQL?
PL/SQL直接翻译就是过程语言的sql,就是将编程语言中的语句放到数据库层面来执行,是oracle数据库对sql语言的过程化扩展,使sql语言具有了过程化处理的能力。
二、PL/SQL的程序结构?
declare
说明部分(变量说明、光标说明、例外说明)
begin
语句序列(DML语句)
exception
例外处理语句
end;
/
1、说明部分
基本变量类型:char,varchar2,data,number,boolean,long
declare pnumber number(7,2); pname varchar2(20); pdate date; begin pnumber:=12; pname:='张三'; pdate:=sysdate; dbms_output.put_line(pnumber); dbms_output.put_line(pname); dbms_output.put_line(pdate+1); end; /
引用型变量:
eg: my_yhdm acl_user.yhdm%type;
declare pxm acl_user.xm%type; psfzh acl_user.sfzmhm%type; begin select xm,sfzmhm into pxm,psfzh from acl_user where yhdm = '106030'; dbms_output.put_line(pxm||','||psfzh); end; /
记录型变量:
eg: user_rec acl_user%rowtype;
declare user_rec acl_user%rowtype; begin select * into user_rec from acl_user where yhdm = '106090'; dbms_output.put_line(user_rec.xm||','||user_rec.sfzmhm); end; /
2、if 语句
set serveroutput on accept num prompt'请输入一个数字'; declare pnum number:=# begin if pnum = 1 then dbms_output.put_line('输入的是1'); elsif pnum=2 then dbms_output.put_line('输入的是2'); elsif pnum=3 then dbms_output.put_line('输入的是3'); else dbms_output.put_line('输入的是其他数字'); end if; end; /
3、循环语句
--while循环 declare pnum number :=1; begin while pnum <=10 loop dbms_output.put_line(pnum); pnum:=pnum+1; end loop; end; /
--loop循环(推荐使用,控制光标方便) set serveroutput on declare pnum number :=1; begin loop exit when pnum>10; dbms_output.put_line(pnum); pnum:=pnum+1; end loop; end; /
--for循环 set serveroutput on declare pnum number:=1; begin for pnum in 1..10 loop dbms_output.put_line(pnum); end loop; end; /
三、PL/SQL游标
游标就是一个结果集(Result Set)
eg:定义游标:cursor c1 is select yhdm from acl_user;
打开游标:open c1;
使用游标:fetch c1 into pyhdm;
关闭游标:close c1;
--游标的使用 set serveroutput on declare --定义一个游标 cursor cuser is select xm,sfzmhm from acl_user; --定义游标对应的变量 pxm acl_user.xm%type; psfzmhm acl_user.sfzmhm%type; begin --打开游标 open cuser; loop fetch cuser into pxm,psfzmhm; exit when cuser%notfound; dbms_output.put_line(pxm||','||psfzmhm); end loop; --关闭游标 close cuser; end; /
--游标的使用 set serveroutput on declare --定义一个游标 cursor cuser is select yhdm,qsip,zzip from acl_user; --定义游标对应的变量 pyhdm acl_user.yhdm%type; pqsip acl_user.qsip%type; pzzip acl_user.zzip%type; begin --打开游标 open cuser; loop fetch cuser into pyhdm,pqsip,pzzip; exit when cuser%notfound; if pqsip is null then update acl_user set zzip = '18330108506' where yhdm = pyhdm; end if; end loop; --关闭游标 close cuser; --提交 commit; end;