Oracle---PL/SQL的学习

PL/SQL程序

一.定义

declare

  说明部分

  begin

    语句序列(DML语句)

  exception

    例外处理语句

  end;

二. 变量和常量说明

a) 说明变量(char,varchar2,date,number,boolean,long)

  varl char(15);

  married boolean :=true;

  psal number(7,2);

  my_name emp.ename%type;引用型变量,my_name的类型与emp表中的ename列的类型一样

  emp_rec emp%rowtype;记录型变量(一行的类型,是一个数组)

b) 记录变量分量的引用:

  emp_rec.ename := ‘adams’;(数组中的某一列)

 

例子:

declare

  --定义记录型变量:代表一行

  emp_rec emp%rowtype;

begin

  select * into emp_rec from emp where empno=7839;

  dbms_output.put_line(emp_rec.ename ||’的薪水是’||emp_rec.sal);

end;

 

  c)定义常量   加个关键字

varl  constant  char(15);

 

三. IF语句

1.

  IF 条件 THEN 语句1;

  语句2

  END IF; 

2. 

  IF 条件THEN 语句序列1;

  ELSE 语句序列2;

  END IF;

3.

  IF 条件 THEN 语句;

  ELSIF 语句 THEN 语句;

  ELSE 语句;

  END IF;

 

  if 条件  then 语句

  elsif 条件 then 语句

  elsif 条件 then 语句

四. 循环语句

1. WHILE循环

while total <=25000

loop

.....

total :=total + salary;

end loop;

2. for in 循环

  FOR xxx  IN 1..3

  LOOP

  语句序列;

  END LOOP;

 

例子:

 

--打印1~10

set serveroutput on ;

 

declare

  pnum number := 1;

begin

  loop

    --退出条件

    exit when pnum > 10;

    DBMS_OUTPUT.PUT_LINE(pnum);

    -- 1

    pnum := pnum + 1;

    end loop;

end;

五.光标

--查询并打印员工的姓名和薪水
/*
1. 光标的属性:
  %isopen     %rowcount (影响的行数)
  %found      %notfound

2. 默认,一个会话中只能打开300个光标
SQL> show parameter cursor

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- -----------
cursor_sharing                       string                           FORCE
cursor_space_for_time                boolean                          FALSE
open_cursors                         integer                          300
session_cached_cursors               integer                          20

修改: alter system set open_cursors=400;

3. (思考):cursor_sharing 什么作用?---> 性能优化
      EXACT(默认), FORCE, SIMILAR

*/
set serveroutput on

declare
  --定义光标
  cursor cemp is select ename,sal from emp;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --打开光标
  open cemp;

  loop
    --取一条记录
    fetch cemp into pename,psal;
    --退出条件
    --exit when 没有取到记录;
    exit when cemp%notfound;

    dbms_output.put_line(pename||'的薪水是'||psal);

  end loop;
  
  --关闭光标
  close cemp;
end;

  涨工资例子:

--涨工资,总裁1000 经理800 其他400
set serveroutput on

declare 
  --alter table "SCOTT"."EMP" rename column "JOB" to empjob
  cursor cemp is select empno,empjob from emp;
  pempno emp.empno%type;
  pjob   emp.empjob%type;
begin
  rollback;

  open cemp;
  loop
    --取一条记录
    fetch cemp into pempno,pjob;
    exit when cemp%notfound;
    
    --判断职位
    if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
      elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;
      else update emp set sal=sal+400 where empno=pempno;
    end if;
    
  end loop;
  close cemp;
  
  --why?  ---> ACID
  commit;
  
  dbms_output.put_line('完成');
end;

猜你喜欢

转载自www.cnblogs.com/lingtiaoti/p/9919630.html