上代码先:
CREATE OR REPLACE FUNCTION reg_role_avatar(IN _role_uuid character, IN _role_user_uuid character, IN _role_server_id integer, IN _role_name character, IN _role_avatar_gender integer, IN _role_avatar_hide_hat boolean, IN _role_avatar_hide_eyes boolean, IN _place integer, IN _item_uuids character varying[], IN _base_keys character varying[], IN _item_girds integer[], IN _item_is_bindings boolean[], IN _item_valid integer[], OUT _cord boolean, OUT _date timestamp without time zone) RETURNS record AS $BODY$ begin _cord =true; _date=clock_timestamp(); insert into roles( role_uuid, role_user_uuid ,role_server_id ,role_name , role_avatar_gender , role_avatar_hide_hat , role_avatar_hide_eyes ,role_create_date )values ( _role_uuid , _role_user_uuid , _role_server_id ,_role_name , _role_avatar_gender ,_role_avatar_hide_hat , _role_avatar_hide_eyes , _date); FOR i IN 1..array_length(_item_uuids,1) LOOP insert into items( item_uuid , item_role_uuid ,item_base_key , item_place , item_gird , item_is_binding ,item_valid, item_buy_date )values( _item_uuids[i] , _role_uuid , _base_keys[i] , _place , _item_girds[i] , _item_is_bindings[i] ,_item_valid[i], _date); END LOOP; EXCEPTION WHEN OTHERS THEN ROLLBACK; _cord =false; commit; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100;
回滚使用如下:
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
如果出现异常,则回滚(ROLLBACK)
再说说psql(PostgreSQL简称)的数组
上面的那个例子也有数组的使用方法,可能内容有点多,下面还有个简单点的测试用例:
存储过程支持基本的数据类型作为数组参数
测试通过的数据类型有:boolean ,int ,String
CREATE OR REPLACE FUNCTION test_boolean_array(IN _array boolean[], OUT _done boolean) RETURNS boolean AS $BODY$ begin _done=_array[2]; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100;
使用boolean[] 数组作为参数传入
有一点要注意,psql中的数组是人1开始的,也就是说,在java中boolean[0]对应于psql中的boolean[1]
上面的存储过程只做了两件事,接收一个boolean数组作为参数传入,然后输出数组的boolean[1](java中的boolean[0])
在java中的代码如下:
public int testBooleanArray() { boolean done =false; CallableStatement cs = null; Connection connection = null; Array sqlArray = null; try { connection = JDBServer.instance().getCommonDBConnection(); connection.setAutoCommit(false); sqlArray = connection.createArrayOf("boolean", new Boolean[] {false, true}); cs = connection.prepareCall("{call test_boolean_array(?,?)}"); cs.setArray(1, sqlArray); cs.registerOutParameter(2, Types.BOOLEAN); cs.executeUpdate(); done = cs.getBoolean(2); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (cs != null) cs.close(); if (connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } } System.out.println("done=" + done); return 0; }
创建一个数组(Array),SQL中的数据要用connection创建
sqlArray = connection.createArrayOf("boolean", new Boolean[] {false, true});
剩下就是注册输出了,没什么了!
再大概说下int 和String 数组在PSQL中的使用吧:
CREATE OR REPLACE FUNCTION test(IN _array integer[], OUT _done integer) RETURNS integer AS $BODY$ begin _done=_array[1]; end;
java中
sqlArray = connection.createArrayOf("int4", new Integer[] {1, 20});
记住,是int4
CREATE OR REPLACE FUNCTION test_string_array(IN _array character varying[], OUT _done character varying) RETURNS character varying AS $BODY$ begin _done=_array[1]; end; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100;
java 中
connection.createArrayOf("varchar", new String[] {"test1","test2"});