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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM