Oracle PL/SQL编程基础

Oracle PL/SQL编程基础


首先说一哈 PL/SQL 的优点有:

1、提高引用程序的运行性能。
2、提供模块化的程序设计功能
3、允许定义标识符。
4、具有过程语言控制结构
5、具备良好的兼容性
6、可以处理运行错误


oNE : PL/SQL 块

块(block)是 PL/SQL 的基本程序单元,块与块之间的嵌套没有限制。
三部分组成:
定义部分、执行部分和异常处理部分
1、定义部分:定义变量、常量、游标、异常等其他数据类型;
2、执行部分:用于实现应用模块功能。
3、异常处理部分:对执行过程中遇到的异常做出处理。

结构:

	declare 
	  /*定义部分*/
	 begin
	   /*执行部分*/
	 exception
	  /*异常处理部分*/ 
	 end;	--块结束标志
	 
	定义部分和异常处理部分可以不存在,只需要执行部分也可以 
	eg:
	 begin
		   /*执行部分*/
	 end;	--块结束标志

下面来一个案例看看

	declare 
	    retname varchar2(20);
	begin
	  select username into retname  from crTale_01 where id=&getid;
	  dbms_output.put_line('查询id账户的姓名为:'||retname);
	exception
	  when no_data_found then
	    dbms_output.put_line('查无此人');
	end;

tWO: PL/SQL 数据类型

我们在PL/SQL 块中定义部分 定义参数的时候我们就需要对每个参数指定数据类型,
在PL/SQL 中,数据类型有很多种 :标量类型、复合类型、参照类型 和LOB 类型等。我们可以通过下面的表格稍微了解点

标量类型

类型名解释
varchar2(n)定义可变长度的字符串,其中 n 指定字符串的最大长度
char(n)固定长度的字符串,n 最大长度,默认为1,一般我们用来定义性别参数这样的字符
number(n,m)定义固定长度的整数和浮点数,其中n指定数字的总长度,m指定小数位数;即(小数位数=m ; n=整数位数+m )
date日期和时间类型
timestamp同date,但是有点不同的是timestamp 类型时间数据显示日期、时间、上下午标志和时区
boolean布尔变量,其值可以为:true、false、null

属性类型

类型名解释
%type。。。。。
%rowtype。。。。。

复合类型

类型名解释
bfile。。。。。
blog。。。。。
clob。。。。。
nclob。。。。。

tHREE: PL/SQL 控制结构

条件分支语句

案例:


	declare 
	  uname  varchar2(30);
	  uwages number(11);
	  begin
	    select username ,wages into uname,uwages 
	    from crTale_01
	    inner join  crTale_02 
	    on crTale_01.Id=crTale_02.Id
	    where  crTale_01.Id=&uid;
	    if(uwages>15000) then
	    dbms_output.put_line(uname || '工资大于15000');
	    else 
	    dbms_output.put_line(uname || '工资小于15000');
	    end if;
	exception
	  when no_data_found then
	    dbms_output.put_line('查无此人');
	end;

	****************************************************
	declare 
	  uname  varchar2(30);
	  uwages number(11);
	  begin
	    select username ,wages into uname,uwages 
	    from crTale_01
	    inner join  crTale_02 
	    on crTale_01.Id=crTale_02.Id
	    where  crTale_01.Id=&uid;
	    if(uwages>15000) then
	    dbms_output.put_line(uname || '工资大于15000');
	    elsif (uwages<10000) then	--注意这里 “elsif”  不要写成“elseif” 了,还有“els”和“if”之间没有空格,是连在一起的。
	    dbms_output.put_line(uname || '工资小于10000');
	    else
	     dbms_output.put_line(uname || '工资介于10000-15000'); 
	    end if;
	exception
	  when no_data_found then
	    dbms_output.put_line('查无此人');
	end;

–case 语句基本用法

案例:

	declare
	   gnum number;
	begin
	  gnum:=&num;
	   case gnum
	     when 1 then
	         dbms_output.put_line('输入的数字是1');
	     when 2 then
	         dbms_output.put_line('输入的数字是2');
	     when 3 then
	         dbms_output.put_line('输入的数字是3');
	     else
	         dbms_output.put_line('输入的不合法');  
	   end case;      
	end;
	
	****************************************************
	--case 语句中使用多种条件
	
	declare
	 uwages number;
	begin
	  select wages into uwages 
	  from crTale_01 
	  inner join  crTale_02 
	  on crTale_01.Id=crTale_02.Id
	  where username=trim('&name');
	  case
	    when uwages<8500 then
	       dbms_output.put_line('工资低于 8500');
	    when uwages<15000 then
	       dbms_output.put_line('工资低于 15000 高于 8500');
	    when uwages<25000 then
	       dbms_output.put_line('工资低于 25000 高于 15000');
	    else
	      dbms_output.put_line('工资高于 25000');
	    end case;
	exception
	  when no_data_found then
	  dbms_output.put_line('查无此人');
	end;
–循环语句

–基本循环

	declare
	 i int :=1;
	 begin 
	   loop
	     dbms_output.put_line(i);
	     i:=i+1;
	     exit when i>10; --当 i 大于 10 时候退出循环
	   end loop;
	end;

– while 循环

	declare
	 i int :=1;
	begin
	  while i<=10 loop --当 i 大于 10 时候退出循环
	     dbms_output.put_line(i);
	     i:=i+1;
	     end loop;
	end;

– for 循环

	declare
	 i int :=1;
	begin
	  for i in 1..10 loop  --循环条件是 1 10 包括 10,每次自增 1
	   dbms_output.put_line(i);
	  end loop;
	end; 

–异常处理

案例

	declare
	retsex  char(2);
	retname varchar(20);
	begin
	  select username,sex into retname,retsex from crTale_01 where username=trim('&name');
	  dbms_output.put_line('姓名:'||retname);
	  dbms_output.put_line('性别:'||retsex);
	exception
	  when no_data_found then
	    dbms_output.put_line('查无此人');
	end;
–处理预定义异常

– 1、case_not_found
– 对应 ORA-06592 错误,在case 语句中,如果在when 子句中没有包含必须的条件分支,有没有else 子句,就会隐含触发该异常

– 2、cursor_already_open
– 对应 ORA-06511 错误,当打开已经打开的游标时,会隐含触发该异常。

– 3、invalid_number
– 对应 ORA-01722 错误,当不能有效的把字符转化为数字时,会隐含该触发异常。

– 4、too_many_rows
– 对应 ORA-01422 错误,当执行 select into 子句时,如果返回超过一行就会触发该异常。

– 5、zero_divide
– 对应 ORA-01476 错误,如果除数为 0 时,触发该异常。

– 6、no_data_found
– 对应 ORA-01403 错误,当执行select into 未返回行,或者引用了索引表未初始化元素时,会隐含该触发异常。

–处理自定义异常

案例

	declare
	 e_integerity exception;     --定义非预定义异常
	 e_no_employee exception;    --定义自定义异常
	 pragma exception_init(e_integerity,-2291);--关联非预定义异常
	 begin
	    update crTale_01 set username='您好啊'   where id=100;
	    if sql%notfound then 
	      raise e_no_employee;       --显示触发自定义异常
	    end if;
	exception 
	  when e_integerity then
	     dbms_output.put_line('查无此人1');
	   when e_no_employee then
	     dbms_output.put_line('查无此人2');
	end;

游标

使用 游标存放查询到的多条数据;

创建游标:

declare cursor 游标名[(参数列表)]
is
查询SQL语句[for update]
行变量  游标名%rowtype;
begin
 //使用游标(获取变量出来的游标中的数据)
end;

读取游标中的数据:

 fetch  游标名称 into 行变量    -- 注意:一行一行 提取,需要手动 的打开和关闭游标;    
 for 变量名  in 游标名 loop
 end loop;

使用游标的注意事项:
1.如果使用游标更新数据,sql语句后必须加上[for update], update/delete 语句后面必须加上[where current of 游标名]
2.在使用前一定要打开游标 open 游标名[(参数列表)],使用后 关闭:close 游标名;
案例:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值