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;