pl/sql基础入门之代码块
pl/sql:过程语言(procedure language)和结构化语言(structured query language)结合而成的语言,是对sql的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与oracle服务器和oracle工具紧密集成,具有可移植性,灵活性和安全性。
优点:
1. 支持sql,可以使用:dml,dcl,游标控制和sql运算符
2. 支持面向对象(oop)。
3. 与sql紧密集成,简化数据处理,支持所有的数据类型,支持null,支持%type和%rowtype
4. 可以通过存储过程限制用户对数据的访问,提高安全性。
–变量的声明:常用:varchar2,number,%rowtype,%type
select *from emp; declare v_name varchar2(20) :='&姓名:';--varchar2类型的声明 v_ename emp.ename%type;--与emp表中的额ename字段的类型一致 v_emp_rec emp%rowtype; --与emp一行数据的类型一致 v_age number;-- number类型 begin v_age :='&年龄:'; select ename into v_ename from emp where empno =7369; select * into v_emp_rec from emp where empno =7369; dbms_output.put_line(v_ename); dbms_output.put_line(v_emp_rec.job); end;
—
条件控制
(if)
关键字
:if then elsif else end if;
declare v_age number :='&请输入年龄:';--注意:声明变量时要制定变量类型,'&请输入年龄'结尾不能加英文':' begin if v_age <18 then dbms_output.put_line(v_age||'岁,青少年!');-- '||'为字符串连接符,相当于java中的'+' elsif v_age <35 then--注意是elsif,不是elseif dbms_output.put_line(v_age||'岁,壮年!'); else dbms_output.put_line(v_age||'岁,过了壮年!'); end if;--注意end if不能忘了,啥事善始善终哦 end;
—
条件控制
(case)
,关键字
:case
when then else end case;
declare v_grade varchar2(2); begin v_grade :='&请输入等级:'; case v_grade when 'a' then dbms_output.put_line('优秀'); --语法:when ... then ...; when 'b' then dbms_output.put_line('良好'); -- when ... then ...; when 'c' then dbms_output.put_line('一般');-- when ... then ...; else dbms_output.put_line('较差');-- else 相当于java中的default end case; --注意结尾, end case end;
—
循环控制
loop
,关键字:
loop
exit when end loop
declare v_times number; v_currenttime number :=1; begin v_times :='&输入打印helloworld的次数:'; loop dbms_output.put_line('helloworld!'); v_currenttime := v_currenttime +1 ;--在这里java中 +=不能用 exit when v_currenttime > v_times; end loop; end;
—
循环控制
while
,关键字
:while
loop end loop
declare v_count number :=1; begin while v_count <=7 loop dbms_output.put_line(v_count); v_count := v_count +1; end loop; end;
—循环控制 for,关键字:for in reverse loop end loop
declare begin for num in 1..5 loop dbms_output.put(num);--不想换行的话,就用put,但控制台不会显示输出结果 end loop; dbms_output.new_line();--换行后才显示以前不换行的输出结果 for num in reverse 1..5 loop dbms_output.put(num); end loop; dbms_output.new_line();--此处写成大写,oracle里面好像是不区分大小写的 end;
— for
循环练习乘法口诀表
declare begin for i in 1..9 loop--每一个for循环必须配套一个loop end loop for j in 1..i loop dbms_output.put(i||'*'||j||'='||i*j||' '); end loop; dbms_output.new_line;--注意,括号可以不要,但规范写法不在这么写 end loop; end;
—顺序控制,关键字:goto null
declare v_age number :='&输入年龄:'; begin if v_age <18 then goto young;--跳到<<young>>,按顺序往后执行 elsif v_age <30 then goto strong;--跳到<<strong>>,按顺序往后执行 else goto older;--跳到<<older>>,按顺序往后执行 end if; <<young>> null; <<strong>> dbms_output.put_line('strong'); <<older>> dbms_output.put_line('older'); end;
—
动态执行
sql
语句,关键字:
execute immediate
declare v_sql varchar2(222); v_emp_rec emp%rowtype; begin v_sql :='select * from emp where empno =: num';--'=:'为占位符,标示符不能用关键字,如number execute immediate v_sql into v_emp_rec using 7369;--给占位符绑定值 dbms_output.put_line(v_emp_rec.ename); end;
—异常,预定义异常,关键字 exception when then
declare v_emp emp%rowtype; v_sql varchar2(200); v_ename emp.ename%type; begin v_sql :='select * from emp'; execute immediate v_sql into v_emp; --v_sql := 'select ename from emp where empno = 7396'; --execute immediate v_sql into v_ename; exception when too_many_rows then -- too_many_rows为异常类型,还有一个data dbms_output.put_line('太多行了!'); --when data_not_found then --dbms_output.out_line('没有找到!'); end;
—异常,自定义异常,关键字:exception raise
declare v_ageexception exception;--异常类型 exception v_age number :='&年龄:'; begin if v_age >120 then raise v_ageexception;--满足条件时,raise抛出异常 else dbms_output.put_line(v_age); end if; exception when v_ageexception then dbms_output.put_line('年龄太大了!'); end;