oracle数据库之PL/SQL程序结构(上)
最简单的PL/SQL程序
declare
begin
dbms_output.put_line(‘HelloWorld’);--注意是单引号
end;
/
这个是在dos窗口里所应该写的,但是在pl/sql工具里不需要/结束标志;
首先应该注意的是:
如果要在屏幕上输出信息,需要将serveroutput开关打开
setserveroutputon
那让我们首先了解一下什么是PL/SQL以及程序结构的组成
PL/SQL(ProcedureLanguage/SQL)
PLSQL是Oracle对sql语言的过程化扩展
指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。
SQL优点:交互式非过程化;数据操纵功能强;自动导航语句简单;调试容易使用方便。
PL/SQL程序结构
declare
说明部分(变量说明,光标申明,例外说明〕
begin
语句序列(DML语句〕…
exception
例外处理语句
End;
/
在这里提示一下pl/sql的注释是--或者用/**/
变量和常量的说明:
varlchar(15);--说明变量名、数据类型和长度后用分号结束说明语句。
marriedboolean:=true;--注意这里的赋值有什么区别
psalnumber(7,2);--表示psal最大有7位数,两位为小数
my_nameemp.ename%type;--表示myname类型为emp表中的ename的类型
emp_recemp%rowtype;--代表记录型变量,这是一整条记录
if语句的三种表达式:详情请看实例http://blog.****.net/liuxiaogangqq/article/details/8779447
1.IF条件THEN语句1;
语句2;
endif;
2.IF条件THEN语句序列1;
ESLE语句序列2;
ENDIF;
3.IF条件THEN语句;
ELSIF语句THEN语句;
ELSE语句;
ENDIF;
IF语句示例:
acceptnumprompt'请输入数字';--接收键盘输入的值会自动保存num的值
declare--声明
pnumnumber:=#--&代表取值pnum格式声明变量变量类型
begin
dbms_output.put_line(pnum);
end;
循环语句:
第一种:
WHILEtotal<=25000LOOP
...
total:=total+salary;
ENDLOOP;
第二种:
Loop
EXIT[when条件];
……
Endloop
第三种:
FORIIN1..3LOOP
语句序列;
ENDLOOP;
接下来讲一下重点的光标:
说明光标语法:
CURSOR光标名[(参数名数据类型[,参数名数据类型]...)]
ISSELECT语句;
用于存储一个查询返回的多行数据
打开光标:openc1;(打开光标执行查询)
取一行光标的值:fetchc1intopjob;(取一行到变量中)
关闭光标:closec1;(关闭游标释放资源)
注意:上面的pjob必须与emp表中的job列类型一致:
定义:pjobemp.job%type;
按员工的工种长工资,总裁1000元,经理长800元其,他人员长400元。
---隐式游标
declare--声明
emp_recemp%rowtype;--记录
begin
foremp_recin(select*fromemp)--in变量变量必须是游标
loop--循环的开始
dbms_output.put_line('员工名称:'||emp_rec.ename);
endloop;--循环的结束
end;
--带参数的游标
declare
cursorcl(pnonumber)isselect*fromempwhereempno=pno;--查询出所有的emp记录存储到cl游标中
begin
foremp_rowincl(7499)--打开游标(自动)检索数据(自动)关闭游标(自动)emp_row变量也不需要定义
loop
dbms_output.put_line(emp_row.ename);
endloop;
end;
例外
例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
Oracle的异常处理
系统定义例外
No_data_found(没有找到数据)
Too_many_rows(select…into语句匹配多个行)
Zero_Divide(被零除)
Value_error(算术或转换错误)
Timeout_on_resource(在等待资源时发生超时)
用户定义的例外
declare
no_dataexception;--设定一个例外名字
emp_rowemp%rowtype;--记录性变量
cursorcl(pnonumber)isselect*fromempwhereempno=pno;--定义游标pno查询emp中与员工号相等的数据
begin
opencl(0000);--为游标赋值
fetchclintoemp_row;--在cl中取出数据给emp_row
ifcl%notfoundthenraiseno_data;--在这里抛出例外判断语句
endif;
closecl;
exception--在这里捕获例外
whenno_datathen
dbms_output.put_line('没有找到数据');
end;