Oracle 11g学习笔记-5(流程控制语句、PL SQL游标、PL SQL异常处理)

流程控制语句

1-声明三个变量,初始值 分别为1,2,3,然后输出三个值的平均值、三个值的最大值。declare…begin…end
在这里插入图片描述
2-number(7) number(7,2) 举例说明区别
在这里插入图片描述
3-字符类型主要包括哪些?
字符类型主要包括varchar2、char、long、nchar和nvarchar2等。
char(m) m<32767 有默认值1
VARCHAR2(m) m为字符串的最大长度,m<32767,比较节省空间
CHAR(m) m为字符串的最大长度,m<32767,有默认值1,长度不足32767的位数由空格补全,占用空间.
LONG 最大长度可达2G,基本上所有字符串都可以用LONG定义

4-列举基本数据类型和三种特殊数据类型
基本数据类型:
(1)数值类型:number、pls_integer和binary_integer;
(2)字符类型:varchar2、char、long、nchar和nvarchar2等。
(3)日期类型:date
(4)布尔类型:boolean

特殊数据类型:
(1)%type类型:使用%TYPE关键字可以声明一个与指定列名称相同的数据类型,它通常紧跟在指定列名的后面。
如v_job emp.job%type;

(2)RECORD类型:多个变量的集合
type emp_record is record(
v1 varchar2,
v2 number
);

(3)%ROWTYPE类型:%ROWTYPE类型的变量结合了%TYPE类型和RECORD类型变量的优点,可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据。语法如下所示:
rowVar_name table_name%rowtype;

5-使用%type定义 v_name v_job 查询emp的ename和job 并赋值给v_name和v_job 并打印值…decalare…begin…end
在这里插入图片描述
6-使用record重写题目5的代码和题目1的代码。
在这里插入图片描述
7-使用%rowtype重写题目5的代码和题目1的代码。
在这里插入图片描述
在这里插入图片描述
8-输入a的值 输入b的值 计算c的值(a+b) declare…begin…exception…end

SQL> declare
  2   a int;
  3   b int;
  4   c number;
  5  begin
  6    dbms_output.put_line('请输入a的值:');
  7    a:= &a;
  8    dbms_output.put_line('请输入b的值:');
  9    b:=&b;
 10    c:=(a+b)/(a-b);
 11    dbms_output.put_line(c);
 12  exception
 13    when zero_divide then
 14      dbms_output.put_line('除数不能为零!!!');
 15    end;
 16  /

在这里插入图片描述
9-if 比较字符串大小并输出结果

SQL>  declare
  2      v_name1 varchar2(50);
  3      v_name2 varchar2(50);
  4     begin
  5      v_name1:='hello';
  6      v_name2:='hello,word';
  7      if length(v_name1) <= length(v_name2)
  8        then
  9          dbms_output.put_line('字符串'||v_name1||'的长度小等于'||v_name2||'的长度。');
 10       end if;
 11     end;
 12  /
         

10-if …elsif…then…比较字符串大小并输出结果

SQL> declare
  2   v_name1 varchar2(50);
  3   v_name2 varchar2(50);
  4  begin
  5   v_name1:='hello';
  6   v_name2:='hello,word';
  7   if length(v_name1) < length(v_name2)
  8     then
  9       dbms_output.put_line('字符串'||v_name1||'的长度小于'||v_name2||'的长度。');
 10     elsif length(v_name1) < length(v_name2)
 11     then
 12       dbms_output.put_line('字符串'||v_name1||'的长度大于'||v_name2||'的长度。');
 13       elsif length(v_name1) = length(v_name2)
 14       then
 15        dbms_output.put_line('字符串'||v_name1||'的长度等于'||v_name2||'的长度。');
 16        end if;
 17  end;
 18  /

11-if …elsif…then…判断你的年纪是否为90后并输出结果(录入出身年与1990比较)

SQL> declare
  2   age int;
  3   v_nyear int;
  4   v_year int;
  5  begin
  6
  7       dbms_output.put_line('请输入年龄:');
  8       age:=&age;
  9        select extract(year from sysdate) into v_nyear from dual;
 10       v_year:=v_nyear-age;
 11       dbms_output.put_line('您的出生年份是:'||v_year);
 12  if v_year>= 1990 then
 13    dbms_output.put_line('您是90后!');
 14    elsif v_year< 1990 then
 15       dbms_output.put_line('您不是90后!');
 16    end if;
 17  end;
 18  /

12-loop…exit when…end loop与while…loop…end loop;
区别是什么?

loop…exit when…end loop 先执行后判断;
while…loop…end loop 先判断后执行。

13-分别用
loop…exit when…end loop;
while…loop…end loop;
for…in…loop…end loop;
写代码计算:循环200次时,跳出循环…

SQL> declare
  2   sum_i int:=0;
  3   i int:=0;
  4  begin
  5    loop
  6      i:=i+1;
  7      sum_i:=sum_i+i;
  8      exit when i=200;
  9    end loop;
 10    dbms_output.put_line(sum_i);
 11  end;
 12  /
SQL> declare
  2   sum_i int:=0;
  3   i int:=0;
  4  begin
  5    while i<200 loop
  6      i:=i+1;
  7      sum_i:=sum_i+i;
  8    end loop;
  9    dbms_output.put_line(sum_i);
 10  end;
 11  /
SQL> declare
  2   sum_i int:=0;
  3   i int:=0;
  4  begin
  5   for i in 1..200 loop
  6      sum_i:=sum_i+i;
  7    end loop;
  8    dbms_output.put_line(sum_i);
  9  end;
 10  /

14-case…when.then…else…end case;请用代码说明函数用法.

SQL> declare
  2   season int;
  3   aboutinfo varchar2(50);
  4  begin
  5    season:=&season;
  6   case season  //case 选择器
  7     when 1 then  
  8       aboutinfo:=season||'季度包括1、2、3月份'; //when 子句
  9     when 2 then
 10       aboutinfo:=season||'季度包括4、5、6月份';
 11     when 3 then
 12       aboutinfo:=season||'季度包括7、8、9月份';
 13     when 4 then
 14       aboutinfo:=season||'季度包括10、11、12月份';
 15     else
 16       aboutinfo:=season||'季度不合法!';
 17     end case;
 18    dbms_output.put_line(aboutinfo);
 19  end;
 20  /

PL SQL游标

15-显式游标代码-emp查询。

SQL> declare
  2    cursor cur_emp(var_job varchar2:='SALESMAN') is select empno,ename,sal from emp where job=var_job;//创建游标
  3     type record_emp is record   //申明一个记录变量
  4     (
  5     var_empno emp.empno%type,
  6     var_ename emp.ename%type,
  7     var_sal emp.sal%type
  8     );
  9     emp_row record_emp;
 10  begin
 11     open cur_emp;  //打开游标
 12     fetch cur_emp into emp_row;  //读取游标中数据
 13     while cur_emp%found loop   //讲数据存储在记录变量里
 14       dbms_output.put_line(emp_row.var_ename||'的编号是:'||emp_row.var_empno||',的工资是:'||emp_row.var_sal);
 15       fetch cur_emp into emp_row; //游标指向下一行
 16       end loop;
 17       close cur_emp;  //关闭游标
 18  end;
 19  /

16-隐式游标代码-工资上调。

begin
  update emp set sal=sal*(1+0.2) where job = 'SALESMAN';
  if sql%notfound then
    dbms_output.put_line('没有员工工资上调');
  else
    dbms_output.put_line('有'||sql%rowcount||'个员工的工资上调20%');
  end if;
end;

PL SQL异常处理

17-系统预定义异常有哪些?列举其中2个的例子代码说明…

// value_error 异常
declare
  v_vara varchar2(1);
  v_varb varchar2(4):='java';
begin
  v_vara:=v_varb;
exception
  when value_error then 
    dbms_output.put_line('赋值错误!');
end;
//zero_divide异常
declare
  a number:=10;
  b number:=0;
  c number;
begin
  c:=a/b;
exception
  when zero_divide then 
    dbms_output.put_line('被除数不能为零');
end;

18-用代码解释自定义异常用法…

//自定义text_exp异常
declare
  a number:=1;
  b number:=2;
  test_exp exception;
begin
  if a<b then
  raise test_exp;
  end if;
exception
  when test_exp then 
    dbms_output.put_line('异常');
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值