postgresql下儲存過程的寫法

2021-04-22 02:44:04 字數 2314 閱讀 4548

在當前這個專案裡(empress),我主要應用到了兩種 服務端程式語言:擴充套件sql中的查詢語言函式(sql)和pl/pgsql sql過程語言。前者僅包括了簡單的sql語句,後者還包括了一些條件、迴圈控制等。

這些函式都可以存放在文字中,使用i 命令匯入到db中即可。

首先是sql的例子:

create or replace function set_relation_done(integer, integer) returns void as $$

update relations set done=true where userid=$1 and friendid=$2;

$$ language sql;

這是乙個沒有返回值的函式,第一行和第三行是很格式化的東西,中間的才是正文,實現update的功能,可以看出,它和直接的sql語句沒有太大的區別。

create or replace function get_relation_is_done(integer, integer, out done boolean) as $$

select done from relations where userid=$1 and friendid=$2;

$$ language sql;

drop type tag_count_t cascade;

create type tag_count_t as (tag text, count integer);

create or replace function get_my_tags(integer, integer) returns setof tag_count_t as $$

select tag, use_count from friend_tags where friendid=$1 and use_count>0 order by  

use_count desc limit $2;

$$ language sql;

也可以構造有返回值的函式,如果是簡單型別的返回值,可以很方便的放在引數的out修飾符後面(當然也可以returns),如果是較複雜的setof等,就要放在returns後面了。這裡,不需要顯式的return語句,最後一條有返回值的sql語句的結果將被作為結果返回。這時,需要保證返回值的存在和型別匹配。

然後是plpgsql語言的例子:

create or replace function insert_friend_tags(id integer, to_tags text) returns void as $$

declare

to_tags_a text;

begin

to_tags_a := string_to_array(to_tags, ',');

for i in array_lower(to_tags_a, 1)..array_upper(to_tags_a, 1) loop

insert into friend_tags (friendid, tag) values(id, to_tags_a[i]::text);

end loop;

end;

$$ language plpgsql;

create or replace function get_unrelation_friend_ids(integer, text) returns setof tag_ids_t as $$

declare

friend_ids integer;

num integer;

un_friend_ids tag_ids_t;

begin

friend_ids := string_to_array($2, ',');

for i in array_lower(friend_ids, 1)..array_upper(friend_ids,1) loop

perform friendid from relations where userid=$1 and friendid=friend_ids[i]::integer;

if found then

continue;

else

select into un_friend_ids friend_ids[i]::integer;

return next un_friend_ids;

end if;

end loop;

return;

end;

$$ language plpgsql;

有返回值的時候,需要return next和return配合使用。if found可以用來檢驗上一條語句的執行狀態,不僅針對select、perform,甚至update、insert等都可以。

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儲存過程(函式)

create or replace function function name 引數逗號隔開 returns 返回值型別 as body declare 宣告變數 變數名 變數型別 變數值 例如 name char 20 su begin 函式體 包括dml語句 特別注意 如果有返回值,要省略最後...