博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Oracle】Oracle中复合数据类型
阅读量:5290 次
发布时间:2019-06-14

本文共 5127 字,大约阅读时间需要 17 分钟。

1,常见的操作数据库的技术有那些

   jdbc     使用java 访问数据库的技术

   PLSQL  (procedure  过程化sql) 在数据库内部操作数据的技术
   proc/c++    c 和 c++ 访问数据库的技术
   ODBC      微软提供访问数据库的技术
   OCI          oracle  底层的连接接口 

2,Oracle中的复合数据类型

Oracle中的复合数据类型record,table,cursor

2.1 record类型

2.1.1 语法

/*定义一个record类型*/           type record类型名称 is record(                属性  数据类型,                属性  数据类型                ...           );           /*使用record类型名称定义一个record变量*/           record变量名   record类型名称

也可以使用表的字段来定义,

/*使用表的字段类型定义一个record类型*/           type record类型名称 is record(                属性  表名.属性名%type,                属性  表名.属性名%type                ...           );           /*使用record类型名称定义一个record变量*/           record变量名   record类型名称

2.1.2 示例

使用record类型存储来存储不同类型的数据:

set serveroutput on;declare           type  emptype  is  record(                  id     number,                  name varchar2(5)            );           var_emp   emptype;begin           var_emp.id:=1;           var_emp.name:='jame';           dbms_output.put_line(var_emp.id);end;/

2.2 table类型

2.2.1 语法

/*定义一个table类型*/type    table类型名  is  table  of  元素类型名    index  by  binary_integer;/*定义一个table变量*/变量名      table类型名;

访问数据的方式,

table变量(下标):=值;

2.2.2 示例

使用表格存储同一种类型的数据:

declare              type  numstype  is table of  number   index by binary_integer;              var_nums   numstype;                     begin              var_nums(0):=9;              var_nums(1):=5;              var_nums(2):=2;              var_nums(3):=7;              var_nums(4):=0;              dbms_output.put_line(var_nums(3));/*打印下标为3的元素*/      end;

table中的数据也可以使用迭代的思想来操作

     下标不连续时 遍历table类型的变量      

      迭代思想:
      变量名.first()   获取第一个元素对应的下标 (元素对应的最小下标)
      变量名.next(n)  根据一个元素的下标n  得到下一个元素对应的下标
      变量名.last()     获取最后一个元素对应的下标  

例如,使用迭代遍历表中的所有数据:

set serveroutput on;       declare              type  numstype  is table of  number   index by binary_integer;              var_nums   numstype;               var_index    binary_integer:=0;                    begin              var_nums(0):=9;              var_nums(1):=5;              var_nums(-12):=2;              var_nums(3):=7;              var_nums(4):=0;              -- var_nums.count();               var_index :=  var_nums.first();              loop                      dbms_output.put_line(var_nums(var_index));                      var_index:=var_nums.next(var_index);                      if var_index =  var_nums.last()  then                             dbms_output.put_line(var_nums(var_index));                             exit;                       end if;                end loop;       end;     /

 

2.3 cursor类型

2.3.1 语法

/*声明游标*/ cursor   游标名   is  select语句;/*打开游标*/open   游标名;/*提取数据,将结果存储到变量中,一般都是record类型*/fetch   游标名   into  变量;/*关闭游标*/close 游标名

2.3.2 游标的属性

% ISOPEN 判断游标是否打开,若打开就返回true,否则就返回false.

% ROWCOUNT 当前游标指针的偏移量.

%FOUND 如果游标提取到新数据,就返回true,否则就返回false.

%NOTFOUND 如果游标没有提取到新数据,就返回true,否则就返回false.

2.3.3 示例

遍历一个游标中的所有数据行:

declare            /*使用s_emp创建一个游标类型*/          cursor   empcursor   is  select  id,first_name,salary from   s_emp;          /*使用游标创建一个record变量*/          var_emp   empcursor % rowtype;   begin          open    empcursor;          loop                    fetch    empcursor  into     var_emp;                   /* 如果没有提取到 新数据  则结束循环 */                   exit     when     empcursor%notfound;                   dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);          end  loop;          close    empcursor;   end;   //*   --也可以使用如下的的for循环快速的遍历游标中的数据   --使用for循环可以自动声明游标变量,可以自动打开游标,可以自动提取数据,可以自动关闭游标   --在调用游标类型的时候可以传递参数,上面的例子可以在打开游标的时候传入参数"open    empcursor(20);"   declare            cursor   empcursor(var_id   number)   is  select  id,first_name,salary from   s_emp where  id> var_id;   begin         FOR   VAR_EMP IN  empcursor(20) LOOP                    dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);          END  LOOP;   end;   /*/

2.3.4 参考游标 refer cursor

使用参考游标, 游标对应的sql语句,可以在程序执行的过程中发生改变 ,直到打开游标时确定对应的sql语句。

--定义一个参考游标类型  type    参考游标类型名   is   ref  cursor;--使用这个类型  定义一个游标变量 游标变量    参考游标类型名;--打开游标时 关联一个动态拼接好的字符串 open  游标变量  for   SQL的字符串;

例如:

根据条件动态指定查询的数据,并且遍历所有得到的数据行:

declare           /*创建一个参考游标类型*/           type    myrefcursor  is   ref  cursor;           /*创建一个参考游标变量*/           refempcursor    myrefcursor;           /* 为这个参考游标  定义一个动态字符串 */           sqlstr    varchar2(200);           var_id    number:=10;           type     emptype   is  record(                   id     s_emp.id%type,                   salary  s_emp.salary % type,                   dept_id  s_emp.dept_id%type           );           var_emp    emptype;    begin           sqlstr := 'select  id,salary,dept_id  from  s_emp';           if  var_id  !=  0  then                     sqlstr := sqlstr ||' where id > ' || var_id;           end  if;               open    refempcursor  for  sqlstr;           loop                  fetch   refempcursor  into  var_emp;                  exit  when  refempcursor%notfound;                  dbms_output.put_line(var_emp.id||':'||var_emp.salary||':'||var_emp.dept_id);           end  loop;           close   refempcursor;    end;    /

 

转载于:https://www.cnblogs.com/HDK2016/p/6901709.html

你可能感兴趣的文章
Linux搭建服务
查看>>
Solr:CVE-2019-0193复现
查看>>
Linux常用命令
查看>>
[JZOJ6299] 2019.08.12【NOIP提高组A】工厂
查看>>
5432. 【NOIP2017提高A组集训10.28】三元组
查看>>
[JZOJ6355] 【NOIP2019模拟】普 24/100
查看>>
[JZOJ6353] 【NOIP2019模拟】给
查看>>
[JZOJ4330] 【清华集训模拟】几何题
查看>>
[JZOJ6341] 【NOIP2019模拟2019.9.4】C
查看>>
[JZOJ4331] 【清华集训模拟】树
查看>>
[JZOJ6272] 2019.8.4【NOIP提高组A】整除
查看>>
[JZOJ1900] 【2010集训队出题】矩阵
查看>>
[JZOJ1901] 【2010集训队出题】光棱坦克
查看>>
[JZOJ3424] 【NOIP2013模拟】粉刷匠
查看>>
[JZOJ6340] 【NOIP2019模拟2019.9.4】B
查看>>
[JZOJ2865]【集训队互测 2012】Attack
查看>>
[JZOJ6271] 2019.8.4【NOIP提高组A】锻造
查看>>
[JZOJ6278] 2019.8.5【NOIP提高组A】跳房子
查看>>
[JZOJ6257] 【省选模拟8.9】修路
查看>>
NOI2019网络同步赛总结
查看>>