PostgreSQL自定義函數(shù)并且調(diào)用方式
一、背景
在PostgreSQL關(guān)系型數(shù)據(jù)庫中,我們經(jīng)常是調(diào)用系統(tǒng)默認(rèn)的函數(shù),例如lower() ,arry_to_string()等等,但有時候特殊的需求,默認(rèn)的函數(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默認(rèn)參數(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'); --編程語言_java
3、根據(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ù)準(zhǔn)備
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');--2
3、動態(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高級應(yīng)用之行轉(zhuǎn)列&匯總求和的實現(xiàn)思路
這篇文章主要介紹了postgresql高級應(yīng)用之行轉(zhuǎn)列&匯總求和的實現(xiàn)思路,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05postgresql 導(dǎo)入數(shù)據(jù)庫表并重設(shè)自增屬性的操作
這篇文章主要介紹了postgresql 導(dǎo)入數(shù)據(jù)庫表并重設(shè)自增屬性的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01使用Postgresql 實現(xiàn)快速插入測試數(shù)據(jù)
這篇文章主要介紹了使用Postgresql 實現(xiàn)快速插入測試數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgreSql分組統(tǒng)計數(shù)據(jù)的實現(xiàn)代碼
這篇文章給大家介紹postgreSql的監(jiān)控記錄表里多條不同時間的數(shù)據(jù),只取最新的數(shù)據(jù),并分組統(tǒng)計,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-12-12postgresql 刪除重復(fù)數(shù)據(jù)案例詳解
這篇文章主要介紹了postgresql 刪除重復(fù)數(shù)據(jù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Navicat設(shè)置PostgreSQL數(shù)據(jù)庫的表主鍵ID自增的方法
這篇文章主要介紹了Navicat設(shè)置PostgreSQL數(shù)據(jù)庫的表主鍵ID自增的方法,文章通過圖文結(jié)合的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-06-06詳解PostgreSQL提升批量數(shù)據(jù)導(dǎo)入性能的n種方法
這篇文章主要介紹了PostgreSQL提升批量數(shù)據(jù)導(dǎo)入性能的n種方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03postgresql 實現(xiàn)修改jsonb字段中的某一個值
這篇文章主要介紹了postgresql 實現(xiàn)修改jsonb字段中的某一個值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01