我已经使用in out参数%rowtype给出了一个oracle过程,如:
CREATE OR REPLACE PROCEDURE cleansing(
io_user IN OUT USER%rowtype
)
IS
BEGIN
--some pl/sql code
END cleansing;
USER是一个超过 100列的表,我想通过Java调用该过程。 我无法更改程序,因为它们已被其他项目使用。 我无法向数据库添加过程,因为我没有权限这样做。 我谷歌它,但找不到一个好方法来处理这个。 我想做的是: 1.传递参数。 2.获取参数。一些java演示代码:
String sql = "{call cleansing(?)}";
try {
dbConnection = getDBConnection();
callableStatement = dbConnection.prepareCall(sql);
callableStatement.setXXX()//I don't know
callableStatement.registerOUTParameter(1, //I don't know the type.);
任何人都可以帮助我并提供一些演示代码吗?没有改变数据库和用java的参数映射
答案 0 :(得分:2)
这是可能的,但并不是那么简单。您必须在运行时创建USER%ROWTYPE类型的东西,并使用它来调用您的存储过程。有关详细信息,请查看here。
要获得输出值,您还必须按照Sumit的注释行做一些额外的操作。基本上,在程序调用之后,打开一个光标,从USER
参数中选择相关数据。
所以你得到一个数据库语句如下(伪代码):
string sql =
"declare
user_param user%rowtype;
begin
-- Set necessary parameters
user_param.col0 := :p0In;
user_param.col1 := :p1In;
...
-- Call procedure.
cleansing(io_user => user_param);
-- Read necessary output values into cursor.
open :pOut for select user_param.col99 as col99
user_param.col98 as col98
...
from dual;
end;"
你以通常的方式调用整个语句,但你注册了一个游标输出参数(不幸的是,Java很久以前对我来说,所以我不确定确切的语法)。
callableStatement.registerOutParameter("pOut", OracleTypes.CURSOR);
...
callableStatement.execute();
...
ResultSet rs = (ResultSet) callableStatement.getObject("pOut");
// Read from result set.
编辑:我把它变成blogpost。代码示例在C#中,但想法是一样的。