gpt4 book ai didi

java - 为 Oracle PL/SQL 包生成 JDBC 代码

转载 作者:行者123 更新时间:2023-11-30 11:04:56 24 4
gpt4 key购买 nike

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

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

最佳答案

首先,在 Oracle 11g 之前,无法通过 Oracle 的字典 View 轻松发现包类型,而且它们很难通过 JDBC 进行序列化/反序列化。如果你想在 Java 的存储过程中支持包类型,一个好主意可能是编写桥接方法来包装/解包 SQL TABLE/VARRAY/OBJECT 类型。更多信息在这里:

自己写这样一个代码生成器:

为了编写所有包和独立例程(过程/函数)的源代码生成器,以及所有的TABLE/VARRAY/OBJECT 可能涉及的类型,你将不得不查询以下字典 View :

SELECT *
FROM ALL_OBJECTS
WHERE OBJECT_TYPE = 'PACKAGE'

独立例程

SELECT *
FROM ALL_OBJECTS
WHERE OBJECT_TYPE IN ('FUNCTION', 'PROCEDURE')

封装例程

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

SELECT *
FROM ALL_OBJECTS o
JOIN ALL_PROCEDURES p ON o.OWNER = p.OWNER AND o.OBJECT_NAME = p.OBJECT_NAME
WHERE o.OBJECT_TYPE = 'PACKAGE'

常规参数

SELECT *
FROM ALL_ARGUMENTS

TABLE/VARRAY 类型

SELECT *
FROM ALL_COLL_TYPES
WHERE COLL_TYPE IN ('VARYING ARRAY', 'TABLE')

OBJECT 类型

SELECT *
FROM ALL_TYPES
WHERE TYPECODE = 'OBJECT'

OBJECT 属性

SELECT *
FROM ALL_TYPE_ATTRS

使用上述信息,您可以生成必要的源代码,同时考虑到以下特征:

  • OUT 参数需要使用相应的 java.sql.Types 进行注册输入 CallableStatement .
  • OBJECT 类型必须在每个绑定(bind)变量的特定类型映射中注册
  • OBJECT 类型应生成为 java.sql.SQLData .
  • 如果您使用面向对象的 PL/SQL(MEMBER PROCEDURES on OBJECT 类型,最好使用传递 的非 OO 语法OBJECT 值作为 SELF 参数)。
  • TABLEVARRAY 类型引用必须使用 ojdbc 的 createARRAY() API 创建。
  • 在嵌套 OBJECTTABLE/VARRAY 类型时需要特别小心,有很多注意事项,尤其是当 BLOB CLOB 值被涉及。
  • REF CURSOR 类型需要被考虑在内。
  • 最好使用 PL/SQL 命名参数语法来消除程序包中的重载过程。

使用第三方库

你可以使用 jOOQ ,一个商业图书馆,为上述所有内容提供 native 支持。 (免责声明:我在 jOOQ 背后的公司工作)一个典型的例子是这样的:

CREATE TYPE FILM_T AS OBJECT (
film_id int,
title VARCHAR(255)
);
/
CREATE TYPE FILMS_T AS TABLE OF FILM_T;
/
CREATE TYPE CUSTOMER_T AS OBJECT (
customer_id INT,
first_name VARCHAR(45),
last_name VARCHAR(45)
);
/
CREATE TYPE CUSTOMER_RENTAL_HISTORY_T AS OBJECT (
customer CUSTOMER_T,
films FILMS_T
);
/
CREATE PACKAGE RENTALS AS
FUNCTION GET_CUSTOMER_RENTAL_HISTORY(p_customer CUSTOMER_T)
RETURN CUSTOMER_RENTAL_HISTORY_T;
END RENTALS;
/

使用 jOOQ,您可以调用 RENTALS.GET_CUSTOMER_RENTAL_HISTORY 函数,如下所示:

CustomerRentalHistoryTRecord result =
Rentals.getCustomerRentalHistory(config, new CustomerTRecord(1, "John", "Wayne"))

for (FilmTRecord film : result.getFilms()) {
System.out.println(film.getTitle());
}

关于java - 为 Oracle PL/SQL 包生成 JDBC 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com