

-- 原生plpgsql-- 多个out参数CREATE OR REPLACE FUNCTION fout(a VARCHAR, out b VARCHAR, out c int)RETURNS record -- 必须为recordAS $$BEGINb := a;c := 101;END $$ language plpgsql;select * from fout('a');b | c---+-----a | 101drop function fout;-- 单个out参数create or replace function fout(a int, out b int)returns int -- 类型out参数一致as $$declarebeginb = a;return ; -- 可以不写return,但不允许出现类似return xxx;的语句 否则报错end$$language plpgsql;select * from fout(25);b----25drop function fout;-- 当函数存在out参数,我们尝试设置返回类型,并返回对应的类型数据时-- 会出现以下错误CREATE OR REPLACE FUNCTION fout(a VARCHAR, out b VARCHAR, out c int)RETURNS int -- 设置返回int类型AS $$BEGINb := a;c := 101;return 102; -- return 语句END $$ language plpgsql;ERROR: function result type must be record because of OUT parameterscreate or replace function fout(a int, out b int)returns intas $$declarebeginb = a;return 25; -- 单out参数 return xxx; 报错end$$language plpgsql;ERROR: RETURN cannot have a parameter in function with OUT parameters
-- 单out参数 返回integer类型数据create or replace function fout(a integer, b out integer)return integerasbeginb := a;return 26;end;/declareb integer;ret integer;beginret := fout(25,b);dbms_output.put_line('ret = '||ret||' b = '||b);end;/ret = 26 b = 25drop function fout;-- 多个out参数返回varchar2CREATE OR REPLACE FUNCTION fout(a integer, b OUT integer, c OUT integer)RETURN varchar2ASBEGINb := a;c := 26;RETURN 'fout';END;/declareb integer;c integer;ret varchar;beginret := fout(25, b, c);dbms_output.put_line('ret = '||ret||' b = '||b||' c = '||c);end;/ret = fout b = 25 c = 26drop function fout;-- 返回自定义复合类型create type testtyp as object(typ_va integer,typ_vb varchar2(30));create or replace function fout(a integer, b out integer, c out integer) return testtypasva testtyp;beginb := a;c := 26;va := testtyp(null, null);va.typ_va := 27;va.typ_vb := 'foutfunc';return va;end;/declarevaa testtyp;b integer;c integer;beginvaa := fout(25, b, c);dbms_output.put_line('b = '|| b||' c = '|| c);dbms_output.put_line('vaa.typ_va = '||vaa.typ_va ||' vaa.typ_vb = '||vaa.typ_vb);end;/b = 25 c = 26vaa.typ_va = 27 vaa.typ_vb = foutfunc
public class TestMain {public static void main(String[] args) {String url = "jdbc:postgresql://127.0.0.1:1921/halo0root?escapeSyntaxCallMode=callIfNoReturn";Properties props = new Properties();props.setProperty("user","test");props.setProperty("password","test");Connection conn = null;CallableStatement cs = null;try {conn = DriverManager.getConnection(url, props);cs = conn.prepareCall("{? = CALL halo.fout(?,?,?)}");cs.registerOutParameter(1, Types.STRUCT);cs.setInt(2, 25);cs.registerOutParameter(3,Types.INTEGER);cs.registerOutParameter(4,Types.INTEGER);cs.execute();Object obj = cs.getObject(1);System.out.printf("b = %d c = %d%n", cs.getInt(3), cs.getInt(4));System.out.printf("ret: %s%n", obj.toString());} catch (Exception e) {e.printStackTrace();} finally {try {cs.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}}

end

微信号|Halo Tech