PL/SQL编程

 
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;

 


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值