PostgreSQL存儲過程(1)-基於SQL的存儲過程


什么是SQL函數?

  • SQL函數包體是一些可執行的SQL語言。同時包含1條以上的查詢,但是函數只返回最后一個查詢(必須是SELECT)的結果。
  • 除非SQL函數聲明為返回void,否則最后一條語句必須是SELECT
  • 在簡單情況下,返回最后一條查詢結果的第一行。
  • 如果最后一個查詢不返回任何行,那么該函數將返回NULL值。
  • 如果需要該函數返回最后一條SELECT語句的所有行,可以將函數的返回值定義為集合,即SETOF sometype。

模板

CREATE OR REPLACE FUNCTION function_name([ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ])
[RETURNS rettype]
AS $$
    $BODY$;
$$ LANGUAGE SQL;

案例講解

案例1:編寫一個add函數;返回值為參數1+參數2.

CREATE OR REPLACE FUNCTION add(a NUMERIC, b NUMERIC)
RETURNS NUMERIC
AS $$
    SELECT a+b;
$$ LANGUAGE SQL;

調用方法

lottu=# select add(2,3);
 add 
-----
   5
(1 row)

lottu=# select * from add(2,3);
 add 
-----
   5
(1 row)

知識點:

聲明函數參數;以add函數來演示如果只指定輸入參數類型,不指定參數名,則函數體里一般用$1,$n這樣的標識符來使用參數。

CREATE OR REPLACE FUNCTION add3(NUMERIC,NUMERIC)
RETURNS NUMERIC
AS $$
SELECT $1 + $2;
$$ LANGUAGE SQL;

但該方法可讀性不好,建議還是采用前面一種的方法。

案例2:編寫一個add1函數;返回值為參數1+參數2.

上面這種方式參數列表只包含函數輸入參數,不包含輸出參數。下面這個例子將同時包含輸入參數和輸出參數;由於存在輸出參數;這里不需要returns部分

CREATE OR REPLACE FUNCTION add1(in a NUMERIC, in b NUMERIC,out c numeric)
AS $$
    SELECT a+b;
$$ LANGUAGE SQL;

調用方法

lottu=# select add1(7,4);
 add1 
------
   11

案例3:編寫一個plus_and_minus函數;返回值為參數1+參數2,參數1-參數2.

在函數定義中,可以寫多個SQL語句,不一定是SELECT語句,可以是其它任意合法的SQL。但最后一條SQL必須是SELECT語句並且該SQL的結果將作為該函數的輸出結果。

CREATE OR REPLACE FUNCTION plus_and_minus(IN a INTEGER, IN b NUMERIC, OUT c NUMERIC, OUT d NUMERIC)
AS $$
    SELECT a+b, a-b;
    delete from t where id > 9999;
    SELECT a-b, a+b;
$$ LANGUAGE SQL; 

調用方法

lottu=# select * from  plus_and_minus(7,5);
 c | d  
---+----
 2 | 12

案例4: 編寫一個不需要返回結果的delete_t函數

上面例子都有返回結果;且最后一條SQL必須是SELECT語句。假如需求不需要返回結果;請看下例。

CREATE OR REPLACE FUNCTION delete_t()
RETURNS void
AS $$
    delete from t where id > 999;
$$ LANGUAGE SQL;

調用方法

lottu=# select delete_t();
 delete_t 
----------

案例5:若表EMP存在多條記錄;結果會是?

返回最后一條查詢結果的第一行

CREATE OR REPLACE FUNCTION select_emp_1()
RETURNS numeric
AS $$
    select empno from emp;
$$ LANGUAGE SQL;

調用方法

lottu=# select select_emp_1();
 select_emp_1 
--------------
         7369

案例6:返回表emp所有記錄。

若需要該函數返回最后一條SELECT語句的所有行,可以將函數的返回值定義為集合,即SETOF sometype。

CREATE OR REPLACE FUNCTION select_emp_2()
RETURNS setof numeric
AS $$
    select empno from emp;
$$ LANGUAGE SQL;

調用方法

lottu=# select select_emp_2();
 select_emp_2 
--------------
         7369
         7499
         7521
         7566
         7654
         7698
         7782
         7788
         7839
         7844
         7876
         7900
         7902
         7934


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM