本节例示一个不带参数的简单存储过程。多数存储过程的功能比本例复杂多了,但这里主要说明存储过程的一些基本要点。如前面所述,不同DBMS定义存储过程的语法是不同的。例如,有些DBMS使用begin . . . end或其他关键字指明存储过程定义的开始和结束。在有些DBMS中,下面的SQL语句可创建一个存储过程:
create procedure SHOW_SUPPLIERS
as
select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME
from SUPPLIERS, COFFEES
where SUPPLIERS.SUP_ID = COFFEES.SUP_ID
order by SUP_NAME
下面的代码将SQL语句放到一个字符串中,然后赋给变量createProcedure以备后用:
String createProcedure = "create procedure SHOW_SUPPLIERS " +
"as " +
"select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME " +
"from SUPPLIERS, COFFEES " +
"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID " +
"order by SUP_NAME";
下面的代码段使用Connection对象con来创建Statement对象,用于把创建存储过程的SQL语句发送给数据库:
Statement stmt = con.createStatement();
stmt.executeUpdate(createProcedure);
存储过程SHOW_SUPPLIERS将作为一个可调用的数据库对象在数据库中编译并存储,调用时就像调用其他方法一样。
从JDBC调用存储过程
JDBC允许在用Java编写的程序中调用存储过程。第一步是创建一个CallableStatement对象。就像Statement和PreparedStatement对象一样,利用一个打开的Connection对象即可完成创建。CallableStatement对象包含了存储过程的一个调用;但它不包含存储过程本身。下面的第一行代码使用连接con创建了存储过程SHOW_SUPPLIERS的一个调用。花括号内的那部分就是存储过程的转义语法。当驱动程序碰到“{call SHOW_SUPPLIERS}”时,它将把这个转义语法转换成数据库使用的本地SQL,以调用名为SHOW_SUPPLIERS的存储过程。
CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();
执行后结果集rs的内容如下:
SUP_NAME COF_NAME
---------------- -----------------------
Acme, Inc. Colombian
Acme, Inc. Colombian_Decaf
Superior Coffee French_Roast
Superior Coffee French_Roast_Decaf
The High Ground Espresso
注意,用于执行cs的方法是executeQuery,因为cs调用的存储过程包含一个查询,执行后产生一个结果集。如果存储过程包含一条更新或一条DLL语句,那就要使用executeUpdate方法。但有时一个存储过程包含多条SQL语句,因而它产生的不只是一个结果集、不只是一个更新计数或产生一些结果集和更新计数的组合。这样就有多个结果集,这时就应该使用execute方法来执行CallableStatement。
CallableStatement类是PreparedStatement的子类,因此CallableStatement对象可与PreparedStatement对象一样带有输入参数。此外,CallableStatement对象还可带输出参数或输入/输出参数。INOUT参数和execute方法很少使用。要获取更详细信息,请参考“使用Java进行JDBC数据库访问”。