http://blog.csdn.net/cdnight/article/details/18082255

这里是一份经过再三调试测试而成功的postgres数据库单表crud存储过程,请注意,对于多结果的返回方式,请查看 getPageByCondition的书写方式,用的是refcursor,返回一个cursor,同时可以返回其他out,inout参数,但是 refcursor必须在事务中调用,所以java端的调用过程需要注意,好吧,我同时放出一份dal样板,大家可以直接copy来用。

  1. /******************************************************************
  2. * 表名:test3
  3. * Made by 码农下的天桥
  4. ******************************************************************/
  5. --use MYDB;--你可以指定自己的数据库
  6. /******************************************************************
  7. ****************************各种常用查询***************************
  8. ******************************************************************/
  9. ------------------------------------
  10. --用途:复杂形式的查询语句,用于查询分页数据。
  11. --这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
  12. --以免出现sql注入。
  13. --参数说明:
  14. ---_offset int 需要取的记录的开始位置
  15. ---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize
  16. ---_columns varchar(800) 需要获取的字段
  17. ---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
  18. ---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
  19. ---_totalCount int 返回总共记录条数。
  20. ---_totalPages int 返回总共页数。
  21. ------------------------------------
  22. create or replace function test3_getListByCondition(
  23. INOUT pageindex INT,
  24. INOUT pagesize INT,
  25. IN _columns VARCHAR(800),
  26. IN _where VARCHAR(800),
  27. IN _orderby VARCHAR(800),
  28. out _totalCount INT,
  29. out _totalPages INT)
  30. returns SETOF record
  31. AS
  32. $$
  33. DECLARE condition_columns VARCHAR(800);
  34. DECLARE condition_where varchar(800);
  35. DECLARE condition_orderby VARCHAR(800);
  36. DECLARE _dymatic_sql VARCHAR(1600);
  37. DECLARE _beginNO INT;
  38. DECLARE _dynamic_getCount varchar(1600);
  39. DECLARE _theOffset INT;
  40. DECLARE _tmpInt1 INT;
  41. BEGIN
  42. condition_where:=ltrim(rtrim(COALESCE(_where,'')));
  43. condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
  44. condition_columns:=ltrim(rtrim(COALESCE(_columns,'*')));
  45. --分析传过来的参数,构造动态sql语句。
  46. IF "character_length"(condition_where)>0 THEN
  47. IF strpos(condition_where, 'where ')!=1 THEN
  48. condition_where:='where ' || condition_where;
  49. END IF;
  50. END IF;
  51. --order by 语句构造
  52. IF "character_length"(condition_orderby)>0 THEN
  53. IF strpos(condition_orderby, 'order ')!=1 THEN
  54. condition_orderby:='order by '||condition_orderby;
  55. END IF;
  56. END IF;
  57.  
  58. --判断pageindex是否合法及pagesize是否合法
  59. IF pageindex<1 THEN
  60. pageindex:=1;
  61. END IF;
  62. IF pagesize<1 THEN
  63. pagesize:=20;
  64. END IF;
  65.  
  66. _dynamic_getCount:='select count(*) from test3 '||condition_where|| ' ' ;
  67. EXECUTE _dynamic_getCount INTO _totalCount;
  68.  
  69. IF _totalCount<1 THEN
  70. pageindex:=1;
  71. RETURN;
  72. END IF;
  73. --计算总共页数
  74. _tmpInt1:=_totalCount%pagesize;
  75. IF _tmpInt1=0 THEN
  76. _totalPages:=_totalCount / pagesize;
  77. ELSE
  78. _totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
  79. END IF;
  80.  
  81. IF _totalPages < pageindex then
  82. pageindex:=_totalPages;
  83. END IF;
  84.  
  85. _theOffset:=(pageindex-1) * pagesize+1;
  86.  
  87. _dymatic_sql:='select '||condition_columns||' from test3 '||condition_where||' '||condition_orderby||' limit '||pagesize||' '|| ' offset '||_theOffset||' ';
  88. --raise info '动态构造语句为:%',_dymatic_sql;
  89. return query EXECUTE _dymatic_sql;
  90. END;
  91. $$ language plpgsql VOLATILE;
  92.  
  93. ------------------------------------
  94. --用途:复杂形式的查询语句,用于查询多条记录数据。
  95. --这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
  96. --以免出现sql注入。
  97. --参数说明:
  98. ---_offset int 需要取的记录的开始位置
  99. ---_limit int 需要获取记录的总条数,针对分页而言,就是分页的pagesize
  100. ---_columns varchar(800) 需要获取的字段
  101. ---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
  102. ---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
  103. ---_totalCount int 返回总共记录条数。
  104. ------------------------------------
  105. create or replace function test3_getPageByCondition(
  106. INOUT pageindex INT,
  107. INOUT pagesize INT,
  108. IN _columns VARCHAR(800),
  109. IN _where VARCHAR(800),
  110. IN _orderby VARCHAR(800),
  111. out _totalCount INT,
  112. out _totalPages INT,
  113. out _refcursor refcursor
  114. )
  115. returns SETOF record
  116. AS
  117. $$
  118. DECLARE condition_columns VARCHAR(800);
  119. DECLARE condition_where varchar(800);
  120. DECLARE condition_orderby VARCHAR(800);
  121. DECLARE _dymatic_sql VARCHAR(1600);
  122. DECLARE _beginNO INT;
  123. DECLARE _dynamic_getCount varchar(1600);
  124. DECLARE _theOffset INT;
  125. DECLARE _tmpInt1 INT;
  126. BEGIN
  127. condition_where:=ltrim(rtrim(COALESCE(_where,'')));
  128. condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
  129. condition_columns:=ltrim(rtrim(COALESCE(_columns,'*')));
  130. --分析传过来的参数,构造动态sql语句。
  131. IF "character_length"(condition_where)>0 THEN
  132. IF strpos(condition_where, 'where ')!=1 THEN
  133. condition_where:='where ' || condition_where;
  134. END IF;
  135. END IF;
  136. --order by 语句构造
  137. IF "character_length"(condition_orderby)>0 THEN
  138. IF strpos(condition_orderby, 'order ')!=1 THEN
  139. condition_orderby:='order by '||condition_orderby;
  140. END IF;
  141. END IF;
  142.  
  143. --判断pageindex是否合法及pagesize是否合法
  144. IF pageindex<1 THEN
  145. pageindex:=1;
  146. END IF;
  147. IF pagesize<1 THEN
  148. pagesize:=20;
  149. END IF;
  150.  
  151. _dynamic_getCount:='select count(*) from test3 '||condition_where|| ' ' ;
  152. EXECUTE _dynamic_getCount INTO _totalCount;
  153.  
  154. IF _totalCount<1 THEN
  155. pageindex:=1;
  156. RETURN;
  157. END IF;
  158. --计算总共页数
  159. _tmpInt1:=_totalCount%pagesize;
  160. IF _tmpInt1=0 THEN
  161. _totalPages:=_totalCount / pagesize;
  162. ELSE
  163. _totalPages:=(_totalCount-_tmpInt1)/pagesize+1;
  164. END IF;
  165.  
  166. IF _totalPages < pageindex then
  167. pageindex:=_totalPages;
  168. END IF;
  169.  
  170. _theOffset:=(pageindex-1) * pagesize+1;
  171.  
  172. _dymatic_sql:='select '||condition_columns||' from test3 '||condition_where||' '||condition_orderby||' limit '||pagesize||' '|| ' offset '||_theOffset||' ';
  173. --raise info '动态构造语句为:%',_dymatic_sql;
  174. open _refcursor for EXECUTE _dymatic_sql;
  175. RETURN NEXT;
  176. END;
  177. $$ language plpgsql VOLATILE;
  178.  
  179. ------------------------------------
  180. --用途:获取其中一条记录
  181. ------------------------------------
  182. create or replace function test3_getRecord(in _id integer)
  183. returns SETOF test3
  184. AS
  185. $$
  186. BEGIN
  187. return query select * from test3 where t3id=_id LIMIT 1 OFFSET 0;
  188. END;
  189. $$ LANGUAGE plpgsql VOLATILE;
  190.  
  191. ------------------------------------
  192. --用途:复杂形式的查询语句,用于查询前面第几条记录,这个就相当好了
  193. --这个是泛用型的,假如你要根据用户输入去查询,那么最好不要用这个了,
  194. --以免出现sql注入。
  195. --参数说明:
  196. ---_topN int 需要取的topN条记录。
  197. ---_columns varchar(800) 需要获取的字段
  198. ---_where varchar(800) 需要过滤的条件譬如: where id<10 可以带where,不过建议不要带。
  199. ---_orderby varchar(800) 需要进行排序的提交,譬如:order by id
  200. ------------------------------------
  201. create or replace function test3_getTopNbyCondition(IN _topN int,IN _columns VARCHAR(800),IN _where VARCHAR(800),IN _orderby VARCHAR(800))
  202. returns SETOF test3
  203. AS
  204. $$
  205. DECLARE condition_columns VARCHAR(800);
  206. DECLARE condition_where varchar(800);
  207. DECLARE condition_orderby VARCHAR(800);
  208. DECLARE _dymatic_sql VARCHAR(1600);
  209. BEGIN
  210. condition_where:=ltrim(rtrim(COALESCE(_where,'')));
  211. condition_orderby:=ltrim(rtrim(COALESCE(_orderby,'order by t3id')));
  212. condition_columns:=ltrim(rtrim(COALESCE(_columns,'*')));
  213.  
  214. --分析传过来的参数,构造动态sql语句。
  215. IF "character_length"(condition_where)>0 THEN
  216. IF strpos(condition_where, 'where ')!=1 THEN
  217. condition_where:='where ' || condition_where;
  218. END IF;
  219. END IF;
  220. --order by 语句构造
  221. IF "character_length"(condition_orderby)>0 THEN
  222. IF strpos(condition_orderby, 'order ')!=1 THEN
  223. condition_orderby:='order by '||condition_orderby;
  224. END IF;
  225. END IF;
  226. _dymatic_sql:='select '||condition_columns||' from test2 '||condition_where||' '||condition_orderby||' limit '||CAST(_topN as VARCHAR)|| ' offset 0 ';
  227. --raise info '动态构造语句为:%',_dymatic_sql;
  228. return query EXECUTE _dymatic_sql;
  229. END;
  230. $$ language plpgsql VOLATILE;
  231.  
  232. /******************************************************************
  233. *****************************记录删除******************************
  234. ******************************************************************/
  235. ------------------------------------
  236. --用途:删除多条记录
  237. ------------------------------------
  238. create or replace function test3_DeleteList(in ids VARCHAR(800),out status boolean,out msg VARCHAR(200))
  239. returns record
  240. AS
  241. $$
  242. DECLARE _arr_ids int[];
  243. DECLARE _str_ids "text";
  244. DECLARE _str_sql VARCHAR(1600);
  245. DECLARE _effects int;
  246. BEGIN
  247.  
  248. IF "character_length"(ids)<1 THEN
  249. status:=false;
  250. msg:='没有指定需要删除的数据!';
  251. return;
  252. end if;
  253. _arr_ids:=tools_str2intarray(ids, ',');
  254. _str_ids:=tools_stringify(_arr_ids,',');
  255. --pkey为主键,自增的整数, <@ 表示判断pkey是不是在数组里面。是不是很方便?
  256. /*动态构造执行*/
  257. --_str_sql:='DELETE FROM test3 where t3id in ('||_str_ids||') ;';
  258. --EXECUTE _str_sql;
  259. /*直接执行*/
  260. delete from test3 where t3id =ANY( _arr_ids);
  261. GET DIAGNOSTICS _effects = ROW_COUNT;
  262. IF _effects>0 THEN
  263. status:=true;
  264. msg:='成功删除'||_effects||'条记录!';
  265. ELSE
  266. status:=false;
  267. msg:='没有删除任何记录!';
  268. end if;
  269.  
  270. END
  271. $$ LANGUAGE plpgsql VOLATILE;
  272.  
  273. /******************************************************************
  274. ****************************添加及编辑*****************************
  275. ******************************************************************/
  276.  
  277. ------------------------------------
  278. --用途:增加一条记录
  279. ------------------------------------
  280.  
  281. create or replace function test3_Insert(
  282. in __t3name varchar(400) ,
  283. in __t_birthday date ,
  284. in __myage smallint ,
  285. in __isadmin boolean ,
  286. in __myintro text ,
  287. in __price float ,
  288. out __t3id integer,
  289. out _status boolean,
  290. out _msg varchar(200))
  291. returns record AS $$
  292. BEGIN
  293.  
  294. Insert into test3
  295. (
  296. "t3name","t_birthday","myage","isadmin","myintro","price"
  297. )
  298. values(
  299. __t3name,__t_birthday,__myage,__isadmin,__myintro,__price
  300. );
  301. /*判断添加记录是否成功。*/
  302. if FOUND then
  303. _status:=true;
  304. _msg:='成功添加记录.';
  305. __t3id:=currval(pg_get_serial_sequence('test3', 't3id'));
  306. else
  307. _status:=false;
  308. _msg:='无法添加记录!';
  309. end if;
  310. end;
  311. $$ LANGUAGE plpgsql VOLATILE;
  312.  
  313. ------------------------------------
  314. --用途:修改一条记录
  315. ------------------------------------
  316. create or replace function test3_Update(
  317. in __t3name varchar(400) ,
  318. in __t_birthday date ,
  319. in __myage smallint ,
  320. in __isadmin boolean ,
  321. in __myintro text ,
  322. in __price float ,
  323. in __t3id integer,
  324. out _status boolean,
  325. out _msg varchar(200))
  326. returns record AS $$
  327. BEGIN
  328.  
  329. update test3 set
  330. "t3name"=__t3name,"t_birthday"=__t_birthday,"myage"=__myage,"isadmin"=__isadmin,"myintro"=__myintro,"price"=__price where t3id=__t3id;
  331. /*判断保存记录是否成功。*/
  332. if FOUND then
  333. _status:=true;
  334. _msg:='成功保存记录.';
  335. else
  336. _status:=false;
  337. _msg:='无法保存记录!';
  338. end if;
  339. end;
  340. $$ LANGUAGE plpgsql VOLATILE;

PostgreSQL

对应dal调用文件:

  1. package EasisWeb.DAL;
  2.  
  3. import EasisWeb.config.DBPool;
  4. import Easis.Common.StringUtil;
  5. import Easis.util.DataRow;
  6. import Easis.util.DataTable;
  7. import Easis.util.DataTableHelper;
  8. import java.util.Date;
  9. import Easis.DBUtility.PooledConnection;
  10. import java.sql.*;
  11. import java.util.List;
  12. import java.util.ArrayList;
  13. import Easis.util.OperationResult;
  14. import Easis.util.PagerResult;
  15. import EasisWeb.Model.test3Model;
  16. /**
  17. * 这是利用CodeGen工具生成的自动访问数据库的一个模板,作者为“码农下的天桥”
  18. *生成的类名称:
  19. * @author 码农下的天桥
  20. * @version 1.00
  21. */
  22. public class test3DAL {
  23.  
  24. /*表格各种column*/
  25. public static final String col_t3id="test3";
  26. public static final String col_t3name="test3";
  27. public static final String col_t_birthday="test3";
  28. public static final String col_myage="test3";
  29. public static final String col_isadmin="test3";
  30. public static final String col_myintro="test3";
  31. public static final String col_price="test3";
  32. public static final String PKColumn="t3id";
  33.  
  34. /**
  35. *存储过程名称:test3_ListByCondition
  36. *存储过程参数:
  37. *@param pageindex
  38. *@param pagesize
  39. *@param columns 需要获取的字段
  40. *@param condition where条件语句
  41. *@param orderColumn order by排序语句
  42. *
  43. *@return 分页对象
  44. */
  45.  
  46. public PagerResult getPageListByCondition(int pageindex,int pagesize, String columns, String condition, String orderColumn){
  47. PagerResult pres=new PagerResult();
  48. //output参数定义
  49. int _total = 0 ;
  50. int _pagesize = 0 ;
  51. int _pageindex = 0 ;
  52. int _totalpages = 0 ;
  53. //output参数定义结束
  54. //调用存储过程
  55. DataTable res__datatable=new DataTable();
  56. try{
  57. PooledConnection __myconn=DBPool.getConnection();
  58. __myconn.setAutoCommit(false); // return refcursor must within a transaction
  59. CallableStatement _stmt=__myconn.prepareCall("{ call test3_getPageByCondition( ?, ?, ?, ?, ?, ?, ?, ?)}");
  60. _stmt.setInt(1,pageindex);
  61. _stmt.setInt(2,pagesize);
  62. _stmt.registerOutParameter(1,Types.INTEGER);
  63. _stmt.registerOutParameter(2,Types.INTEGER);
  64. _stmt.setString(3,columns);
  65. _stmt.setString(4,condition);
  66. _stmt.setString(5,orderColumn);
  67. _stmt.registerOutParameter(6, Types.INTEGER);
  68. _stmt.registerOutParameter(7, Types.INTEGER);
  69. _stmt.registerOutParameter(8,Types.OTHER);
  70. _stmt.execute();
  71. ResultSet __rslist=(ResultSet)_stmt.getObject(8);
  72. res__datatable=DataTableHelper.rs2datatable(__rslist);
  73. //取回参数
  74. _total=_stmt.getInt(6);
  75. pres.totalrecords=_total;
  76. _pageindex=_stmt.getInt(1);
  77. pres.totalrecords=_total;
  78. _pagesize=_stmt.getInt(2);
  79. pres.pageindex=_pageindex;
  80. pres.pagesize=_pagesize;
  81. _totalpages=_stmt.getInt(7);
  82. pres.totalpages=_totalpages;
  83. pres.datasource=res__datatable;
  84. //--提交并还原
  85. __myconn.commit();
  86. __myconn.setAutoCommit(true); //返回游标必须在一个事务中,提交完以后将autocommit还原。
  87. //释放资源
  88. __rslist.close();
  89. _stmt.close();
  90. __myconn.close();}
  91. catch (Exception __e){
  92. System.out.println("在运行[test3DAL]的List_Condition时候出现错误。");
  93. __e.printStackTrace();
  94. }
  95. return pres;
  96. }
  97.  
  98. /**
  99. *存储过程名称:test3_Insert
  100. *存储过程参数:
  101. *param t3id 【主键】
  102. t3name
  103. t_birthday
  104. myage
  105. isadmin
  106. myintro
  107. price
  108. *
  109. *@return
  110. */
  111. public OperationResult Insert(test3Model model){
  112. OperationResult __ores=new OperationResult();
  113. /*output参数定义*/
  114. int t3id = 0 ;
  115. DataRow returnInfo=new DataRow();
  116. boolean status = false ;
  117. String message = "" ;
  118. /*output参数定义结束*/
  119. /*调用存储过程*/
  120.  
  121. try{
  122. PooledConnection __myconn=DBPool.getConnection();
  123. CallableStatement _stmt=__myconn.prepareCall("{call test3_Insert(?,?,?,?,?,?,?,?,?)}");
  124.  
  125. _stmt.setObject(1,model.t3name,Types.VARCHAR);
  126. _stmt.setObject(2,new Timestamp(model.t_birthday.getTime()),Types.DATE);
  127. _stmt.setObject(3,model.myage,Types.SMALLINT);
  128. _stmt.setObject(4,model.isadmin,Types.BOOLEAN);
  129. _stmt.setObject(5,model.myintro,Types.VARCHAR);
  130. _stmt.setObject(6,model.price,Types.FLOAT);
  131. _stmt.registerOutParameter(7,Types.INTEGER,-1);
  132. _stmt.registerOutParameter(8, Types.BOOLEAN,1);
  133. _stmt.registerOutParameter(9, Types.VARCHAR,200);
  134. _stmt.execute();
  135.  
  136. /*取回参数*/
  137. t3id=_stmt.getInt(7);
  138. status=_stmt.getBoolean(8);
  139. message=_stmt.getString(9);
  140.  
  141. __ores.id= t3id;
  142. __ores.status=status;
  143. __ores.message=message;
  144. /*释放资源*/
  145.  
  146. _stmt.close();
  147. __myconn.close();}
  148. catch (Exception __e){
  149. __e.printStackTrace();
  150. __ores.message=__e.toString();
  151. }
  152. return __ores;
  153. }
  154.  
  155. /**
  156. *存储过程名称:test3_Update
  157. *存储过程参数:
  158. * t3id【主键】
  159. t3name
  160. t_birthday
  161. myage
  162. isadmin
  163. myintro
  164. price
  165. *
  166. *@return
  167. */
  168. public OperationResult Update(test3Model model){
  169. OperationResult __ores=new OperationResult();
  170. /*output参数定义*/
  171. boolean status = false ;
  172. String message = "" ;
  173. /*output参数定义结束*/
  174. /*调用存储过程*/
  175. DataTable res__datatable=new DataTable();
  176. try{
  177. PooledConnection __myconn=DBPool.getConnection();
  178. CallableStatement _stmt=__myconn.prepareCall("{ call test3_Update( ?,?,?,?,?,?,?,?,?)}");
  179.  
  180. _stmt.setObject(1,model.t3name,Types.VARCHAR);
  181. _stmt.setObject(2,new Timestamp(model.t_birthday.getTime()),Types.DATE);
  182. _stmt.setObject(3,model.myage,Types.SMALLINT);
  183. _stmt.setObject(4,model.isadmin,Types.BOOLEAN);
  184. _stmt.setObject(5,model.myintro,Types.VARCHAR);
  185. _stmt.setObject(6,model.price,Types.FLOAT);
  186. _stmt.setInt(7,model.t3id);
  187. _stmt.registerOutParameter(8, Types.BOOLEAN,1);
  188. _stmt.registerOutParameter(9, Types.VARCHAR,400);
  189. _stmt.execute();
  190. /*取回参数*/
  191. status=_stmt.getBoolean(8);
  192. message=_stmt.getString(9);
  193.  
  194. __ores.status=status;
  195. __ores.message=message;
  196.  
  197. /*释放资源*/
  198.  
  199. _stmt.close();
  200. __myconn.close();}
  201. catch (Exception __e){
  202. __e.printStackTrace();
  203. }
  204. return __ores;
  205. }
  206.  
  207. /**
  208. *存储过程名称:test3_DeleteList
  209. *存储过程参数:
  210. *@param ids 【参数名称:ids 参数类型:nvarchar 对应java类型:String 长度:400 】
  211. *
  212. *@return
  213. */
  214. public OperationResult DeleteList( String ids){
  215. /*output参数定义*/
  216. OperationResult __ores=new OperationResult();
  217. boolean status = false ;
  218. String message = "" ;
  219. /*output参数定义结束*/
  220. /*调用存储过程*/
  221. DataTable res__datatable=new DataTable();
  222. try{
  223. PooledConnection __myconn=DBPool.getConnection();
  224. CallableStatement _stmt=__myconn.prepareCall("{ call test3_DeleteList( ?, ?, ?)}");
  225.  
  226. _stmt.setString(1,ids);
  227.  
  228. _stmt.registerOutParameter(2, Types.BOOLEAN,1);
  229.  
  230. _stmt.registerOutParameter(3, Types.VARCHAR,400);
  231. _stmt.execute();
  232. /*取回参数*/
  233. status=_stmt.getBoolean(2);
  234. message=_stmt.getString(3);
  235.  
  236. __ores.status=status;
  237. __ores.message=message;
  238. /*释放资源*/
  239.  
  240. _stmt.close();
  241. __myconn.close();}
  242. catch (Exception __e){
  243. __e.printStackTrace();
  244. }
  245. return __ores;
  246. }
  247.  
  248. /**
  249. *存储过程名称:test3_GetRecord
  250. *存储过程参数:
  251. *@param t3id 【参数名称:id 参数类型:int 对应java类型:int 长度:非字符类型 】
  252. *
  253. *@return DataTable对象。
  254. */
  255.  
  256. public test3Model GetRecord( int t3id ){
  257. /*调用存储过程*/
  258. DataTable res__datatable=new DataTable();
  259. test3Model model=new test3Model();
  260. try{
  261. PooledConnection __myconn=DBPool.getConnection();
  262. CallableStatement _stmt=__myconn.prepareCall("{ call test3_GetRecord( ?)}");
  263.  
  264. _stmt.setInt(1,t3id);
  265. ResultSet __rslist =_stmt.executeQuery();
  266. res__datatable=DataTableHelper.rs2datatable(__rslist);
  267. model=tryParseModel(res__datatable.get(0));
  268.  
  269. /*释放资源*/
  270. __rslist.close();
  271. _stmt.close();
  272. __myconn.close();}
  273. catch (Exception __e){
  274. __e.printStackTrace();
  275. }
  276.  
  277. return model;
  278. }
  279.  
  280. /**
  281. *存储过程名称:test3_Top_Condition
  282. *存储过程参数:
  283. *@param topN 【参数名称:topN 参数类型:int 对应java类型:int 长度:非字符类型 】
  284. *@param columns 【参数名称:columns 参数类型:nvarchar 对应java类型:String 长度:800 】
  285. *@param condition 【参数名称:condition 参数类型:nvarchar 对应java类型:String 长度:800 】
  286. *@param orderColumn 【参数名称:orderColumn 参数类型:nvarchar 对应java类型:String 长度:800 】
  287. *
  288. *@return DataTable对象。
  289. */
  290. public DataTable Top_Condition( int topN, String columns, String condition, String orderColumn ){
  291. /*调用存储过程*/
  292. DataTable res__datatable=new DataTable();
  293. try{
  294. PooledConnection __myconn=DBPool.getConnection();
  295. CallableStatement _stmt=__myconn.prepareCall("{ call test3_Top_Condition( ?, ?, ?, ?)}");
  296.  
  297. _stmt.setInt(1,topN);
  298.  
  299. _stmt.setString(2,columns);
  300.  
  301. _stmt.setString(3,condition);
  302.  
  303. _stmt.setString(4,orderColumn);
  304. ResultSet __rslist =_stmt.executeQuery();
  305. res__datatable=DataTableHelper.rs2datatable(__rslist);
  306.  
  307. /*释放资源*/
  308. __rslist.close();
  309. _stmt.close();
  310. __myconn.close();}
  311. catch (Exception __e){
  312. __e.printStackTrace();
  313. }
  314.  
  315. return res__datatable;
  316. }
  317.  
  318. public test3Model tryParseModel(DataRow drow){
  319. test3Model model=new test3Model();
  320. if(drow==null){
  321. return model;
  322. }
  323.  
  324. /*
  325. return "boolean";
  326. return "Date";
  327. return "double";
  328. return "float";
  329. return "int";
  330. return "long";
  331. return "String";
  332. return "Object";
  333. */
  334.  
  335. /*尝试赋值*/
  336. model.t3id = drow.get("t3id").toInt();
  337. model.t3name = drow.get("t3name").toString();
  338. model.t_birthday = drow.get("t_birthday").toDate();
  339. model.myage = drow.get("myage").toInt();
  340. model.isadmin = drow.get("isadmin").toBoolean();
  341. model.myintro = drow.get("myintro").toString();
  342. model.price = drow.get("price").toFloat();
  343. return model;
  344. }
  345.  
  346. public List<test3Model> tryParseList(List<DataRow> dataList){
  347. List<test3Model> modellist=new ArrayList<test3Model>();
  348. if(dataList==null){
  349. return modellist;
  350. }
  351.  
  352. for(DataRow drow :dataList){
  353. modellist.add(tryParseModel(drow));
  354. }
  355.  
  356. return modellist;
  357. }
  358. }

java

http://blog.csdn.net/cdnight/article/details/18078751

http://blog.csdn.net/cdnight/article/details/18001807

http://www.cnblogs.com/stephen-liu74/category/343171.html

postgresql一般crud存储过程参考[转]的更多相关文章

  1. 如何在SQL Server中生成和使用CRUD存储过程

    在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...

  2. postgresql PL/pgSQL—存储过程结构和变量声明

    ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...

  3. postgresql集群方案参考答案

    PostgreSQL配置Streaming Replication集群 http://www.cnblogs.com/marsprj/archive/2013/03/04/2943373.html p ...

  4. MySql存储过程参考

    Mysql(9)---纪录一次实际开发过程中用到的复杂存储过程 为了尽可能的还原当时为什么需要用到存储过程,下面我写了个详细的文档,我们可以从需求文档出发来分析. 有关存储过程之前也写了两篇文章来做铺 ...

  5. PostgreSQL函数(存储过程)----笔记

    PostgreSQL 函数也称为 PostgreSQL 存储过程. PostgreSQL 函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句(声明,分配,循环,控制流程 ...

  6. MySql、PostgreSql、SqlServer三种数据库的造数存储过程实例

    主要实例:把临时表tmp_table数据插入到目标表target_table 一.MySql造数存储过程实例 mysql造数 -- 第一步,创建临时表 CREATE TEMPORARY TABLE I ...

  7. Postgresql 迁移随笔一

    最近忙于MSSQL 迁移到Postgresql的工程,在这里记录一下迁移遇到的问题以及解法. 程序语言:java 要求,根据不同的driver可以同时支援多种数据库,目前主要为MSSQL 和Postg ...

  8. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  9. 通过arcgis在PostgreSQL中创建企业级地理数据库

    部署环境: Win7 64位旗舰版 软件版本: PostgreSQL-9.1.3-2-windows-x64 Postgis-pg91x64-setup-2.0.6-1 Arcgis 10.1 SP1 ...

随机推荐

  1. HAproxy + keepalived 实现双机热备

    一.HAProxy简介: HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点, ...

  2. 开发笔记:python与随机数(转)

    这些天需要用到从一堆数中随机提取几个数,于是重新研究了下random模块. 下面介绍下random中常见的函数. 前提:需要导入random模块 >>>import random 1 ...

  3. Java解读内存,优化编程

    1.别用new Boolean 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装bool ...

  4. Spring MapFactoryBean例子

    MapFactoryBean类为开发者提供了一种在Spring的bean配置文件中创建一个具体的Map集合类(HashMap和TreeMap). 这里有一个MapFactoryBean.例如,在运行时 ...

  5. 关于jQuery中的 offset() 和 position() 的用法

    ---恢复内容开始--- 在jQuery中有两个获取元素位置的方法offset()和position().position()方法是在1.2.6版本之后加入的,为什么要引入这个方法呢?这两个方法之间有 ...

  6. windows如何查看删除记录

    方法 打开组策略中的计算机配置-Windows设置-安全设置-本地策略-审核策略的审核对对像防问, 双击出现的对话框中钩选成功和失败,经过上面的设置,现在就可以设置文件和文件夹的审核了.(注须在NTF ...

  7. Android 工程报错解决 Unable to resolve target 'android-17'

    转自:http://www.cnblogs.com/csulennon/p/3705177.html 换了系统后,重新安装了Android SDK和ADT插件,导入之前的工作空间.居然发现所有的And ...

  8. 【GISER && Painter】Chapter00:OpenGL原理学习笔记

    说明:简单了解一下OpenGL的工作原理,初步认识计算机对于图形渲染的底层设计与实现,第一次接触,也没学过C艹,欢迎各位批评指正. 一  什么是OpenGL? OpenGL是一个开放标准(specif ...

  9. 【GISER && Painter】矢量切片(Vector tile)番外一:Proj4js

    说明:番外篇是对正篇矢量切片(Vector tile)中提到的一些值得继续延伸的关注点继续进行探索和学习,所涉及的内容以解决实际问题为主要导向. 一.新的需求? 在完成了矢量切片的工作后,新的需求出现 ...

  10. jQuery 对象和 DOM 对象

    jQuery(DOM对象) 或者 $(DOM对象) 此函数的作用是将DOM对象,转换为jQuery的对象 DOM对象其实就是javascript的函数对象,可以用来操作所有HTML元素.比如: a标签 ...