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