PostgreSQL存儲過程(4)-return語句


1. return語句

有三個命令可以用來從函數中返回數據:

  • RETURN
  • RETURN NEXT
  • RETURN QUERY

 2. RETURN命令

 語法:

RETURN
RETURN expression;

如果沒有使用表達式 RETURN命令用於告訴這個函數已經完成執行了。
如果返回標量類型,那么可以使用任何表達式.要返回一個復合(行)數值,你必須寫一個記錄或者行變量的expression。

2.1 案例1:帶有表達式return案例

CREATE OR REPLACE FUNCTION getCompFoo1
(in_col1 int, in_col2 TEXT)
RETURNS compfoo
AS $$
DECLARE 
    lottu compfoo;
BEGIN
    lottu.col1 := in_col1 + 1;
    lottu.col2 := in_col2 || '_result';
    RETURN lottu;
END;
$$ LANGUAGE PLPGSQL;

  如果你聲明函數帶輸出參數,那么就只需要寫無表達式的RETURN。 那么輸出參數變量的當前值將被返回。 

CREATE OR REPLACE FUNCTION getCompFoo2
(in_col1 IN int,in_col2 IN TEXT,
 out_col1 OUT int, out_col2 OUT TEXT)
AS $$
BEGIN
    out_col1 := in_col1 + 1;
    out_col2 := in_col2 || '_result';
END;
$$ LANGUAGE PLPGSQL;

2.2 案例2:不帶有表達式return案例

如果你聲明函數返回void,那么一個RETURN語句可以用於提前退出函數; 但是不要在RETURN后面寫一個表達式。

CREATE OR REPLACE FUNCTION getreturn(in_col1 int)
RETURNS void
AS $$
BEGIN
    if in_col1 > 0 then
      RAISE NOTICE 'there is %',in_col1;
    else
      return;
    end if;
END;
$$ LANGUAGE PLPGSQL;

3. RETURN NEXT命令

語法:

RETURN NEXT expression;

3.1 RETURN NEXT命令

可以用於標量和復合數據類型;對於復合類型,將返回一個完整的結果"table"。

CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, 'three');
INSERT INTO foo VALUES (4, 5, 'six');

CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
$$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN SELECT * FROM foo WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$$ LANGUAGE PLPGSQL;

4. RETURN QUERY命令

語法:

RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

4.1 RETURN QUERY命令

  將一條查詢的結果追加到一個函數的結果集中。

CREATE OR REPLACE FUNCTION getAllFoo2() RETURNS SETOF foo AS
$$
DECLARE
    r foo%rowtype;
BEGIN
    RETURN QUERY SELECT * FROM foo WHERE fooid > 0;
END
$$ LANGUAGE PLPGSQL;

4.2 RETURN QUERY EXECUTE命令

是執行動態SQL。

CREATE OR REPLACE FUNCTION getAllFoo3(filter numeric) RETURNS SETOF foo AS
$$
BEGIN
    RETURN QUERY EXECUTE 'SELECT * FROM foo WHERE fooid > $1
USING filter;
; END $$ LANGUAGE PLPGSQL;

 


免責聲明!

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



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