Oracle数据库学习笔记之PLSQL

时间:2021-06-25 08:37:39
PL/SQL:一种程序语言 过程化SQL语言
PL/SQL注释符
单行注释 --
多行注释 /*  */
PL/SQL基本结构三个结构
(1)declare:声明
(2)begin :开始
(3)end:结束
Exception:程序异常处理
输出内容:
(1)dbms_output.put('');
(2)dbms_output.new_line;
(3)dbms_output.put_line('');






变量的声明在decalre中
变量名 数据类型 default 值;
赋值
变量名:=值;
使用查询语句给变量赋值
select 字段1,字段2...into 变量1,变量2.. from 表名 where 条件;
数据类型


基本类型变量:char,varchar2,date,number,boolean,long
变量名 数据类型:=值;
declare
 married varchar2(20):='aaaaa';
begin
 dbms_output.put_line(married);
end;


declare
 married varchar2(20);
begin
 married:='aaaaa';
 dbms_output.put_line(married);
end;
引用型变量:
变量名 表名.字段名%type;
declare
  v_name emp.ename%type;
  v_mgr  emp.mgr%type;
  v_sal  emp.sal%type;
begin
  select ename,mgr,sal into v_name,v_mgr,v_sal
  from emp where empno=7788;
  dbms_output.put_line(v_name||','||v_mgr||','||v_sal);
end;


记录变量:
变量名 表名%rowtype;
取值 变量名.字段名
注:只能反回一条记录结果
declare
  emp_row emp%rowtype;
begin
  select * into emp_row from emp where empno=7788;
  dbms_output.put_line(emp_row.ename);
  dbms_output.put_line(emp_row.deptno);
  dbms_output.put_line(emp_row.sal);
  dbms_output.put_line(emp_row.comm);
end;


table类型变量:相当于可变长度的一维数组
(1)先声明table类型
type 类型名 is table of 数据类型 index by BINARY_INTEGER;
(2)再声明table类型的变量
变量名  table类型名;
(3)赋值:变量名(index):=值
(4)取值  变量名(index)
index从1开始
例:
declare
 type table_index is table of varchar2(50)
 index by BINARY_INTEGER;
 --声明变量
 v_t table_index;
begin
  /*
  v_t(2):=1;
  v_t(3):=2;
  */
  select ename,job into v_t(1),v_t(2)
  from emp where empno=7788;  
  dbms_output.put_line(v_t(1)||','||v_t(2));
end;


PL/SQL算数运算符
+  -  *  /  **(指数/幂)
关系运算符
< <=  > >=  !=/<>  =
逻辑运算符
and   or   not
特殊运算符
is null/ is not null 判断对象是否为空
like  判断字符串是否与模糊匹配
between  and:值在两者之间
in(..):判断对象是否在列值中
注:空值null做算数运算或者比较运算时值都是null


PL/SQL分支结构 if
(1)if 条件 then 执行代码 end if;
(2)if 条件 then 执行代码 else 执行代码 end if;
(3)if 条件1 then 执行代码1 elsif 条件2 then 执行代码2 else 执行代码3 end if;


例:declare 
  v_sal emp.sal%type;
  v_sal1 emp.sal%type;
begin
  select sal into v_sal from emp where empno=7844;
  if v_sal>=3000 then
    v_sal1:=v_sal*0.08;
  elsif v_sal>=1500 then
        v_sal1:=v_sal*0.06;
  else
       v_sal1:=v_sal*0.04;
  end if;
  dbms_output.put_line('工资'||v_sal1);
  end;


分支结构case
case 变量
when 条件1 then 执行代码1
when 条件2 then 执行代码2
else 执行代码3
end case;

例:declare 
   v_job emp.job%type;
begin
  select job into v_job from emp where empno=7788;
  case v_job 
    when 'CLERK' then
        dbms_output.put_line('职员');
    when 'SALESMAN' then
        dbms_output.put_line('财务');
    when 'MANAGER' then
        dbms_output.put_line('经理');
    else
         dbms_output.put_line('没有匹配职务');
    end case;
  end;


搜索case结构  case没有选择变量,在when后做比较
   case 
when 判断条件 then 执行代码
else 执行代码
end case;


例:declare
  v_sal number;
begin
  select sal into v_sal from emp where empno=7844;
  case 
    when v_sal>=3000 then
        dbms_output.put_line('工资高');
    when v_sal>=2000 then 
         dbms_output.put_line('普通工资');
    else
        dbms_output.put_line('工资低');
    end case;
end;


循环结构
1.while 循环条件 loop
语句
end loop;
例:循环输出10以内偶数和
declare
   v_sum number:=0;
   v_temp number:=0;
begin
   while v_temp<=10 loop
     v_sum:=v_sum+v_temp;
     v_temp:=v_temp+2;
     end loop;
     dbms_output.put_line(v_sum);
end;


2.loop 
语句...
  exit when 循环条件
  end loop;
例:
declare
     v_sum number:=0;
     v_temp number:=1;
begin
    loop
       v_sum:=v_sum+v_temp**2;
       v_temp:=v_temp+2;   
    exit when v_temp=15;--结束循环条件
        v_temp:=v_temp+2; 
    end loop;
    dbms_output.put_line('和'||v_sum);
end;


3.for 变量 in 范围下限..范围上限 
  loop
  语句
  end loop;


例:输出1-10
declare  
i number:=1;
begin
for i in 1..10  loop
          dbms_output.put_line(i);
end loop;
end; 


二重循环
例:打印99乘法表
declare 
  i number:=1;
  j number:=1;
  str varchar2(50);
begin
  while i<=9 loop
        j:=1;
       while j<=i loop
        str:=i||'*'||j||'='||i*j;
         dbms_output.put(str||'   ');
         j:=j+1;
       end loop;--内层循环结束
       dbms_output.new_line;
       i:=i+1;
  end loop;--外层循环结束
end;