金倉資料庫KingbaseES儲存過程 RETURN語句

arthemis發表於2023-03-31

 

1、RETURN

如果沒有使用表示式,RETURN 命令用於告訴這個函式已經完成執行了,如示例2.

如果返回標量型別,那麼可以使用任何表示式。 

示例1: 帶有表示式return

CREATE OR REPLACE FUNCTION getCompFoo1(in_col1 int, in_col2 TEXT)RETURNS compfooAS $$DECLARE
    comp compfoo;BEGIN
    comp.f1 := in_col1 + 1;
    comp.f2 := in_col2 || '_result';
    RETURN comp;END;
$$ LANGUAGE PLPGSQL;


compfoo 為自定義型別:CREATE TYPE compfoo AS (f1 int, f2 text); 

函式返回結果:

test=# select getCompFoo1(1,'a');                                                                            
 getcompfoo1 
--------------
 (2,a_result)
(1 row)


如果宣告函式帶輸出引數,那麼就只需要寫無表示式的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;

函式返回結果:

test=# select getCompFoo2(1,'a');
 getcompfoo2 
--------------
 (2,a_result)
(1 row)

示例2:不帶有表示式return

如果宣告函式返回void,那麼一個RETURN語句可以用於提前退出函式; 但是不要在RETURN後面寫一個表示式。 

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


函式返回結果:

test=# select getreturn(1);NOTICE:  there is 1
 getreturn
-----------
(1 row)
test=# select getreturn(0);
 getreturn
-----------
 (1 row)


2、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;


返回結果:

test=# select getAllFoo();
  getallfoo 
-------------
 (1,2,three)
 (4,5,six)
 (2 rows)



3、RETURN QUERY 

語法:

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

  示例1:將一條查詢的結果追加到一個函式的結果集中。

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;

返回結果:

test=# select getAllFoo2();
 getallfoo2 
-------------
 (1,2,three)
 (4,5,six)
(2 rows)

示例2:執行動態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;

執行結果:

test=# select getAllFoo3(1);
 getallfoo3
------------
 (4,5,six)
(1 row)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004805/viewspace-2942946/,如需轉載,請註明出處,否則將追究法律責任。

相關文章