本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          隨筆-230  評(píng)論-230  文章-8  trackbacks-0

          ?

          標(biāo)量數(shù)據(jù)類型

          ?

          Number 系列及其子類型

          Char 系列及其子類型

          Date 等比列及其子類型

          Interval 系列 (oracle 9i 特有 )

          Timestamp 系列 (oracle 9i 特有 )

          MSLABEL 系列

          復(fù)合數(shù)據(jù)類型

          記錄類型 (record) 、 Index-By

          嵌套表、 Varray

          對(duì)象數(shù)據(jù)類型

          Object 類型、 OBLECT REF LOB 類型、

          Sys.AnyType SYS.ADYDATA SYS.ANYDATASET(oracle 9i 特有 )

          其它 pl/sql 特有的數(shù)據(jù)類型

          BOOLEAN 、 BINARY_INTEGER 、 PLS_INTEGER %TYPE 、 REF CURSOR

          SYS_REFCURSOR(oracle 9i 特有 )

          用戶定義子類型

          記錄

          ?????? pl/sql 中可以定義三種類型的記錄 : 顯式定義的記錄,面向數(shù)據(jù)庫(kù)表的記錄,面向游標(biāo)的記錄。

          ?

          記錄的定義其語法如下:

          Type record_type_name is record(

          ?????? Field_name1 datatype not null default

          )

          ?

          例子:

          Type person_rec? is record (

          ?????? Name varchar2(100);

          ??? Address varchar2(200);

          );

          記錄類型變量的聲名

          ? vperson person_rec;

          ?

          type …record 只是一種操象的定義,因此,它不能由它自己使用, type.. record 不會(huì)占用任何資源,直到專名該類型的變量時(shí)才占用資源

          ?

          記錄類型的使用

          ? 記錄類型的變量定義以后,接下來就是使用記錄來處理數(shù)據(jù)。

          ? 1 、訪問記錄中的遠(yuǎn)素

          ? 2 、測(cè)試記錄是否相等

          ????? 記錄比較應(yīng)比較完記錄的每個(gè)字段 , 看它們是否相等,把記錄看作整體來比較的做的作法是錯(cuò)誤的。

          記錄的使用就像一個(gè)對(duì)象。可以對(duì)它進(jìn)行賦值, oracle 9i 中有幾種賦值方法:

          1)??? 對(duì)各個(gè)字段賦值

          2)??? 使用 select into 語句填充一個(gè)記錄

          3)??? 使用 fetch into 語句填充一個(gè)記錄

          4)??? 使用一個(gè)記錄為另一個(gè)記錄賦值(聚集賦值)

          ?

          其它記類型

          1???????? 面向表的記錄類型

          ? 定義 :

          ?? Record_var_name? table_name%rowtype;

          ????????????? ? 使用:

          ????????? Select * into record_var_name from hrc_tab where id=?

          2???????? 面向游標(biāo)的記錄類型

          Declare

          ?? Cursor csr_hrc is select * from hrc_tab order by 1;

          ?? hrc_rec csr_hrc%rowtype;

          begin

          ?? …….loop

          ????????????? Fetch csr_hrc into hrc_rec

          ??????? Exit when csr_hrc%not found

          …..

          ?? End loop;

          end;

          涉及整個(gè) pl/sql 記錄的 DML 操作(特指 insert ,update select

          ?Insert into hrc_tab values record_var_name

          ?

          ?Update ?hrc_tab set ROW=record_var_name where hrc_code=’99’

          ?

          Index-by

          ? Index-by 表是一同一個(gè)與數(shù)組類似的同質(zhì)元素的集合組成的一種復(fù)合數(shù)據(jù)類型。集合中的元素稀 ? 分布且沒有限定邊界,只是由一個(gè)整數(shù)索引將其連接在一起。

          ?

          定義 Index-by 表的型

          ?? Type table_name_type is table of type [not null] index by binary_integer

          下面是一個(gè)聲明這種類型的示例

          ? Type num_tab is table of number index by binary_integer

          聲明表類型的變量

          ? V_num_tab num_tab;

          Index-by 表的使用

          index-by 表是兩列的(一列索引,另一列是對(duì)應(yīng)的值)結(jié)構(gòu),

          index-by pl/sql 特有,所以在 sql 中它們自然就不可用,另外,也不能存儲(chǔ)在數(shù)據(jù)庫(kù)中,這樣導(dǎo)致不能在 index-by 表中使用 select ,insert ,update delete SQL? DML 操作。對(duì) index-by 表來說沒有 commit rollback ,一個(gè)例子:

          ?declare

          ??? type num_tab is table of number index by binary_integer;

          ??? v_example_tab num_tab;

          ? v_num number:=13;

          begin

          ?????? v_example_tab(1):=1001;

          ??? v_example_tab (0):=1002;

          ??? v_example_Tab(-10):=1003

          ??? v_example_tab(v_num):=1004p;

          ??? dbms_output.put_line(to_char(v_example_tab(-10))|| …..)

          end;

          ?

          可以使用任何與 binary_integer 相兼容的文字,變量或表達(dá)式作為 index-by 表的索引

          ?

          可樣也可以把一個(gè) index-by 表賦值給另一個(gè) index-by 表。

          ?declare

          ?? type num_tab is table of number index by binary_integer;

          ?? v_example_tab1? num_tab;

          v_example_tab2 num_tab;

          ?begin

          ?????? v_example_tab1:= v_example_tab2;

          end;

          ?

          index-by 表中只有在賦值時(shí)才可以創(chuàng)建行,因些在賦值以前,行是一存在的,這是因?yàn)?/span> index-by 表沒有上下界,訪問沒定義的行會(huì)出現(xiàn) N)_DATA_FOUND 行。

          ?

          Index-by 表的填充有三種方法:

          ?1 通過賦值創(chuàng)建元素行,

          ?2 使用 loop index-by 表的行賦值

          ?3 用一個(gè) index-by 表為另一個(gè) index-by 表賦值

          第一種方法前面用了,第二種方法就是一個(gè)循環(huán)了,如 :

          Declare

          ?? Type num_tab is table of number index by binary_integer;

          ?? V_Example_tab num_tab;

          Begin

          ?????? For idx in 1..10 loop

          ?????? V_example_tab(idx) :=(2*idx)+1

          ??? End loop;

          End;

          ?

          刪除 Index-by

          ?????? 有兩種方法:

          1、? 定義一下與已填充的 index-by 表類型相同的空的 index-by 表,然后用該表執(zhí)行聚集賦值

          2、? 使用 index-by 表的 delete 方法。

          Index-by 表的方法:

          ?

          方法

          用途

          語法

          Exits

          檢查某個(gè)元素是否存在,如果存在,返回值是 true ,反之面,返回 false

          Table_name.exists(index)

          Count

          返加已確定的元素個(gè)數(shù)

          Table_name.count

          Delete

          刪除一部墜毀(也包括沒定義的)或全部元素,如刪除開始索引與結(jié)束索引之間的表元素

          Table_name.delete 刪全部

          Table_name.delete(index) 刪除指定索引的

          fIrst

          返回 index-by 表中第一行的索引值,如果不存在就返回 null

          Table_name.first

          Last

          返回 index-by 表中最后一行的,不存在返回 null

          Table_name.last

          Next

          返回 index-by 表中由特定索引指定的下一行的索引,不存在返回 null

          Table_name.next

          ?

          Prior

          返回 index-by 表中由特定索引指定的前一行索引,如果不存在返回 null

          Table_name.prior

          ?

          方法使用例子:

          If? v_example.exists(100)? then

          ?????? dbms_output.put_line(to_char(v_example.exists(100)));

          End if ;

          ?

          For udx? in 1..v_example.count loop? // 用這種方法必須要確定行是連續(xù)填充的,下界是一個(gè) // 定的值。

          ?????? Dbms_output.put_line(to_char(v_example_tab(idx)));

          End loop;

          ?

          V_example_tab.delete(1) ; // 刪除第一個(gè)索引的記錄

          V_example_tab.delete(2,5);// 刪除第 2 至第 5 個(gè)索引記錄

          V_example_tab.delete;// 刪除所有記錄

          ?

          使用 first,last,next 方法的例子

          Idx:=v_example_tab.first;

          Loop

          ?????? Dbms_output.put_line();

          Exit when? idx:=v_example_tab.last;

          Idx:=v_example_tab.next();

          End loop;

          ?

          這樣遍歷一個(gè) index-by 表是最好的,表的記錄可以不連續(xù)。

          ?

          記錄的 Index-by

          ?

          定義 index-by 表的幾個(gè)步驟

          ?

          1、? 定義記錄類型

          2、? 定義記錄類型的表類型

          3、? 定義表類型的變量

          ?

          一個(gè)例子:

          Declare

          ?Type hrc_org_Rdc is record(

          ????????????? Hrc_org_id? number,

          ??????? Hrc_descr var_char2(200)

          ? )

          Type hrc_org_tab is table of hrc_org_rec index by binary_integer;

          Begin

          ?? Null;

          End;

          ?

          聯(lián)合數(shù)組

          ?

          oracle 9i release 2 中,可以使用 varchar2 類型的索引代規(guī) binary_integer 類型的索引來定義 index-by 表,用 varchar2 索引作為數(shù)據(jù)庫(kù)表的關(guān)鍵字,可以提高數(shù)據(jù)庫(kù)的性能。

          例子:

          Declare

          ? Type site_ary is table of number index by varchar2(20);

          ? V_example_array site_ary;

          Begin

          ?????? V_example_array(‘xx’):=10;

          ??? V_example_array(‘yy’):=200;

          End;

          ?

          ?

          ?

          posted on 2006-09-15 14:20 有貓相伴的日子 閱讀(1279) 評(píng)論(0)  編輯  收藏 所屬分類: pl/sql
          本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 文化| 昆明市| 夏津县| 安化县| 大荔县| 大厂| 廉江市| 武夷山市| 阿拉善盟| 舒城县| 内丘县| 尼玛县| 定州市| 重庆市| 黑龙江省| 青神县| 庆安县| 贵溪市| 宜昌市| 武山县| 鄂伦春自治旗| 巩留县| 永嘉县| 明水县| 松溪县| 宜城市| 讷河市| 司法| 新绛县| 沈阳市| 佛坪县| 广丰县| 延边| 云霄县| 鄂托克旗| 临武县| 江华| 佳木斯市| 马山县| 永年县| 岳池县|