Halo数据库Oracle模式功能演示,支持带有out参数的Function,返回任意数据类型

在原生的pg中,在对待out参数时,如果是多个out参数,会强制要求返回值类型为record。如果是单个out参数,返回值类型必须和此out参数类型一致,且不再允许使用return返回其余任何数据,否则将会报错。
-- 原生plpgsql-- 多个out参数CREATE OR REPLACE FUNCTION fout(a VARCHAR, out b VARCHAR, out c int)  RETURNS record -- 必须为recordAS $$BEGIN  b := a;  c := 101;END $$ language plpgsql;

select * from fout('a'); b | c ---+----- a | 101
drop function fout;-- 单个out参数create or replace function fout(a int, out b int)returns int -- 类型out参数一致as $$declarebegin b = a;    return ; -- 可以不写return,但不允许出现类似return xxx;的语句 否则报错end$$language plpgsql;
select * from fout(25); b ---- 25 drop function fout;  -- 当函数存在out参数,我们尝试设置返回类型,并返回对应的类型数据时 -- 会出现以下错误CREATE OR REPLACE FUNCTION fout(a VARCHAR, out b VARCHAR, out c int) RETURNS int -- 设置返回int类型AS $$BEGIN b := a; c := 101; return 102; -- return 语句END $$ language plpgsql;ERROR: function result type must be record because of OUT parameters
create or replace function fout(a int, out b int)returns int as $$declarebegin b = a; return 25; -- 单out参数 return xxx; 报错end$$language plpgsql;ERROR: RETURN cannot have a parameter in function with OUT parameters
通过上述的测试,我们可以看到原生plpgsql在此处应用的短板,下面简单来Halo_Oracle在此处的表现。
 -- 单out参数 返回integer类型数据create or replace function fout(a integer,  b out integer)  return integeras begin b := 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 varchar2ASBEGIN b := 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;begin b := 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
接下来我们写段简单的java代码测试一下,看一下Halo是否支持调用此类function。
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(); } } }}
java调用函数运行结果如下图所示:

至此Halo_Oracle模式关于对带out参数,并有声明实际返回类型的函数的功能支持,简单演示完毕。如果文中存在问题或者存在某些疑惑,欢迎大家指正和讨论。


end



微信号|Halo Tech


请使用浏览器的分享功能分享到微信等