Oracle---PL/SQL的学习
阅读原文时间:2023年07月10日阅读:5

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;

  1. (思考):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;