参数模式总共有三种,分别是IN(传入参数,这个是默认方式)、OUT(返回值参数)、INOUT(传入返回值参数),下面介绍这几个参数模式的用法。
IN 模式
IN 模式指的是执行函数时需要输入参数值,如下所示。
teledb=# CREATE OR REPLACE FUNCTION f1(IN a_xm text) RETURNS TEXT AS
teledb-# $$
teledb$# BEGIN
teledb$# RETURN a_xm;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# SELECT f1('teledb');
f1
---------
teledb
(1 row)
teledb=# CREATE OR REPLACE FUNCTION f1(a_xm text) RETURNS TEXT AS
$$
BEGIN
RETURN a_xm;
END;
$$
LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# SELECT * from f1('teledb');
f1
---------
teledb
(1 row)
上面两种方式定义的参数效果是一样的。
OUT 模式
OUT 模式参数是指定了函数执行时返回的字段名及类型。
teledb=# CREATE OR REPLACE FUNCTION f1(OUT a_xm text) RETURNS TEXT AS
teledb-# $$
teledb$# BEGIN
teledb$# a_xm:= 'teledb';
teledb$# END;
teledb$# $$
teledb-# LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=#
teledb=# SELECT * from f1();
a_xm
---------
teledb
(1 row)
采用OUT模式参数不能用 RETURN 返回,而是要对返回的OUT参数直接赋值。返回值类型与参数的数据类型必需一致。参数名就是返回的字段名。
INOUT 模式
INOUT模式是指参数即传入,同时又指定了返回值的字段名和类型。
teledb=# CREATE OR REPLACE FUNCTION f1(INOUT a_xm text) RETURNS TEXT AS
teledb-# $$
teledb$# BEGIN
teledb$# END;
teledb$# $$
teledb-# LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# SELECT * from f1('teledb');
a_xm
---------
teledb
(1 row)
值得注意的是,上面的函数跟下面的函数是相同的,即重新定义会覆盖掉。
teledb=# CREATE OR REPLACE FUNCTION f1(IN a_xm text) RETURNS TEXT AS
$$
BEGIN
RETURN a_xm;
END;
$$
LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# SELECT * from f1('teledb');
f1
---------
teledb
(1 row)
VARIADIC 模式
VARIADIC模式是参数个数可变模式,系统用一个数组对传入的参数进行处理,VARIADIC参数必需是所有最后一个声明,如下所示。
teledb=# CREATE OR REPLACE FUNCTION f1(VARIADIC a_int integer[]) RETURNS void AS
teledb-# $$
teledb$# BEGIN
teledb$# RAISE NOTICE 'a_int = %',a_int;
teledb$# RAISE NOTICE 'a_int[1] = %',a_int[1];
teledb$# END;
teledb$# $$
teledb-# LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# select f1(1);
NOTICE: a_int = {1}
NOTICE: a_int[1] = 1
f1
----
(1 row)
teledb=# select f1(1,2);
NOTICE: a_int = {1,2}
NOTICE: a_int[1] = 1
f1
----
(1 row)
teledb=# CREATE OR REPLACE FUNCTION f1(a_xm TEXT,VARIADIC a_int integer[]) RETURNS void AS
teledb-# $$
teledb$# BEGIN
teledb$# RAISE NOTICE 'a_int = %',a_int;
teledb$# RAISE NOTICE 'a_int[1] = %',a_int[1];
teledb$# RAISE NOTICE 'a_xm = %',a_xm;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=#
teledb=# select f1('teledb',1,2);
NOTICE: a_int = {1,2}
NOTICE: a_int[1] = 1
NOTICE: a_xm = teledb
f1
----
(1 row)