当前位置: 首页 > 知识库问答 >
问题:

从java for Oracle类型表调用存储过程

夏兴生
2023-03-14

我在Oracle中有一个存储过程,如下所示。

create or replace TYPE T_EMP_OBJ AS OBJECT (Name varchar2(20), Age CHAR(3 CHAR));

create or replace type T_EMP_REC as table of T_EMP_OBJ;

create or replace PROCEDURE P_EMP (I_NAV_REC IN T_INAV_REC, p_out OUT MY_TYPES_PKG.REFCURSOR) 
AS  ... 
END P_EMP;

我正在从Java调用该过程。我的密码是,

StructDescriptor structDesc = new StructDescriptor("T_EMP_OBJ", oracleConnection);
ArrayDescriptor arrayDesc2 = new ArrayDescriptor("T_EMP_REC", oracleConnection);
    Object[] objType = new Object[2];
    objType[0] = new String("AAA");
    objType[1] = new String("25");
    STRUCT struct = new STRUCT(structDesc, oracleConnection, objType);
    STRUCT[] structs = new STRUCT[1];
    structs[0] = struct;
    oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc2, oracleConnection, structs);
    OracleCallableStatement statement = (OracleCallableStatement) oracleConnection.prepareCall("CALL P_EMP(?,?)");
    statement.setArray(1, array);
    statement.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
    statement.execute();
    ResultSet results = ((OracleCallableStatement) statement).getCursor(2);
    while (results.next()) {
         logger.info("NAME==>"+results.getString(1));
         logger.info("AGE===>"+results.getString(2));
    }

即使我正在获取记录,值也是空的。这意味着如果输出为2行,则while条件执行并打印为空。在SQL Developer中,它工作得很好。提前道谢。

共有1个答案

钱弘壮
2023-03-14

终于在这里找到了答案。在类路径中包含orai18n.jar之后,它就可以正常工作了。

 类似资料:
  • 我在HANA数据库中创建了这个存储过程,它使用两个参数,一个是表类型,另一个是。 现在我想在Java中调用这个过程,我写了这样的东西。 有人能告诉我在调用此存储过程时,如何将对象作为参数中的表实体传递吗?

  • 问题内容: 我正在编写一个简单的Web应用程序以调用存储过程并检索一些数据。它是一个非常简单的应用程序,可以与客户的数据库进行交互。我们传递员工ID和公司ID,存储过程将返回员工详细信息。 Web应用程序无法更新/删除数据,并且正在使用SQL Server。 我正在Jboss AS中部署Web应用程序。我应该使用JPA访问存储过程还是。在这种情况下使用JPA的任何优势。 调用该存储过程的sql语句

  • 在我的应用程序中,我想执行像SELECT*FROM tbl这样的查询,其中,@list中的col In(@list)可以有变量no of值。我正在使用MS SQL server数据库。当我搜索这个问题时,我找到了这个链接 http://www.sommarskog.se/arrays-in-sql-2008.html 此链接表示使用表值参数。因此,我使用Microsoft SQL Server M

  • 我想在Oracle存储过程中编写一个简单的插入语句。目标表有40列。因此,我计划在过程级别接受记录%rowtype类型的输入参数,而不是一个接一个地将所有参数传递给过程。 我的问题是, 首先可能吗 如果是,我如何从Java代码中调用这个过程并传递record类型的输入

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 我使用JDBC这样调用这个过程: 它向我抛出一个错误,通知调用格式错误。 但是如果我像这样直接在IDE中运行调用: