PostgreSQL儲存過程(函式)

2021-09-27 03:51:12 字數 3115 閱讀 1141

create [or replace] function function_name(引數逗號隔開) returns 返回值型別 as $body$

declare//宣告變數

變數名 變數型別 :=變數值;

例如:name char(20):='su';

begin

/*函式體;包括dml語句;

特別注意:如果有返回值,要省略最後的return語句的話,則在函式體的最後必須是乙個select語句且返回型別必須和上面宣告的型別一樣;

*/return 變數名//和上面返回的變數一樣;

end$body$

language 'plpgsql';

二、控制語句

1、if 條件(五種形式)

if … then

if … then … else

if … then … else if

if … then … elsif … then … else

if … then … elseif … then … else(注:elseif 是elsif 的別名)

2、迴圈

使用loop,exit,continue,while, 和for 語句,可以控制pl/pgsql 函式重複一系列命令。

1)、loop

[ <> ]

loop

statements

end loop [ label ];

loop 定義乙個無條件的迴圈,無限迴圈, 直到由exit或者return語句終止。可選的label 可以由exit 和continue 語句使用, 用於在巢狀迴圈中宣告應該應用於哪一層迴圈。

2)、exit

exit [ label ] [ when expression ];

如果沒有給出label, 那麼退出最內層的迴圈,然後執行跟在 end loop 後面的語句。 如果給出 label, 那麼它必須是當前或者更高層的巢狀迴圈塊或者語句塊的標籤。然後該命名塊或者迴圈就會終止,而控制落到對應迴圈/塊的 end 語句後面的語句上。

如果宣告了when,迴圈退出只有在expression 為真的時候才發生, 否則控制會落到exit 後面的語句上。

exit 可以用於在所有的迴圈型別中,它並不僅僅限制於在無條件迴圈中使用。在和 begin 塊一起使用的時候,exit 把控制交給塊結束後的下乙個語句。

例如:loop 迴圈

if … then 條件判斷

exit ; 條件成立,則退出迴圈。

end if;

end loop;

3)、continue

continue [label ] [ whenexpression ];

如果沒有給出 label,那麼就開始最內層的迴圈的下一次執行。也就是說,控制傳遞歸給迴圈控制表示式(如果有),然後重新計算迴圈體。 如果出現了label,它宣告即將繼續執行的迴圈的標籤。

如果宣告了 when,那麼迴圈的下一次執行只有在expression 為真的情況下才進行。否則,控制傳遞給continue 後面的語句。

continue 可以用於所有型別的迴圈; 它並不僅僅限於無條件迴圈。

例如:loop

一些計算

exit when count > 100;

continue when count < 50;

一些在count 數值在 [50 … 100] 裡面時候的計算

end loop;

4)、while

[ <> ]

while expression loop

statements

end loop [ label ];

只要條件表示式為真,while語句就會不停在一系列語句上進行迴圈. 條件是在每次進入迴圈體的時候檢查的.

例如:while amount_owed > 0 and gift_certificate_balance > 0 loop

– 可以在這裡做些計算

end loop;

while not boolean_expression loop

– 可以在這裡做些計算

end loop;

5)、for(整數變種)

[ <> ]

for name in [ reverse ] expression … expression loop

statements

end loop [ labal ];

這種形式的for對一定範圍的整數數值進行迭代的迴圈。變數name 會自動定義為integer型別並且只在迴圈裡存在。給出範圍上下界的兩個表示式在進入迴圈的時候計算一次。 迭代步進值總是為 1,但如果宣告了reverse就是 -1。

一些整數for迴圈的例子∶

for i in 1…10 loop 表示1迴圈到10

這裡可以放一些表示式

raise notice 『i is %』, i;

end loop;

for i in reverse 10…1 loop

這裡可以放一些表示式

end loop;

如果下界大於上界(或者是在 reverse 情況下是小於),那麼迴圈體將完全不被執行。而且不會丟擲任何錯誤。

3、異常捕獲

exception

when 錯誤碼(如:string_data_right_truncation:字串資料右邊被截斷) then

/*後台列印錯誤資訊/

raise notice 『錯吳資訊』;

三、鏈結運算子

在postgresql中鏈結運算子是:||而不是+;

四、**示例

create or replace function f_test() returns void as $$

declare

begin

for i in 1..1000 loop

execute 'insert into test select generate_series('||(i-1)*40000+1||','||i*40000||'),(random()::float)*'||i*0.0001||',clock_timestamp()';

end loop;

end;

$$ language plpgsql;

Postgresql儲存過程

pg的儲存過程與oracle的稍微有點不一樣,它的結構是這樣的 語法 create or replace function function name arg1,arg2.returns return type as body declare 變數宣告 begin 函式體end body langu...

postgresql之儲存過程

特性 儲存過程舉例 1 引數列表只包含函式輸入引數,不包含輸出引數 儲存過程定義 create or replace function add a integer,b numeric returns numeric as select a b language sql 呼叫方法 select add...

postgresql儲存過程輸出引數

postgresql不區分儲存過程和函式,即這兩個是乙個東西。儲存過程通常用於比較複雜的操作中。建立儲存過程時 create or replace function 儲存過程名稱這個or replace是如果存在同名的儲存過程則替換,如果是第一次建立這個儲存過程的話可以不加or replace 儲存...