执行存储过程¶
在存储过程中可以将一大堆SQL语句放在一起同时执行,也可以执行一些简单的操作;相对于SQL语句,它为用户提供了对数据更为方便的检索和更新方式。存储过程一般都是多条语句一起执行,所以会减少网络的开销。
CallableStatement 对象为关系型数据库提供了一种以标准形式调用储存过程的方法。这种调用有两种形式:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数,是储存过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。问号将用作参数的占位符。
在 JDBC 中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。
{call 过程名[(?, ?, ...)]}
返回结果的过程的语法为:
{? = call 过程名[(?, ?, ...)]}
不带参数的储存过程的语法类似:
{call 过程名}
通常,用户创建 CallableStatement 对象的时候应知道所用的存储过程的定义。如果用户需要获知存储过程更为详细的信息,可以调用DatabaseMetaData.getProcedures() 和DatabaseMetaData.getProcedureColumns()方法,这两个方法返回对储存过程的描述和存储过程参数的描述。CallableStatement 继承 Statement 的方法(它们用于处理一般的 SQL 语句),还继承了 PreparedStatement 的方法(它们用于处理带有IN 参数的预编译SQL语句)。用户可以通过CallableStatement 接口中定义的方法用于处理 OUT 参数或 INOUT 参数的输出部分:注册 OUT 参数的 JDBC 类型、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。
下面给出了一个通过神通数据库 JDBC驱动程序在数据库中创建存储过程的方法。
String sql = "CREATE OR REPLACE PROCEDURE TEST_PROC1"+
"(param1 IN INT,param2 OUT INT)" +
" RETURN VOID AS BEGIN "+
"SELECT ID INTO param2 FROM TEMP WHERE ID = param1;"+
"RETURN ;END;LANGUAGE 'ploscar';";
stmt.execute(sql);
sql = "CREATE OR REPLACE PROCEDURE TEST_PROC2"+
"(param1 IN INT,param2 OUT INT,param3 INOUT INT)" +
" RETURN INT AS BEGIN "+
"SELECT ID INTO param2 FROM TEMP WHERE ID = param3;"+
"SELECT ID INTO param3 FROM TEMP WHERE ID= param1;"+
"RETURN param1;END;LANGUAGE 'ploscar';";
stmt.execute(sql);
//这样就在数据库系统中创建了存储过程,然后就可以使用该存储过程了。