PostgreSQL自定義函數(shù)并且調(diào)用方式
一、背景
在PostgreSQL關(guān)系型數(shù)據(jù)庫中,我們經(jīng)常是調(diào)用系統(tǒng)默認的函數(shù),例如lower() ,arry_to_string()等等,但有時候特殊的需求,默認的函數(shù)無法實現(xiàn)轉(zhuǎn)換,那么就需要通過自定義函數(shù),并且調(diào)用我們自定義的函數(shù)實現(xiàn)數(shù)據(jù)的轉(zhuǎn)換。
二、函數(shù)語法
CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; $variable_name$ LANGUAGE plpgsql;說明
function_name:指定函數(shù)的名稱。
[OR REPLACE]:是可選的,它允許您修改/替換現(xiàn)有函數(shù)。
arguments:函數(shù)參數(shù)[[argmode]argname argtype [default value],[[argmode]argname argtype],[…]];argmode參數(shù)的模式有IN、OUT或則INOUT,缺省值是IN。argname參數(shù)名字。argtype參數(shù)的數(shù)據(jù)類型。default默認參數(shù)。
RETURNS:它指定要從函數(shù)返回的數(shù)據(jù)類型。它可以是基礎(chǔ),復(fù)合或域類型,或者也可以引用表列的類型,比如return int、varchar,返回結(jié)果集時就需要setof來表示,無返回值使用void。如果存在OUT或則INOUT參數(shù),則可以省略RETURNS子句。
return_datatype:表示返回值類型。
function_body:function_body包含可執(zhí)行部分。
LANGUAGE:它指定實現(xiàn)該函數(shù)的語言的名稱。
三、異常處理語法
在PostgreSQL中可以利用RAISE語句報告信息和拋出錯誤,其聲明形式為:
RAISE LEVEL 'format' [,expression,[...]]
說明:
LEVEL:包含的級別有DEBUG(向服務(wù)器日志寫信息)、LOG(向服務(wù)器日志寫信息,優(yōu)先級更高)、INFO、NOTICE和WARNING(把信息寫到服務(wù)器日志以及轉(zhuǎn)發(fā)到客戶端應(yīng)用,優(yōu)先級逐步升高)和EXCEPTION拋出一個錯誤(通常退出當(dāng)前事務(wù))。某個優(yōu)先級別的信息是報告給客戶端還是寫到服務(wù)器日志,還是兩個均有,是由log_min_messages和client_min_messages這兩個系統(tǒng)初始化參數(shù)控制的。
四、自定義函數(shù)示例
1、format函數(shù)
用于根據(jù)格式字符串設(shè)置參數(shù)的FORMAT()函數(shù)格式:
FORMAT(format_string [, format_arg [, ...] ])
示例:
SELECT FORMAT('Hello, %s', 'world!!');執(zhí)行結(jié)果:Hello, world!!
2、使用default參數(shù)
create or replace function ftest(in fname VARCHAR default '編程語言', cname VARCHAR DEFAULT 'java')
RETURNS VARCHAR as $$
begin
return format('%s_%s',fname,cname);
end; $$ LANGUAGE plpgsql;調(diào)用方式:
select ftest('語言'); --語言_java
select ftest(cname=>'java'); --編程語言_java3、根據(jù)輸入的數(shù)字,返回兩個數(shù)的商,若除數(shù)為0,則拋出自定義異常
CREATE OR REPLACE FUNCTION testdivision ( js1 INT, js2 INT ) RETURNS INT AS $$ DECLARE v_re INT; BEGIN raise notice'% 除以 %', js1, js2; IF js2 = 0 THEN raise EXCEPTION '不能除0'; ELSE v_re := js1 / js2; RETURN v_re; END IF; EXCEPTION --捕獲異常 WHEN OTHERS THEN RETURN 0; END; $$ LANGUAGE plpgsql;
調(diào)用方式:
select testdivision(8,4);--2 select testdivision(3,0);--0
4、多個OUT或者INOUT參數(shù)時,返回是一個元組;可以通過將函數(shù)調(diào)用放在 FROM 子句中來返回元組的各個成員
create or replace FUNCTION test1(in js1 int,inout res1 int,out res2 int) as $$ begin res1:=js1*2; res2:=res1*3; end; $$ LANGUAGE plpgsql;
調(diào)用方式:
select test1(3,2); --test1
--(6,18)
select * from test1(3,2);--res1|res2
-- 6| 18五、動態(tài)執(zhí)行語句
1、數(shù)據(jù)準備
create table tmp(
bsm VARCHAR(100),
name VARCHAR(100),
num int
);
insert into tmp(bsm,name,num) VALUES('a','蘋果',21);
insert into tmp(bsm,name,num) VALUES('b','香蕉',11);2、示例:動態(tài)查詢某張表的記錄數(shù)
create or replace function getsum(in talename VARCHAR)
RETURNS int as $$
DECLARE
stmt VARCHAR;
count int;
begin
stmt:=format('select count(1) from %s', talename);
raise notice '%',stmt;
EXECUTE stmt into count;
return count;
EXCEPTION --捕獲異常
WHEN OTHERS THEN
RETURN 0;
end; $$ LANGUAGE plpgsql;調(diào)用方式:
select getsum('tmp');--23、動態(tài)創(chuàng)建表
create or replace function copytable(tablename varchar,times int)
RETURNS INT as $$
DECLARE
stmt VARCHAR='create table %s_%s (like tmp including all);';--
begin
for i in 1..times loop
raise notice 'd當(dāng)前次數(shù)%',i;
raise notice '%',format(stmt,tablename,i,tablename);
EXECUTE format('drop table if EXISTS %s_%s;',tablename,i) ;
EXECUTE format(stmt,tablename,i,tablename) ;
end loop;
return 0;
END; $$ LANGUAGE plpgsql;調(diào)用方式:
select copytable('tmp',2);即復(fù)制tmp表2次到此這篇關(guān)于PostgreSQL如何自定義函數(shù)并且調(diào)用的文章就介紹到這了,更多相關(guān)PostgreSQL自定義函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng)的方法
這篇文章主要介紹了使用PostgreSQL數(shù)據(jù)庫建立用戶畫像系統(tǒng),下面使用一個具體的例子來說明如何使用PostgreSQL的json數(shù)據(jù)類型來建立用戶標簽數(shù)據(jù),需要的朋友可以參考下2022-10-10
使用postgresql 模擬批量數(shù)據(jù)插入的案例
這篇文章主要介紹了使用postgresql 模擬批量數(shù)據(jù)插入的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL 實現(xiàn)distinct關(guān)鍵字給單獨的幾列去重
這篇文章主要介紹了PostgreSQL 實現(xiàn)distinct關(guān)鍵字給單獨的幾列去重,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Postgresql之時間戳long,TimeStamp,Date,String互轉(zhuǎn)方式
這篇文章主要介紹了Postgresql中的時間戳long,TimeStamp,Date,String互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

