【发布时间】:2019-08-25 17:15:37
【问题描述】:
有没有办法在 jdbc 的正常选择中选择/填充 Oracle 集合(“IS TABLE OF”),即在 中没有声明变量用于批量收集或匿名块的过程Oracle12c?
问题在于选择具有对象集合的对象,因为我找不到填充集合的方法,因此它将每个对象放在单独的集合中,而不是将它们收集在一个集合中(即“返回单行查询多于一排”)。
长篇大论: 大多数out services/apis都有动态搜索参数,然后将它们转换为SQL语句。
Java 代码确实会解析有限的“搜索/位置”,对其进行清理和参数化,然后从 oracle 中选择一个对象,因此在大多数情况下,它的执行速度比 oracle 的硬解析快得多,但是我找不到解决方案用对象列表填充对象。
当前的解决方法是调用过程并让它们在声明的对象中进行批量收集,然后返回它们, 然而,由于“搜索”子句的动态特性,它们中的大多数都执行 EXECUTE IMMEDIATE,这对数据库的 CPU 来说是相当沉重的。
其他解决方案,例如每行多个查询以获取其列表或左连接并在单个 ResultSet 中获取所有内容只会以指数方式增加时间,因为提取通常用于大量列、行和嵌套列表:
CREATE OR REPLACE TYPE SUB_TYPE_OBJ Force AS OBJECT
(
SVAR1 VARCHAR2(100 CHAR);
SVAR2 DATE,
SVAR3 VARCHAR2(100 CHAR)
);
CREATE OR REPLACE TYPE SUB_TYPE_LST IS TABLE OF SUB_TYPE_OBJ;
CREATE OR REPLACE TYPE MAIN_TYPE_OBJ Force AS OBJECT
(
MVAR1 VARCHAR2(100 CHAR),
MVAR2 VARCHAR2(100 CHAR),
MVAR3 SUB_TYPE_OBJ,
MVAR4 SUB_TYPE_LST
);
SELECT MAIN_TYPE_OBJ (
tab1.val1,
tab1.val2,
(SELECT SUB_TYPE_OBJ( table2.val1, table2.val2, table2.val3) obj FROM table2 WHERE tab1.val1 = tab2.val1),
(SUB_TYPE_LST ( (SELECT SUB_TYPE_OBJ( table3.val1, table3.val2, table3.val3) obj FROM table3 DYNAMIC_WHERE_WITH_LIMITED_FUNCTIONALITY)))
/* if it return more than one row everything breaks :( */
), CNT
FROM (
SELECT table1.*, COUNT(*) OVER(table1.val1) AS CNT FROM table1
WHERE DYNAMIC_WHERE_WITH_LIMITED_FUNCTIONALITY
ORDER BY val1 ASC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY) tab1;
如果 table3 返回多行,我们得到“单行查询返回多行” 因为我只是在创建一堆列表而不是包含所有对象的列表,但我不知道该怎么做;
欢迎提出任何想法,但请暂时排除 DBMS_SQL 或 NoSQL :)。
【问题讨论】:
标签: java database oracle jdbc oracle12c