J2EE综合--浅析Java程序员的存储过程

豆豆网   技术应用频道   2008年03月06日    社区交流

内容摘要:本文阐述了怎么使用DBMS存储过程。我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码。

  另外,注意pl/pgsql参数名通过Unix和DOS脚本的$n语法引用。同时,也注意嵌入的注释,这是和Java代码相比的另一个优越性。在Java中写这样的注释当然是可以的,但是看起来很凌乱,并且和SQL语句脱节,必须嵌入到JavaString中。

  下面是调用这个存储过程的Java代码:

connection.setAutoCommit(false);CallableStatementproc=  connection.prepareCall("{?=callsnuffed_it_when(?)}");proc.registerOutParameter(1,Types.INTEGER);proc.setString(2,poetName);cs.execute();intage=proc.getInt(2);

  如果指定了错误的返回值类型会怎样?那么,当调用存储过程时将抛出一个RuntimeException,正如你在ResultSet操作中使用了一个错误的类型所碰到的一样。

  复杂的返回值

  关于存储过程的知识,很多人好像就熟悉我们所讨论的这些。如果这是存储过程的全部功能,那么存储过程就不是其它远程执行机制的替换方案了。存储过程的功能比这强大得多。

  当你执行一个SQL查询时,DBMS创建一个叫做cursor(游标)的数据库对象,用于在返回结果中迭代每一行。ResultSet是当前时间点的游标的一个表示。这就是为什么没有缓存或者特定数据库的支持,你只能在ResultSet中向前移动。

  某些DBMS允许从存储过程中返回游标的一个引用。JDBC并不支持这个功能,但是Oracle、PostgreSQL和DB2的JDBC驱动器都支持在ResultSet上打开到游标的指针(pointer)。

  设想列出所有没有活到退休年龄的诗人,下面是完成这个功能的存储过程,返回一个打开的游标,同样也使用PostgreSQL的pl/pgsql语言:createprocedurelist_early_deaths()returnrefcursoras'
declare
  toesuprefcursor;
begin
  opentoesupfor
    SELECTpoets.name,deaths.age
    FROMpoets,deaths
    --allentriesindeathsareforpoets.
    --butthetablemightbecomegeneric.
    WHEREpoets.id=deaths.mort_id
      ANDdeaths.age<60;
  returntoesup;
end;
'language'plpgsql';

来源:豆豆网转载    作者:赛迪网 dongzc    责编:豆豆技术应用

正在加载评论...