PL/SQL编程

原创 2012年03月21日 18:07:51
 
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;

 


 


 

相关文章推荐

pl/sql编程简介

  • 2013年09月19日 17:27
  • 60KB
  • 下载

PL/SQL数据库编程知识

  • 2009年03月13日 20:01
  • 44KB
  • 下载

ORACLE PL/SQL编程之八:把触发器说透(写的太长了,建议没事的时候看,想快速查怎么用触发器的不要看)

把触发器说透    大家一定要评论呀,感谢!光发表就花了我将近一个下午。 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器...

PL/SQL编程之八-触发器

8.1 触发器类型   触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运...

PL/SQL存储过程编程

PL/SQL存储过程编程(上)  1. Oracle应用编辑方法概览  答:1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用;  2) ODBC  3) OCI: C...

ORACLE PL/SQL编程详解之四:把游标说透

本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理隐式游标 4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND的区别 4.1.4  使用游标更...
  • kana007
  • kana007
  • 2013年12月23日 10:44
  • 895

PL/SQL基础编程之(八) [视图、同义词、序列]

概念: 视图只是一个select语句,它是全逻辑的,非物理的。也称之为虚表。有安全、方便、一致性特点 案例1:创建视图 create or replace view myview as selec...

PL/SQL编程之七-包

7.1  程序包简介     程序包(PACKAGE,简称包)是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,作为一个完整的单元存储在数据库中,用名称来标识包。它具有面向对象...

oracle中pl/sql编程案例

pl/sql是oracle对标准数据库语言的扩展,是一种过程式语言,也是oracle的专用语言。 为了对pl/sql有更深的了解,举几个pl/sql的案例分享出来。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PL/SQL编程
举报原因:
原因补充:

(最多只允许输入30个字)