PL/SQL编程
我们来简单的学习一下PL/SQL程序结构及组成和它的应用
目的是写成:根据job的不同来增长不同的工资
一 来简单了解一下PL/SQL的第一个实例吧!
第一个pl/sql语句 输出hello
在写下面的语句之前要先执行:set serveroutput on
SQL> set serveroutput on;
SQL> declare
2 begin
3 dbms_output.put_line('hello 老王');
4 end
5 ;
6 /
hello 老王
二 和java一样,先看看if else在PL/SQL中是怎么写的吧!
If else语句第一种方式
SQL> declare
2 pnum number:=10;
3 begin
4 if pnum>10 then
5 dbms_output.put_line('变量值大于10');
6 dbms_output.put_line('变量小于等于10');
7 end if;
8 end;
9 /
变量值大于10
变量小于等于10
第一种方法会把所有符合条件的语句都输出,如果有多个dbms_output.put_line('变量小于等于10');
第二种方式:
SQL> declare
2 pnum number:=10;
3 begin
4 if pnum>10 then
5 dbms_output.put_line('变量值大于10');
6 elsif pnum=10 then
7 dbms_output.put_line('变量小于等于10');
8 end if;
9 end;
10 /
变量小于等于10
第三种方法:
SQL> declare
2 pnum number:=10;
3 begin
4 if pnum>10 then
5 dbms_output.put_line('变量值大于10');
6 elsif pnum=10 then
7 dbms_output.put_line('变量小于等于10');
8 else
9 dbms_output.put_line('变量小于10');
10 end if;
11 end;
12 /
变量小于等于10
来看一个if else的小实例吧!从键盘输入值并接收
先执行accept nums prompt '请输入值';
SQL> accept nums prompt '请输入值';
在执行一下的这些语句来判断
SQL> declare
2 pnum number :=&nums;
3 begin
4 if pnum>10 then
5 dbms_output.put_line('变量值大于10');
6 elsif pnum=10 then
7 dbms_output.put_line('变量等于10');
8 else
9 dbms_output.put_line('变量小于10');
10 end if;
11 end;
12 /
变量小于10
或者直接执行一下的语句,从键盘输入 / 也可以
SQL> declare
2 pnum number :=&nums;
3 begin
4 if pnum>10 then
5 dbms_output.put_line('变量值大于10');
6 elsif pnum=10 then
7 dbms_output.put_line('变量等于10');
8 else
9 dbms_output.put_line('变量小于10');
10 end if;
11 end;
12 /
变量小于10
注:不可以写 pnum
dbms_output.put_line('变量小于10'+pnum);不能输出
三 循环方式是不可少的吧!
第一种:while循环
declare
num number:=10;
begin
while num>=1
loop
dbms_output.put_line(num);
num:=num-1;
end loop;
end;
第二种:for循环的方式
declare
num number:=1;
begin
for num in 1..10
loop
dbms_output.put_line(num);
end loop;
end;
第三种:exit的循环方式
declare
num number:=1;
begin
loop
exit when num>10; //停止的条件
dbms_output.put_line(num);
num:=num+1;
end loop;
end;
exit的倒叙
declare
num number:=10;
begin
loop
exit when num<0;
dbms_output.put_line(num);
num:=num-1;
end loop;
end;
以前的更新时这么写的:
更新
SQL> update emp set sal=(
2 case job when 'PRESIDENT'then sal+1000
3 when 'MANGER'then sal+800
4 else sal+400
5 end);
14 rows updated
学习了新知识,来练练吧!
根据job的不同提升的工资不同,如果用一下的第一个方法的结果是把所有的工资都增加了1000,所以要用第二种方法
第一种:
declare
emp_job emp.job%type;
begin
select job into emp_job from emp where empno=7369;
if emp_job='PRESIDENT' then update emp set sal= sal+1000;
elsif emp_job='MANAGER' then update emp set sal = sal+800;
else update emp set sal = sal+400;
end if;
end;
在学习第二种方法之前我们要用到光标来存储查询的多个值,并且把值放到光标中,一下是对光标的详解
光标的使用
declare
--定义光标查询job岗位
cursor cl is select job from emp;
--声明一个变量 此变量与emp表中的job字段的类型一致
emp_job emp.job%type;
begin
--打开光标
open cl;
--循环开始
loop
--取出一个光标
fetch cl into emp_job;
exit when cl%notfound;--判断光标是否存在,如果存在执行
dbms_output.put_line(emp_job);
end loop;--退出循环
close cl;--关闭关闭
end;--结束
执行的结果为:
SQL> declare
2 cursor cl is select job from emp;
3 emp_job emp.job%type;
4 begin
5 open cl;
6 loop
7 fetch cl into emp_job;
8 exit when cl%notfound;
9 dbms_output.put_line(emp_job);
10 end loop;
11 close cl;
12 end;
13 /
CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
PL/SQL procedure successfully completed
我们来做:根据job的不同增加的工资也不同,用到光标,循环,if语句
首先来查询没有更新的的emp表
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 2000.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 2800.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 2450.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 4575.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 2450.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 4450.00 30
7782 CLARK MANAGER 7839 1981-6-9 4050.00 10
7788 SCOTT ANALYST 7566 1987-4-19 4200.00 20
7839 KING PRESIDENT 1981-11-17 7400.00 10
7844 TURNER SALESMAN 7698 1981-9-8 2700.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 2300.00 20
7900 JAMES CLERK 7698 1981-12-3 2150.00 30
7902 FORD ANALYST 7566 1981-12-3 4200.00 20
7934 MILLER CLERK 7782 1982-1-23 2500.00 10
14 rows selected
我们来写更新的语句
SQL>
SQL> declare
2 cursor cl is select empno,job from emp;
3 emp_job emp.job%type;
4 emp_empno emp.empno%type;
5 begin
6 open cl;
7 loop
8 fetch cl into emp_empno,emp_job;
9 exit when cl%notfound;
10 if emp_job='PRESIDENT' then update emp set sal = sal +1000 where empno=emp_empno;
11 elsif emp_job='MANAGER' then update emp set sal = sal +800 where empno=emp_empno;
12 else update emp set sal=sal+400 where empno=emp_empno;
13 end if;
14 end loop;
15 close cl;
16 end;
17 /
PL/SQL procedure successfully completed
好,我们已经更新了,再次查一下来对比一下吧!
SQL> ed
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 2400.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 3200.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 2850.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 5375.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 2850.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 5250.00 30
7782 CLARK MANAGER 7839 1981-6-9 4850.00 10
7788 SCOTT ANALYST 7566 1987-4-19 4600.00 20
7839 KING PRESIDENT 1981-11-17 8400.00 10
7844 TURNER SALESMAN 7698 1981-9-8 3100.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 2700.00 20
7900 JAMES CLERK 7698 1981-12-3 2550.00 30
7902 FORD ANALYST 7566 1981-12-3 4600.00 20
7934 MILLER CLERK 7782 1982-1-23 2900.00 10
14 rows selected
或:
declare
cursor cl is select empno ,job from emp;
pno emp.empno%type;
pjob emp.job%type;
begin
open cl;
fetch cl into pno ,pjob;
update emp set sal=(case pjob when 'PRESIDENT' then sal+1000 when 'MANAGER' then sal+800 else sal+400 end);
close cl;
end;