【问题标题】:java call oracle procedure with %rowtype parameterjava 使用 %rowtype 参数调用 oracle 过程
【发布时间】:2013-11-25 10:04:38
【问题描述】:

我得到了一个带有 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进行参数映射

【问题讨论】:

  • 不,我有一些约束条件。而且您提供的链接没有给出答案。我不认为 oracle 不能支持它,我认为这是非常基本的功能。

标签: java oracle stored-procedures rowtype


【解决方案1】:

这是可能的,但并不是很简单。您必须在运行时创建 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# 中,但思路相同。

【讨论】:

  • 感谢您的链接,但如何获取 out 或 in out 参数?是? := p_row.text_col ;? := p_row.date_col ;? := p_row.num_col ;工作吗?
  • 好问题... :) 必须考虑一下。
  • 我要做的是尝试将 proc 的输出选择到 sys_refcursor 中。基本上将您的 sql 更改为 plsql begin end 块,然后在该块中调用您的 proc 输出到该块中的局部变量,然后输出一个绑定到 java 中的 out 参数的游标。你会用吗? := 你的光标。如果您想返回标量,您只需执行 ?:=p_row.text_col; ?:=p_row.date_col;... 在您调用您的 proc 然后按相同顺序将它们注册为输出之后连续。那有意义吗?我认为您不需要对 java out 参数进行设置。
  • 我也是这么想的,虽然花了一些时间才弄清楚细节......
猜你喜欢
  • 2013-02-14
  • 2020-10-02
  • 2019-10-29
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多