Oracle的PL/SQL的学习记录(一)

57 阅读3分钟

PL/SQL 是 Oracle 数据库原生支持的语言,用于在数据库内部编写复杂的业务逻辑。
第一期先学习PL/SQL的一些基本语法:

  • 语法
  • 变量
  • 循环
  • 判断体
  • 游标
  • 异常

一、语法

[declare]
          变量声明;
begin
          DML/TCL操作;
[exception]
          例外处理;
end;
/

declare和exception可以被省略,其他不可省略;

二、变量

  • 数值型:NUMBER(n)
  • 字符串型:NVARCHAR2(n)
  • 表示表中某个字段的类型:%type
  • 表示表中所有字段的类型:%rowtype

示例:

1. 输出7369号员工姓名和工资,格式如下:7369号员工的姓名是SMITH,薪水是800,语法:使用表名.字段%type

declare
    --定义二个变量,分别装姓名和工资
    pename emp.ename%type;
    psal   emp.sal%type;
begin  
    --SQL语句
    --select ename,sal from emp where empno = 7369;
    --PLSQL语句,将ename的值放入pename变量中,sal的值放入psal变量中    
    select ename,sal into pename,psal from emp where empno = 7369;
    --输出
    dbms_output.put_line('7369号员工的姓名是'||pename||',薪水是'||psal);    
end;
/
  1. 输出7788号员工姓名和工资,格式如下:7788号员工的姓名是SMITH,薪水是3000,语法:使用表名%rowtype
declare
    emp_record emp%rowtype;
begin
    select * into emp_record from emp where empno = 7788;
    dbms_output.put_line('7788号员工的姓名是'||emp_record.ename||',薪水是'||emp_record.sal);
end;
/

三、循环

  • while循环
WHILE  total <= 25000  
LOOP
	     total : = total + salary;
END  LOOP;
  • loop循环(exit后条件成立了才推出循环)
Loop
       exit total > 25000;
       total := total + salary;
end loop;
  • for循环(步长只能为1,不能定义为其他值)
使用for循环显示20-30:
declare
    i number(2) := 20;
begin
    for i in 20 .. 30
    loop
        dbms_output.put_line(i);
    end loop;
end;
/

四、判断体

IF:

IF 条件
THEN 语句1;
语句2;
END IF;

IF-ELSE:

IF 条件
THEN 语句序列1;
ELSE 语句序列2;
END IF;

IF-ELSE IF-ELSE:

IF 条件一 
THEN 语句序列1;
ELSIF 条件二 
THEN 语句序列2;
ELSE 语句序列3;
END IF;

五、游标

查询的指针,只在查询时有效

  1. 有参游标:

使用带参光标cursor,查询10号部门的员工姓名和工资

declare
    cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
    pename emp.ename%type;
    psal emp.sal%type; 
begin 
    open cemp(&deptno);
    loop
        fetch cemp into pename,psal;	 
        exit when cemp%notfound;
        dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
    close cemp;
end;
/
  1. 无参游标:
    使用无参光标cursor,真正给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400,要求显示编号,姓名,职位,薪水
declare
    cursor cemp is select empno,ename,job,sal from emp;
    pempno emp.empno%type;
    pename emp.ename%type;
    pjob   emp.job%type;
    psal   emp.sal%type;
begin
    open cemp;
    loop
        fetch cemp into pempno,pename,pjob,psal;
        --循环退出条件一定要写
        exit when cemp%notfound;
        if pjob='ANALYST' 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;
    commit;
    close cemp;
end;
/

六、异常

  • 捕获异常
DECLARE 
   [省略]
BEGIN 
   [省略]
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
/

no_data_found是预定义的异常,可以直接使用。

  • 用户自定义异常
DECLARE 
   exception_name EXCEPTION; 
BEGIN 
   IF condition THEN 
      RAISE exception_name; 
   END IF; 
EXCEPTION 
   WHEN exception_name THEN 
   statement; 
END; 

引用资料

[1]www.w3ccoo.com/plsql/plsql…
[2]zhuanlan.zhihu.com/p/34288858