zoukankan      html  css  js  c++  java
  • 【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;
        /
  • 相关阅读:
    利用DWORD SHOOT实现堆溢出的利用(先知收录)
    PEiD中识别虚拟地址和物理地址
    从汇编层面解析一传值操作
    RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期
    nginx配置禁止ip访问,只能域名访问
    yii2 下的redis常用命令集合
    Linux离线安装pip和numpy
    Linux在线安装pip和numpy
    Linux上不了网——wget无法解析主机
    RedHat改yum源免费使用CentOS源
  • 原文地址:https://www.cnblogs.com/HDK2016/p/6901709.html
Copyright © 2011-2022 走看看