J2EE综合--浅析Java程序员的存储过程
http://tech.ddvip.com 2008年03月06日 社区交流
内容摘要:本文阐述了怎么使用DBMS存储过程。我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码。
很独特?不。我打赌你一定期待看到一个poets表上的UPDATE。这也暗示了使用存储过程实现是多么容易的一件事情。set_death_age几乎可以肯定是一个很烂的实现。我们应该在poets表中添加一列来存储逝世年龄。Java代码中并不关心数据库模式是怎么实现的,因为它仅调用存储过程。我们以后可以改变数据库模式以提高性能,但是我们不必修改我们代码。
下面是调用上面存储过程的Java代码:
publicstaticvoidsetDeathAge(PoetdyingBard,intage) throwsSQLException{ Connectioncon=null; CallableStatementproc=null; try { con =connectionPool.getConnection(); proc=con.prepareCall("{callset_death_age(?,?)}"); proc.setString(1,dyingBard.getName()); proc.setInt(2,age); proc.execute(); } finally { try { proc.close(); } catch(SQLExceptione){} con.close(); }}为了确保可维护性,建议使用像这儿这样的static方法。这也使得调用存储过程的代码集中在一个简单的模版代码中。如果你用到许多存储过程,就会发现仅需要拷贝、粘贴就可以创建新的方法。因为代码的模版化,甚至也可以通过脚本自动生产调用存储过程的代码。
Functions
存储过程可以有返回值,所以CallableStatement类有类似getResultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么。你也必须调整存储过程调用来指示该过程返回一个值。
下面接着上面的例子。这次我们查询DylanThomas逝世时的年龄。这次的存储过程使用PostgreSQL的pl/pgsql:createfunctionsnuffed_it_when(VARCHAR)returnsinteger'
declare
poet_idNUMBER;
poet_ageNUMBER;
begin
--firstgettheidassociatedwiththepoet.
SELECTidINTOpoet_idFROMpoetsWHEREname=$1;
--getandreturntheage.
SELECTageINTOpoet_ageFROMdeathsWHEREmort_id=poet_id;
returnage;
end;
'language'pl/pgsql';
来源:豆豆网转载 作者:赛迪网 dongzc 责编:豆豆技术应用