日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle如何自定义类型,Oracle 自定义类型

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle如何自定义类型,Oracle 自定义类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、子類型

這種類型最簡單,類似類型的一個別名,主要是為了對常用的一些類型簡單化,它基于原始的某個類型。如:

有些應用會經常用到一些貨幣類型:number(16,2)。如果在全局范圍各自定義這種類型,一旦需要修改該類型的精度,則需要一個個地修改。

那如何實現定義的全局化呢?于是就引出了子類型:

subtype cc_num is number(16,2);

這樣就很方便地解決了上述的麻煩。

我們可以在任何PL/SQL塊、子程序或包中定義自己的子類型

SUBTYPE? subtype_name IS? base_type[(constraint)] [NOT? NULL ];

subtype_name就是聲明的子類型的名稱,base_type可以是任何標量類型或用戶定義類型,約束只是用于限定基類型的精度和數值范圍,或是最大長度。下面舉幾個例子:

DECLARE

SUBTYPE? birthdate IS? DATE? NOT? NULL ;?? -- based on DATE type

SUBTYPE? counter IS? NATURAL ;?? -- based on NATURAL subtype

TYPE? namelist IS? TABLE? OF? VARCHAR2 (10);

SUBTYPE? dutyroster IS? namelist;?? -- based on TABLE type

TYPE? timerec IS? RECORD (

minutes?? INTEGER ,

hours???? INTEGER

);

SUBTYPE? finishtime IS? timerec;?? -- based on RECORD type

SUBTYPE? id_num IS? emp.empno%TYPE ;?? -- based on column type

我們可以使用%TYPE或%ROWTYPE來指定基類型。當%TYPE提供數據庫字段中的數據類型時,子類型繼承字段的大小約束(如果有的話)。但是,子類型并不能繼承其他約束,如NOT NULL。

2、使用子類型

一旦我們定義了子類型,我們就可以聲明該類型的變量、常量等。下例中,我們聲明了Counter類型變量,子類型的名稱代表了變量的使用目的:

DECLARE

SUBTYPE? counter IS? NATURAL ;

ROWS?? counter;

下面的例子演示了如何約束用戶自定義子類型:

DECLARE

SUBTYPE? accumulator IS? NUMBER ;

total?? accumulator(7, 2);

子類型還可以檢查數值是否越界來提高可靠性。下例中我們把子類型Numeral的范圍限制在-9到9之間。如果程序把這個范圍之外的數值賦給Numeral類型變量,那么PL/SQL就會拋出一個異常。

DECLARE

SUBTYPE? numeral IS? NUMBER (1, 0);

x_axis?? numeral;?? -- magnitude range is -9 .. 9

y_axis?? numeral;

BEGIN

x_axis??? := 10;?? -- raises VALUE_ERROR

...

END ;

二、普通類型

create or replace type SH_type1 as object (

col1 number,

col2 varchar2(50),

col3 date,

);

create or replace type SH_TABLE_TYPE1 IS TABLE OF SH_type1;

create table t1_type of SH_type1;

insert into t1_type(COL1,COL2,COL3) values(SH_sqe_ASC.NEXTVAL,‘hello‘,sysdate-10);

SELECT * FROM T1_TYPE;

三、帶成員函數的類型體

這種類型包含了對類型中數據的內部處理,調用該類型時,可將處理后的數據返回給調用方。

對上面的例子進行擴展。要求給當天加上特殊標識(【】)來突出顯示。

首先,在typ_calendar中增加一個成員函數聲明:

create or replace type typ_calendar as object(

年 varchar2(8),

月 varchar2(8),

星期日 varchar2(8),

星期一 varchar2(8),

星期二 varchar2(8),

星期三 varchar2(8),

星期四 varchar2(8),

星期五 varchar2(8),

星期六 varchar2(8),

本月最后一日 varchar2(2),

member function format(

curday date := sysdate,

fmtlen pls_integer := 8

)return typ_calendar

)

然后,創建一個type body,在type body中實現該成員函數:

create or replace type body typ_calendar as

member function format(

curday date := sysdate,

fmtlen pls_integer := 8

) return typ_calendar as

v_return typ_calendar := typ_calendar(‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘);

v_dd varchar2(2) := to_char(curday, ‘dd‘);

function fmt(

fmtstr varchar2

)return varchar2 as

begin

return lpad(fmtstr, fmtlen, ‘ ‘);

end fmt;

begin

v_return.年 := 年;

v_return.月 := 月;

v_return.星期日 := fmt(星期日);

v_return.星期一 := fmt(星期一);

v_return.星期二 := fmt(星期二);

v_return.星期三 := fmt(星期三);

v_return.星期四 := fmt(星期四);

v_return.星期五 := fmt(星期五);

v_return.星期六 := fmt(星期六);

v_return.本月最后一日 := 本月最后一日;

if (年 || lpad(月, 2, ‘0‘) = to_char(curday, ‘yyyymm‘)) then

case v_dd

when 星期日 then

v_return.星期日 := fmt(‘【‘ || 星期日 || ‘】‘);

when 星期一 then

v_return.星期一 := fmt(‘【‘ || 星期一 || ‘】‘);

when 星期二 then

v_return.星期二 := fmt(‘【‘ || 星期二 || ‘】‘);

when 星期三 then

v_return.星期三 := fmt(‘【‘ || 星期三 || ‘】‘);

when 星期四 then

v_return.星期四 := fmt(‘【‘ || 星期四 || ‘】‘);

when 星期五 then

v_return.星期五 := fmt(‘【‘ || 星期五 || ‘】‘);

when 星期六 then

v_return.星期六 := fmt(‘【‘ || 星期六 || ‘】‘);

else null;

end case;

end if;

return v_return;

end format;

end;

插入測試數據:

SQL> insert into tcalendar

2 select typ_calendar(‘2010‘,‘05‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘31‘) from dual

3 /

1 row inserted

SQL> insert into tcalendar

2 select typ_calendar(‘2010‘,‘05‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘31‘).format() from dual

3 /

1 row inserted

SQL> insert into tcalendar

2 select typ_calendar(‘2010‘,‘05‘,‘11‘,‘12‘,‘13‘,‘14‘,‘15‘,‘16‘,‘17‘,‘31‘).format() from dual

3 /

1 row inserted

SQL> select * from tcalendar;

可以看到數據已經居中處理了,并且到了第三條已經可以突出顯示當前日期了。

在這里type 中的成員函數(member function)和靜態函數(static function)的區別有必要說明一下:

成員函數有隱含參數self,即自身類型,可以在執行的時候引用當前的數據并對數據進行操作。它的調用可以如下:object_expression.method()

靜態函數沒有該隱含參數。它的調用如下:type_name.method();

舉個例子:

首先,創建一個帶靜態函數聲明的類型頭:

原文:http://www.cnblogs.com/shcqupc/p/5099035.html

總結

以上是生活随笔為你收集整理的oracle如何自定义类型,Oracle 自定义类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。