2018-08-31-Oracle学习第五天

1、--异常处理(了解)

-- 也就是,当发现有异常出现,则捕获提示。

-- 预定义的 Oracle 异常,有异常名,有错误代码,有异常信息。

-- 非预定义的 Oracle 异常,有错误代码,有异常信息,但是没有异常名字。

-- 在实际开发中,我们的异常处理,一般情况下都是需要使用 Java 代码方式来处理。

-- 因为我们学习的 Java 语言是面向对象的

-- Oracle 数据库其实是一个关系型数据库,如果要操作的话,太麻烦了。

-- C 面向过程:步骤需要详细到每一步,所有的资源释放都要自己来。

-- Java 面向对象:所有的业务逻辑,交给对应的对象去执行。

eg:

--异常test

declare

  vid tb_student.id%type;

  vname tb_student.name%type;

begin

  select id,name into vid,vname

    from tb_student

    where id=3;

  dbms_output.put_line('vid 的值:' || vid );

  dbms_output.put_line('vname 的值:' || vname );

  exception

    when too_many_rows then

        dbms_output.put_line('返回数据过多');

    when no_data_found then

        dbms_output.put_line('找不到对应的数据');

    when others then

        dbms_output.put_line('其实我也懵的..不知道发生了什么');

end;


2、--游标

/************************************

游标:用来提取多行数据(了解)

Oracle 打开一个工作区(内存区域)来保存多行查询的结果集,

游标就是给这个工作区命的名称,并能用于处理由多行查询而返回的记录行。

隐式游标: 默认的 DML 语句和 select 语句都有隐式游标。

显示游标: 开发中给工作区命名,并且可以进行操作。

%ISOPEN  Boolean  游标打开,则返回True(游标打开之后,不能再次打开,游标关闭之后,不能再次关闭)

%NOTFOUND  Boolean  如果最近抓取没有获得记录,返回True

%FOUND  Boolean  如果最近抓取获得记录,返回True

%ROWCOUNT  Number  返回到目前为止获取的记录数

使用游标的步骤:

1. 定义游标  CURSOR c_tb_stuu IS SELECT * FROM tb_stuu;

2. 打开游标  OPEN c_tb_stuu;

3. fetch游标  FETCH c_tb_stuu INTO r_tb_stuu;

  游标有个指针,默认指向第一行之上,fetch将指针向下移动,指向第N行数据,

  如果有数据,NOTFOUND返回false,FOUND返回true。

  如果到末尾,会一直抓取最后一条数据

4. 关闭游标  CLOSE c_tb_stuu;

************************************/

eg:

declare

  v_id tb_student.id%type;

  v_name tb_student.name%type;

  v_sex tb_student.sex%type;

cursor curTest  /*声明游标*/

is

select id,name,sex

  from tb_student;

begin

  open curTest;  /*打开游标*/

  fetch curTest into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/

  while curTest%found loop

    dbms_output.put_line('id:'||v_id||'姓名:'||v_name||'性别:'||v_sex);

    fetch curTest into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/

  end loop;

  close curTest;

end;

/********带参数的游标**********/

declare

  v_id tb_student.id%type;

  v_name tb_student.name%type;

  v_sex tb_student.sex%type;

  v_address tb_student.address%type;

  cursor  curTest2  /*声明游标2*/

  is

  select id,name,sex

  from tb_student;


  cursor  curTest3(vid tb_student.id%type)  /*声明带参数的游标3*/

  is

  select address

  from tb_student

  where id=vid;

  begin

  --↓↓先打开外层游标

    open curTest2;  /*打开游标*/

    fetch curTest2 into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/

    while curTest2%found loop

      dbms_output.put_line('id:'||v_id||'姓名:'||v_name||'性别:'||v_sex);

      --↓↓打开内层游标

      open curTest3(v_id);

        fetch curTest3 into v_address;

        while curTest3%found loop

          dbms_output.put_line(v_id||'的地址为:'||v_address);

          fetch curTest3 into v_address;

        end loop;

      close curTest3;

      --↑↑关闭内层游标

      fetch curTest2 into v_id,v_name,v_sex; /*读取的游标数据存储到指定变量中*/

    end loop;

    close curTest2;

    --↑↑关闭外层游标

  end;



3、--存储过程

-- 过程,可以简单理解为是一个函数。

-- 函数和过程的区别:函数总是向调用者返回数据,而过程没有数据返回。

-- Oracle 可以将 PL/SQL 代码存储在数据库中,然后可以提供给其他地方来运行它。

-- 这个动作就叫存储过程,也可以理解为一个创建一个函数给其他人用。

-- 语法格式

procedure 名字(参数)

is

  声明局部变量;

begin

  语句

end;

eg:--创建一个叫procTest的存储过程

create or replace procedure procTest(p_id in tb_student.id%type,p_name in tb_student.name%type,p_sex in tb_student.sex%type)

as

begin

  insert into tb_student(id,name,sex) values(p_id,p_name,p_sex);

  commit; -- 提交数据

  dbms_output.put_line('插入成功!');

end;

--调用存储过程

  execute procTest(8,'张三丰','女');

***-- 存储过程也可以使用图形界面方式创建:文件 → 新建 → 程序窗口 → procedure


4、--存储过程(备份)

你可能感兴趣的:(2018-08-31-Oracle学习第五天)