顺序结构,选择结构,循环结构,游标,函数,同义词,存储过程,触发器等等
2.SQL:结构化查询语言
数据定义语言|数据控制语言|事务控制语言|数据操纵语言
3.PL/SQL编程:是过程语言与结构化查询语言的结合。 4.PLSQL(Procedure Language/SQL)是Oracle对sql语言的过程化扩展,在SQL的命令语言中增加了过程处理语句,如分支,循环等,使SQL语言有过程处理能力 注意:SQL语言能实现的,PL/SQL也可以实现 二:PLSQL的组成部分:
工具PLSQL Developer 的Test Window创建模板或者在SQL Window编写,在PLSQL中是不区分大小写的
3个部分:声明部分,可执行代码块部分,异常处理部分
其中可执行代码块部分是必须的,其它2个部分可以不写。
语法:
declare
① 变量名 数据类型;--变量声明;
begin--可执行部分的开始
② 逻辑代码;
end;--可执行部分的结束
③异常处理部分
PL/SQL打印输出
Java打印输出
System.out.println("123");
oracle打印输出
begin
dbms_output.put_line('我是Oracle打印输出的结果');
end;
注意事项:PL/SQL编程中的语句必须放入begin...end语句块中
PL/SQL变量的使用
定义一个变量保存一个姓名,然后打印输出
declare
myname varchar2(100);
begin
--赋值 :=
myname:='刘邦';
dbms_output.put_line('myname = '||myname);
end;
SQL语言能实现的操作PL/SQL也能实现
查询7369的薪资 通过SQL语言实现
select sal from emp where empno = 7369;
重点:从某张表中查询到指定的结果然后into(赋值)给指定的变量名
语法:select ....into.....
通过PL/SQL编程查找7369的薪资 控制台打印输出
declare
--声明一个变量保存查找的薪资
mysal number;
begin
select sal into mysal from emp where empno = 7369;
--打印输出
dbms_output.put_line('薪水为: '||mysal);
end;
在使用变量的同时可以合二为一
declare
myempno number:=7369;
mysal number;
begin
select sal into mysal from emp where empno = myempno;
--打印输出
dbms_output.put_line('薪水为: '||mysal);
end;
oracle中的输入器 &
查找指定编号的薪资
declare myempno number(10):='&输入员工编号';--编号 mysal number(20); begin select sal into mysal from emp where empno = myempno; dbms_output.put_line(mysal); end;三:PL/SQL编程中的数据类型
标量类型:number,varchar2,date,boolean 大数据类型:LOB 存储二进制文件(图片,视频等等) 属性类型: %type %rowtype
%type 引用指定表中的指定字段的类型 %rowtype 引用指定表中的指定行的类型(类似java的对象)
查找7369的薪水,薪水类型不确定
declare myempno emp.empno%type:=7369;--假设empno是number类型 emp.empno%type = number mysal emp.sal%type; begin select sal into mysal from emp where empno = myempno; dbms_output.put_line(mysal); end;
查找7499的所有信息
declare myempno emp.empno%type:=7499; --根据行类型来定义一行的记录对象 myemp emp%rowtype; begin select * into myemp from emp where empno = myempno; dbms_output.put_line(myemp.empno||' '||myemp.ename||' '||myemp.sal); end;四:oracle中的选择结构:
if结构 case结构
定义一个变量保存一个数字,判断这个数字是否为偶数
declare
mynum number(10):='&请输入一个数字';
begin
if (mod(mynum,2) = 0) then
dbms_output.put_line('偶数');
else
dbms_output.put_line('奇数');
end if;--结束if语句
end;
大于3000 交税 等于3000继续努力 小于3000 回家挖田
select ename,decode(sign(sal - 3000),'1','交税','-1','回家挖田','0','继续努力') from emp;
通过IF实现 判断7369处于哪个级别
declare
myempno emp.empno%type:=7369;
mysal emp.sal%type;
begin
select sal into mysal from emp where empno = myempno;
--判断
if (mysal > 3000) then
dbms_output.put_line('交税');
elsif (mysal = 3000) then
dbms_output.put_line('继续努力');
elsif (mysal < 3000) then
dbms_output.put_line('回家挖田');
end if;
end;
case的使用
begin
case '&请输入'
when 'A' then dbms_output.put_line('优秀');
when 'B' then dbms_output.put_line('良好');
when 'C' then dbms_output.put_line('一般');
when 'D' then dbms_output.put_line('low');
else
dbms_output.put_line('鬼');
end case;
end;
五:PL/SQL循环结构:
loop
loop循环 (涉及到嵌套需要命名 结束循环)
while
while(true){}
for
for...in
注意:loop循环 (涉及到嵌套需要命名 结束循环)
打印输出1-100
declare
mynum number(20):=1;
begin
loop
dbms_output.put_line(mynum);
--递增+1
mynum:=mynum+1;
--满足条件就结束
exit when mynum = 101;
end loop;
end;
declare
mynum number(20):=0;
begin
loop
dbms_output.put_line(mynum);
--满足条件就结束
exit when mynum = 100;
--递增+1
mynum:=mynum+2;
end loop;
end;
1-100的和
declare mynum number(10):=1; mysum number(10):=0; begin <> loop mysum:=mysum+mynum; mynum:=mynum+1; exit myloop when mynum = 101; end loop; dbms_output.put_line(mysum); end;
1-100的偶数和
declare mynum number(10):=1; mysum number(10):=0; begin <> loop if (mod(mynum,2) = 0) then mysum:=mysum+mynum; end if; mynum:=mynum+1; exit myloop when mynum = 101; end loop; dbms_output.put_line(mysum); end;
使用while循环输出1-100
declare
mynum number(10):=1;
begin
while (mynum <= 100) loop
dbms_output.put_line(mynum);
mynum:=mynum + 1;
end loop;
end;
使用for循环输出1-100的和
begin
for i in 1..100 loop
dbms_output.put_line(i);
end loop;
end;
declare
mysum number(10):=0;
begin
for i in 1..100 loop
if(mod(i,2)=0) then
mysum:=mysum+i;
end if;
end loop;
dbms_output.put_line(mysum);
end;
六:异常处理
异常(Exception)处理:当给定的语句执行后,如果找不到数据或者结果以预期的结果不匹配(行数)plsql中提供了2中预设义异常:数据未找到异常,行太多异常
1.数据未找到异常(no_data_found):提供的字段在数据表中查找不到
2.行太多异常(too_many_rows):匹配的结果过多。
3.try...catch(){}
打印输出250的薪水
declare
myempno emp.empno%type:=250;
mysal emp.sal%type;
begin
select sal into mysal from emp where empno = myempno;
dbms_output.put_line(mysal);
--异常处理部分
exception
when no_data_found then
dbms_output.put_line('提供的编号不存在');
end;
declare
mysal emp.sal%type;
begin
select sal into mysal from emp;
dbms_output.put_line(mysal);
--异常处理部分
exception
when too_many_rows then
dbms_output.put_line('行太多异常');
end;
同时处理多个异常
declare
mysal emp.sal%type;
begin
select sal into mysal from emp;
dbms_output.put_line(mysal);
--异常处理部分
exception
when too_many_rows then
dbms_output.put_line('行太多异常');
when no_data_found then
dbms_output.put_line('提供的编号不存在');
end;
重点:
自定义异常 exception 定义异常 raise 抛出异常
步骤
1.声明 异常名称 exception;
2.抛出 raise 异常名称;
3.捕捉 excetpion when 异常名称 then 输出异常结果提示;
判断一个年龄是否在指定的区间(18-36)
declare
myAgeException exception; --自己定义异常
myAge number(20):=45;
begin
if (myAge < 20 or myAge > 36) then
raise myAgeException;
else
dbms_output.put_line('年龄为: '||myAge);
end if;
--捕捉异常
exception
when myAgeException then
dbms_output.put_line('年龄不在指定的范围内');
end;
七:函数
函数就是方法 方法就是函数
方法的核心:封装代码,方便调用
语法: create [or replace] function 函数名称[(参数1,参数2,....)] return 结果类型 is|as 声明部分不需要使用declare去定义 begin 语句块; end;
封装求和的方法 1-10 1-100 1-1000
create or replace function returnSum(mynum number)
return number is
mysum number:=0;--保存和
begin
for i in 1..mynum loop
mysum:=mysum+i;
end loop;
return mysum;
end;
--调用
select returnSum(100) from dual;
封装一个函数 根据指定的编号查找对应的工资
create or replace function getSalByEmpno(myempno emp.empno%type) return emp.sal%type is mysal emp.sal%type; begin select sal into mysal from emp where empno = myempno; return mysal; end; --调用 select getSalByEmpno(7369) from dual;



