1.创建PL/SQL块的实例 编写PL/SQL程序实际就是编写PL/SQL块 记录2012-5-14 20:23
实例一:只包含执行部分的PL/SQL块
SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line('hello,everyone!');
3 end;
4 /
hello,everyone!
注意,当使用dbms_output包输出数据或消息时,必须要将SQL*Plus的环境变量serveroutputs设置为on
实例二:包含定义部分和执行部分的PL/SQL块
SQL> declare v_ename varchar2(5);
2 begin
3 select ename into v_ename from emp
4 where empno=&no;
5 dbms_output.put_line('雇员名:'||v_ename);
6 end;
7 /
输入 no 的值: 7788
原值 4: where empno=&no;
新值 4: where empno=7788;
雇员名:SCOTT
PL/SQL 过程已成功完成。
为了临时存放雇员名,就必须要定义变量。在上例中,&no为SQL*Plus的替代变量
实例三:包含定义部分、执行部分和例外处理部分的PL/SQL块
为了避免PL/SQL程序的运行错误,提高PL/SQL程序的健壮性,应该合理地处理PL/SQL程序的运行错误。
declare v_ename varchar2(5);
begin
select ename into v_ename from emp
where empno=&no;
dbms_output.put_line('雇员名:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('请输入正确的雇员号!');
end;
注:在存储过程中,select name into v_name from table where 条件的时候,如果没有查到数据,
就不能将V_name进行赋值,就会抛出no_data_found异常,程序不能继续执行
3.1.2 PL/SQL块分类
1.匿名块
SQL> declare v_avgsal number(6,2);
2 begin
3 select avg(sal) into v_avgsal from emp
4 where deptno=&no;
5 dbms_output.put_line('平均工资'|| v_avgsal);
6 end;
7 /
输入 no 的值: 10
原值 4: where deptno=&no;
新值 4: where deptno=10;
平均工资2916.67
PL/SQL 过程已成功完成。
注:因为该PL/SQL块直接以declare开始,没有给出任何名称,所以该PL//SQL块属于匿名块。
2.命名块
命名块是指具有特定名称标识的PL/SQL块,命名块与匿名块非常类似,只不过在PL/SQL块前使用<<>>加以标记。
3.子程序分为过程、函数、包
(1)创建函数
create function heji3(name varchar2)
return number is
salary number(7,2);
begin
select sal*12+nvl(comm,0) into salary from emp
where lower(ename)=lower(name);
end;
/
由于函数有输出参数,使用sql*plus绑定变量存放输出结果;
var income number
call heji3('scott') into :income;
print income
income
------
2400