Take a look at GW

【Oracle】Oracle中复合数据类型

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;
    /

 

posted @ 2017-05-25 00:20  HDWK  阅读(2564)  评论(0编辑  收藏  举报