执行存储过程

在存储过程中可以将一大堆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);

//这样就在数据库系统中创建了存储过程,然后就可以使用该存储过程了。