【问题标题】:How to call Oracle stored procedure with custom object as input parameter如何使用自定义对象作为输入参数调用 Oracle 存储过程
【发布时间】:2018-01-25 10:37:14
【问题描述】:

在 Oracle 数据库中我定义了类型:

create or replace TYPE person_type
    AS OBJECT (id NUMBER(10), name VARCHAR2(50), age NUMBER);

还有一个存储过程

create or replace PROCEDURE add_person (in_person IN person_type)
AS
BEGIN
  INSERT into person (id, name, age) VALUES(in_person.id, in_person.name, person.age);
END;

我正在使用带有 Hibernate 的 Spring Boot,我想使用一些等效的 java bean 作为输入参数来调用该过程。 我见过很多例子,但它们只使用基本类型,而不是组合对象。 也有一些带有表注释的例子,但我不保证数据库中有这样的表,我只保证了存储过程的类型。

【问题讨论】:

标签: java oracle object stored-procedures


【解决方案1】:

您需要 StructDescriptor 来获取 SQL 结构化对象,然后需要将其传递给 STRUCT 以创建类型。

StructDescriptor 中,您需要传递SQL 对象名称即PERSON_TYPE 和连接对象即con

StructDescriptor StructDesc = StructDescriptor.createDescriptor("PERSON_TYPE", con);

然后,将结构描述符和对象数组传递给 struct。请注意,数组索引表示它的顺序/位置,它(SQL 对象)在 SQL 对象上声明的方式。因为id 是第一个,然后是name,然后是age

Object[] ObjArray = new Object[3];
ObjArray[0] = 1;
ObjArray[1] = "My Name";
ObjArray[2] = 23;

STRUCT structObj = new STRUCT(StructDesc, con, ObjArray);

现在,使用结构对象,你调用你的过程

stmt = (OracleCallableStatement) con.prepareCall("{call add_person(?)}");
stmt.setSTRUCT(1, structObj);
stmt.executeUpdate();

【讨论】:

  • 你是如何获得连接“con”的?休眠会话不允许访问它。
猜你喜欢
  • 2019-10-29
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
相关资源
最近更新 更多