Oracle如何自定義函數(shù)
1.系統(tǒng)預(yù)定義函數(shù)
- ---聚合函數(shù) sum max min count avg median wm_concat
- ---常用函數(shù):數(shù)學(xué)函數(shù) 字符串函數(shù) 時(shí)間 trunc (date,'q')
- ---分析函數(shù): over()
ratio_to_report() NTILE()OVER() LEAD() LAG() wm_concat() first_value() row_number() RANK() dense_rank()
2.Oracle自定義函數(shù)語法
CREATE OR REPLACE FUNCTION 函數(shù)名(參數(shù)1 數(shù)據(jù)類型,參數(shù)2 [IN | OUT] 數(shù)據(jù)類型……)
RETURN 返回的數(shù)據(jù)類型 ---返回的如果是 VARCHAR2 類型,也不能給長度
IS ---IS 或者 AS 隨便寫一個(gè)都可以
聲明變量 ---聲明變量的時(shí)候記得給長度
BEGIN
函數(shù)的具體邏輯;
RETURN 聲明變量;
--里面必須要有一個(gè)RETURN子句
---異常處理
END;3.什么是編譯
編譯,就是把函數(shù)在數(shù)據(jù)庫里創(chuàng)建。
編譯就是將寫好的代碼放在數(shù)據(jù)庫里某個(gè)文件里存著,調(diào)用函數(shù)的時(shí)候,就會(huì)到數(shù)據(jù)庫里執(zhí)行存放的函數(shù)邏輯。
檢查函數(shù)編譯(創(chuàng)建)的時(shí)候有沒有報(bào)錯(cuò) 選中函數(shù)的名稱 > 鼠標(biāo)右鍵 > view/edit
4.自定義函數(shù)練習(xí)題
示例:創(chuàng)建計(jì)算 1到 N 的和的函數(shù)
create or replace function fun_N(N number) return number
as
f_sum number := 0; -- 存放臨時(shí)累加的和
begin
for i in 1..N
loop
f_sum := f_sum + i;
end loop;
return f_sum;
-- 定義異常
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLERRM);
-- 使用 DBMS_OUTPUT.PUT_LINE 過程輸出異常的錯(cuò)誤消息。
-- SQLERRM 是一個(gè)Oracle預(yù)定義的異常變量,它包含了最近一次數(shù)據(jù)庫運(yùn)行時(shí)錯(cuò)誤的描述。
end;
select fun_N(10)
FROM DUAL;
示例:假如 Oracle沒有 POWER 這個(gè)函數(shù),需要人工自己開發(fā)函數(shù)POWER_A
create or replace function POWER_A(N1 number, N2 number) return number
as
f_power number := 1; -- 存放臨時(shí)累加的和
begin
for i in 1..N2
loop
f_power := f_power * N1;
end loop;
return f_power;
-- 定義異常
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end;
select POWER_A(3,3) FROM DUAL;
第1次循環(huán):v1 = 1 * 3 = 3
第2次循環(huán):v1 = 3 * 3 = 9
第3次循環(huán):v1 = 9 * 3 = 27 → 最終結(jié)果
示例:創(chuàng)建一個(gè)函數(shù),根據(jù)傳遞給函數(shù)的員工編號(hào)返回員工的姓名;
create or replace function F_ENAME(P_EMPNO number)
return varchar2 -- 參數(shù)不能定義長度
as
v_ename varchar2(10); -- 變量要定義長度
begin
select ename into v_ename from emp where EMPNO = P_EMPNO;
return v_ename;
-- 定義異常
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end;
select F_ENAME(7369)
FROM DUAL;
開發(fā)自定義函數(shù),返回 數(shù)字的階乘,例如:SELECT F_factorial(4) FROM DUAL;
create or replace function F_factorial(P_N number) return number -- 參數(shù)不能定義長度
as
v1 number := 1; -- 臨時(shí)存放累加值
begin
for i in 1..P_N
loop
v1 := v1 * i;
end loop;
return v1;
-- 定義異常
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end;
SELECT F_factorial(4) FROM DUAL;
開發(fā)自定義函數(shù),比較兩個(gè)數(shù)字的大小 P_MAX_MIN(M NUMBER,N NUMBER)返回比較大的值;
create or replace function P_MAX_MIN(M NUMBER, N NUMBER) return number
as
temp number;
begin
if M > N THEN
temp := M;
else
temp := N;
end if;
return temp;
end;
select P_MAX_MIN(12, 9) from DUAL;
創(chuàng)建一個(gè)函數(shù),函數(shù)的功能是根據(jù)傳入的一個(gè)崗位名稱,將這個(gè)崗位的員工數(shù)量返回
create or replace function F_AMOUNT(P_JOB VARCHAR2) return number
as
v_ct number;
begin
select count(1) into v_ct from emp where JOB = P_JOB;
return v_ct;
end;
select F_AMOUNT('MANAGER') from DUAL;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
ORA-02298: 無法驗(yàn)證 (約束)提示未找到父項(xiàng)關(guān)鍵字的解決辦法
這篇文章主要介紹了ORA-02298: 無法驗(yàn)證 (約束)提示未找到父項(xiàng)關(guān)鍵字的解決辦法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Linux下安裝Oracle 11g出現(xiàn)prvf-0002錯(cuò)誤解決辦法
這篇文章主要介紹了Linux下安裝Oracle 11g出現(xiàn)prvf-0002錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Oracle數(shù)據(jù)庫將表數(shù)據(jù)轉(zhuǎn)儲(chǔ)為JSON格式文件的詳細(xì)步驟
這篇文章主要介紹了如何將Oracle數(shù)據(jù)庫表數(shù)據(jù)轉(zhuǎn)儲(chǔ)為JSON格式文件的詳細(xì)步驟,包括所需參數(shù)、數(shù)據(jù)庫連接、數(shù)據(jù)獲取和保存JSON文件等,需要的朋友可以參考下2025-11-11
oracle 發(fā)送郵件 實(shí)現(xiàn)方法
oracle 發(fā)送郵件 實(shí)現(xiàn)方法2009-05-05
Oracle9iPL/SQL編程的經(jīng)驗(yàn)小結(jié)
Oracle9iPL/SQL編程的經(jīng)驗(yàn)小結(jié)...2007-03-03
rman恢復(fù)方案和oracle異機(jī)恢復(fù)
這篇文章主要介紹了rman恢復(fù)方案和oracle異機(jī)恢復(fù),需要的朋友可以參考下2014-03-03
oracle11g密碼復(fù)雜性校驗(yàn)開啟關(guān)閉方式
這篇文章主要介紹了oracle11g密碼復(fù)雜性校驗(yàn)開啟關(guān)閉方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

