Oracle主要數據類型
創新互聯公司是一家專業提供襄垣企業網站建設,專注與成都網站設計、成都做網站、HTML5、小程序制作等業務。10年已為襄垣眾多企業、政府機構等服務。創新互聯專業網站設計公司優惠進行中。
概述 各種數據庫所支持的數據類型大同小異 與標準SQL語言中的數據類型可能略有出入
類型 varchar 可以在聲明字段時設置它的長度上限 而且使用它之后 就不必再考慮空格的存在
若插入的字符串的長度低于長度上限 系統就會自動將其縮減為字符串的真實長度
number(m n) 既可以用來表示整型 也可以表示浮點型 但m不可以超過 如果n為 或者省略n 就代表它是整數
date 用來存放日期和時間
blob 通常是在應用程序中使用到它 而不是在數據庫中利用SQL指令直接使用
比如通過JDBC技術訪問數據庫 讀寫blob或clob類型的字段 即讀寫長的字符串信息等等
char 它是一種定長的字符類型 在Oracle數據庫不區分字符和字符串 它們被統稱為字符型或文本型
所謂定長的字符型是指 插入的字符串若沒有達到約定的字段長度 系統就會在字符串尾部自動補空格
同樣 讀取時的字段長度永遠是聲明時的字段長度 而且在比較字符串內容的時候 也需要考慮到空格的過濾
nchar 它也是定長的字符串類型 它是SQL語言標準中規定的 通常采用Unicode編碼來保存不同國家或不同語言的字符
varchar SQL標準在定義varchar時并沒有保證能夠向前和向后兼容 即有可能隨著語言標準的修改而產生不兼容的問題
所以Oracle定義了同varchar型類似的varchar 型 就是為了在Oracle以后的版本中 都永遠支持varchar 類型
Oracle這么做就是為了確保此類型向前后兼容 以達到能夠在Oracle系列數據庫中進行數據的導入和導出的目的
long 它和varchar 的差別在于 它不支持對字符串內容進行檢索 即查詢時不可以對它的內容進行條件查詢
而varchar 和char nchar型等等都可以在查詢的時候直接檢索字符串的內容
補充 select * from v$nls_parameters;數據庫的配置信息以數據表的形式存在 通常稱其為關于數據的數據或數據字典
實際上它查詢的是數據字典中的一個視圖 其中NLS_CHARACTERSET對應的是當前的數據庫字符集
缺省均為使用數據庫字符集 教程中使用的是安裝時默認的ZHS GBK字符集 即漢字占 個字節 英文占 個字節
而NLS_NCHAR_CHARACTERSET對應的是nchar或nvarchar 類型所采用的輔助字符集 即AL UTF 字符集
實際上AL UTF 是一種 位定長的Unicode編碼的字符集 而數據庫字符集以及這種國家字符集都可以修改
但數據庫字符集修改后可能會面臨很嚴重的后果 除非是數據庫管理員 普通用戶不必對這方面進行深究
數據庫中的數據導入導出的時候 如果源數據庫和目標數據庫所采用的字符集不同 也很容易出問題
函數
概述 函數可以認為是能夠完成相對獨立的功能的一段代碼的集合 Oracle函數相當于其它語言中的方法或過程
Oracle函數可以分為單行函數和多行函數兩大類 Oracle函數都是有返回值的
所謂的單行函數是針對查詢結果中的每一行都起作用 都會返回一個結果
多行函數也就是所謂分組函數 是針對一組查詢的記錄 或者說多行 返回一個結果
單行 操作數據項 接受參數并返回處理結果 對每一返回行均起作用 可修改數據類型 可嵌套使用
單行函數分為字符函數 數值函數 日期函數 轉換函數 通用函數
多行 也稱分組函數 即對一組數據進行運算 針對一組數據(多行記錄)只能返回一個結果
多行函數包括avg() count() max() min() sum()等
比如select avg(sal) max(sal) min(sal) sum(sal) max(hiredate) min(hiredate) from emp;
續一 使用Oracle的系統函數中的單行函數可實現諸多功能 如對數據進行計算 控制數據的輸出格式
設置和改變日期的顯示格式 進行數據類型轉換 使用NVL等函數處理空值 實現IF THEN ELSE多路分支邏輯等等
續二 轉換函數不會改變表中數據的字段類型和值 它就相當于將數據復制了一份 所轉換的是復制之后的數據
數據類型轉換包括隱含轉換和顯式轉換兩種方式 建議使用顯式的數據類型轉換 確保SQL語句的可靠性
續三 通用函數適用于包括空值在內的任何類型數據 通常用來實現空值的處理 空值的過濾或設置缺省值等
通用函數包括nvl() nvl () nullif() coalesce() case表達式 decode()等
嵌套 單行函數可以嵌套使用 嵌套層次無限制 分組函數最多可嵌套兩層 嵌套函數的執行順序是由內到外
單行比如select empno lpad(initcap(trim(ename)) ) 姓名 job sal from emp;
多行比如select max(avg(sal)) from emp group by deptno; 其實這里再使用分組函數就沒有意義了
說明 通常數據庫層面提供的函數 只是進行數據的簡單的處理 或者說是只能實現極為常規的功能
所以就不應該 或者說是不要指望在數據庫查詢的層面來實現特別復雜的業務邏輯
如果應用程序的邏輯跟數據庫混在一起的話 會不利于代碼的維護和更新
而且也不利于數據庫的管理 包括數據移植 數據庫導入導出等等
日期類型
概述 在計算機操作系統或者各種高級編程語言中 日期通常會被保存成一個長整數 通常記錄的是毫秒
Oracle內部以數字格式存儲日期和時間信息 世紀 年 月 日 小時 分鐘 秒
缺省的日期格式是DD—MON—YY 可使用sysdata函數獲取當前系統日期和時間
運算 日期型數據可以直接加或減一個數值 結果認為日期 約定的該數值代表的是相加減的天數
兩個日期型數據可以相減 結果為二者相差多少天 二者不能 因為日期相加是沒有意義的
NVL()函數
概述 它用于將空值null替換為指定的缺省值 適用于字符 數字 日期等類型數據
格式 NVL(exp exp ) 如果表達式exp 值為null 則返回exp 值 否則返回exp 值
舉例 select empno ename sal m sal+nvl(m ) from emp;
select empno ename job nvl(job No job yet ) from emp;
NVL ()函數
概述 它用于實現條件表達式功能
格式 NVL (exp exp exp ) 如果表達式exp 值不為null 則返回exp 值 否則返回exp 值
舉例 select empno ename sal m nvl (m sal+m sal) 總收入 from emp;
NULLIF()函數
概述 它用于數據等價性比較并根據比較結果返回null或其中一個被比較的數值 實際開發中應用并不是很多
格式 nullif(exp exp ) 如果表達式exp 與exp 的值相等 則返回null 否則返回exp 的值
舉例 select name 原名 nullif(pen_name name) 化名 from author;
COALESCE()函數
概述 它用于實現數據“接合”功能
格式 coalesec(exp exp ) 依次考察各參數表達式 遇到非null值即停止并返回該值
若表達式均為null值 則返回null 通常最后一個表達式都是能確保不是空值的字段
舉例 select empno ename sal m coalesec(sal+m sal ) 總收入 from emp;
CASE表達式
概述 它用于實現多路分支結構
格式 case exp when parison_exp then return_exp
[when parison_exp then return_exp
when parison_expn then return_expn
else else_exp]
end
舉例 select empno ename sal
case deptno when then 財務部
when then 研發部
when then 銷售部
else 未知部門
end 部門
from emp;
說明 CASE中的每一個表達式(如deptno 財務部等)都可以是復合而成的
這種對齊方式的書寫是為了增加可讀性 當然也可以把代碼寫在同一行上
其中case到end之間的整體就相當于普通查詢中的一個字段 end后面的“部門”是別名
DEDODE()函數
概述 和case表達式類似 它也用于實現多路分支結構
格式 decode(col|expression search result
[ search result ]
[ default])
舉例 select empno ename sal
decode(deptno 財務部
研發部
銷售部
未知部門 )
部門
from emp;
COUNT()函數
格式 count(*)返回組中總記錄數目
count(exp)返回表達式exp值非空的記錄
count(distinct(exp))返回表達式exp值不重復的 非空的記錄數目
舉例 select count(*) from emp; 缺省的情況下 整個表就是一組
select count(m) from emp; 返回emp表中m字段不為空的記錄(行)數目
select count(distinct(deptno)) from emp; 查找deptno值為非空且不重復的記錄數目
分組函數與空值
概述 分組函數省略列中的空值 可使用NVL()函數強制分組函數處理空值
舉例 select avg(m) from emp; 等價于sum(m)/count(m)
select sum(m) from emp; 計算表中非空的m值的總和
select avg(nvl(m )) from emp; 等價于avg(nvl(m ))/count(*)
GROUP BY子句
概述 它用于將表中數據分成若干小組
格式 select column group_function(column)
from table
[where condition]
[group by group_by_expression]
[order by column];
舉例 select deptno avg(sal) from emp group by deptno;
說明 出現在SELECT列表中的字段 如果不是包含在組函數中 那么該字段必須同時在GROUP BY子句中出現
包含在GROPY BY子句中的字段則不必須出現在SELECT列表中 子句執行順序是where→group by→order by缺省按升序排列
補充 select deptno job avg(sal) from emp group by deptno job order by deptno desc; 基于多個字段的分組
select deptno avg(sal) from emp; 非法
注意 如果沒有GROUP BY子句 SELECT列表中不允許出現字段(單行函數)與分組函數混用的情況
WHERE中不允許使用分組函數 如select deptno avg(sal) from emp where avg(sal) group by deptno; 非法
這跟子句執行的順序有關 where子句最先執行 在執行where子句的時候還沒有執行過group by子句
于是程序不知道這是在分組 也不曾計算過avg(sal)的組內平均工資 所以在where子句中不允許使用分組函數
由于還沒有執行過group by子句 所以此時就不確定如何怎么分組以及分多少個組
所以where子句中只能進行初級過濾 此時可以使用HAVING子句實現對平均工資的過濾
HAVING子句
概述 它用于過濾分組
格式 select column group_function(column)
from table
[where condition]
[group by group_by_expression]
[having group_condition]
[order by column];
舉例 select deptno job avg(sal)
from emp
where hiredate = to_date( yyyy mm dd )
group by by deptno job
having avg(sal)
lishixinzhi/Article/program/Oracle/201311/19087
create?or?replace?function?f(d?number)
return?varchar
is
begin
return?substr(d,instr(d,'.')+1);
end?f;
select?f(12.34)?from?dual;
下面是一個函數的簡單示例!建議閱讀相關書籍以便充分理解!畢竟很多細節是很難一一描繪的.系統看看書會比較好!
函數是有名稱的pl/sql塊
函數有返回值
在表達式中調用函數
存儲在服務器端
CREATE OR REPLACE FUNCTION get_sal
(v_id IN emp.empno%TYPE) RETURN NUMBER
IS
v_salary emp.sal%TYPE :=0;
BEGIN
SELECT sal INTO v_salary FROM emp WHERE empno = v_id;
RETURN (v_salary);
END get_sal;
/
驗證對象
select object_name,object_type from user_objects;
查看原程序
select text from user_source;
調用函數
select get_sal(7839) from dual;
刪除函數
DROP FUNCTION get_salary;
索引是建立在函數基礎之上的。
一般的索引
create index P_IDX ON TABLE1(COLUMN1);
當執行SELECT * FROM TABLE1 WHERE COLUMN1 = XXX 時會用到索引。
函數索引:
CREATE INDEX P_IDX ON TABLE1(SUBSTR(COLUMN1,0,5));
當執行SELECT * FROM TABLE1 WHERE SUBSTR(COLUMN1,0,5) = XXX 時會用到索引。
但執行SELECT * FROM TABLE1 WHERE COLUMN1 = XXX時是不會用到索引的
一般情況下是最好不用建函數索引。
25、包
(1)定義包頭
語法:
CREATE [OR REPLACE] PACKAGE [schame_name.]包名
IS | AS
包描述
包描述:可以是變量、常量及數據類型定義和游標定義,也可以是存儲過程、函數定義和參數列表返回值類型。
例:
CREATE OR REPLACE PACKAGE employeePackage
AS
--類型定義
Type empRecType is record(
Empno number(4),
Salary number
)
--變量定義
p1 varchar2(20);
type t_departmentNo table is table of dept.deptno%type
index by binary_integer;
--游標定義
Cursor order_sal retrurn EmpRecType;
--聘用員工過程
Procedure HireEmployee(p_EmpNo emp.empno%type);
End employeePackage;
例:
CREATE OR REPLACE PACKAGE scott.pkg_displayproduct
IS
procedure prc_getproductinfo
(
pid scott.product.prodid%type,
pname out scott.product.prodname%type,
ctname out scott.product.CATEGORYID%type,
dscp out scott.product.description%type
);
function fun_getstock
(
pid scott.product.prodid%type
)
return number;
END pkg_displayproduct;
(2)定義包體
語法:
CREATE OR REPLACE PACKAGE BODY [schame_name.]包名
IS | AS
包體描述;
END 包名;
包名:將要創建的包名稱,該名稱可以和包頭所在的包名相同,也可以不同。
包體描述:游標、存儲過程或者函數的定義
包體是可選的,如果在包頭中沒有聲明任何存儲過程或者函數,則包體就不存在,即使在包頭有變量、游標或者類型的聲明
(3)引用包中對象
BEGIN
[schame_name.][包名.]對象名;
END;
create or replace
FUNCTION "函數名"
(
A in number,
B in number,
name in VARCHAR2
)
BEGIN
insert into 表名 values(A+B,name);
END 函數名;
//花括號里邊就是需要傳的參數,name如果是固定的可以直接寫死,就不用傳參了
分享題目:oracle函數如何建立 oracle函數怎么用
分享網址:http://www.yijiale78.com/article38/hgcopp.html
成都網站建設公司_創新互聯,為您提供自適應網站、網站設計公司、網站排名、定制開發、搜索引擎優化、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯