Java 为Oracle PL/SQL包生成JDBC代码

Java 为Oracle PL/SQL包生成JDBC代码,java,jdbc,plsql,code-generation,Java,Jdbc,Plsql,Code Generation,我有一个大型oraclepl/SQL包,其中包含几个带有IN和OUT类型参数的过程。其中一些参数是用户定义的类型。其中一些是在同一个包中定义的类型。(定义的包装规格) 有没有一种简单的方法可以直接从Oracle包生成Java代码,用于通过JDBC调用这些过程?首先,直到Oracle 11g,包类型都无法通过Oracle的字典视图轻松发现,而且很难通过JDBC进行序列化/反序列化。如果希望在Java存储过程中支持包类型,一个好主意可能是编写桥接方法,将包类型包装/展开到SQL表中。更多信息请点击此

我有一个大型oraclepl/SQL包,其中包含几个带有IN和OUT类型参数的过程。其中一些参数是用户定义的类型。其中一些是在同一个包中定义的类型。(定义的包装规格)


有没有一种简单的方法可以直接从Oracle包生成Java代码,用于通过JDBC调用这些过程?

首先,直到Oracle 11g,包类型都无法通过Oracle的字典视图轻松发现,而且很难通过JDBC进行序列化/反序列化。如果希望在Java存储过程中支持包类型,一个好主意可能是编写桥接方法,将包类型包装/展开到SQL
表中。更多信息请点击此处:

自己编写这样的代码生成器: 为了为可能涉及的所有包和独立例程(过程/函数)以及所有
/
VARRAY
/
对象
类型编写源代码生成器,您必须查询以下字典视图:

套餐

选择*
从所有对象
其中OBJECT_TYPE='PACKAGE'
独立例程

选择*
从所有对象
其中对象\输入('函数','过程')
程序包例程

(注意重载例程和其他注意事项)

选择*
从所有对象
在o.OWNER=p.OWNER和o.OBJECT\u NAME=p.OBJECT\u NAME上加入所有的\u过程p
其中o.OBJECT_TYPE='PACKAGE'
常规参数

选择*
从所有的论点
表格
/
VARRAY
类型

选择*
从所有类型
其中COLL_输入('可变数组','表')
对象
类型

选择*
从所有类型
其中TYPECODE='OBJECT'
对象
属性

选择*
从所有类型属性
使用上述信息,您可以根据以下功能生成必要的源代码:

  • OUT
    参数需要使用适当的类型注册到一个数据库
  • 对象
    类型必须在每个绑定变量的特定类型映射中注册
  • 对象
    类型应生成为
  • 如果您正在使用面向对象的PL/SQL(
    object
    类型上的
    MEMBER PROCEDURES
    ,最好使用传递
    object
    值作为
    SELF
    参数的非OO语法)
  • 必须使用ojdbc的
    createARRAY()
    API创建
    TABLE
    VARRAY
    类型引用
  • 嵌套
    对象
    /
    VARRAY
    类型时需要特别小心,有许多警告,特别是当涉及
    BLOB
    CLOB
    值时
  • REF CURSOR
    需要考虑类型
  • 使用PL/SQL命名参数语法可以最好地消除包中重载过程的歧义
使用第三方库 您可以使用一个商业库,它为上述所有功能提供本机支持。(免责声明:我在jOOQ背后的公司工作)一个典型的例子如下:

创建类型胶片作为对象(
国际电影节,
标题VARCHAR(255)
);
/
创建类型胶片作为胶片表;
/
创建类型CUSTOMER\T作为对象(
客户id INT,
第一个名字VARCHAR(45),
姓氏VARCHAR(45)
);
/
创建类型CUSTOMER\u RENTAL\u HISTORY\T作为对象(
客户,
电影
);
/
将套餐租赁创建为
函数获取客户租赁历史记录(p客户T)
归还客户\租赁\历史记录\u T;
终止租金;
/
使用jOOQ,您可以调用
RENTALS.GET_CUSTOMER_RENTAL_HISTORY
函数,如下所示:

CustomerEntalHistoryRecord结果=
getCustomerEntalHistory(配置,新CustomerRecord(1,“John”,“Wayne”))
对于(FilmTRecord film:result.getFilms()){
System.out.println(film.getTitle());
}

如果这真的只是“几个”过程,那么为什么手工快速完成这项工作不现实呢?@IraBaxter我收到的Oracle软件包很快就要退役了。目前,我们需要构建一个快速web工具作为临时界面,以查看它们如何返回结果。所以我花的钱以后都没用了。另外,我想知道我是否可以不用编写100多行代码(将java对象转换为Oracle可理解的对象)来调用Oracle过程?我觉得这完全是胡说八道。