作为Oracle存储过程的输出,我想使用JOOQ将id列表作为输出参数返回给我的Java代码。 id元素的数量可以变化。如何使用JOOQ执行此操作以及如何对PL / SQL过程进行编码以实现此目的。
答案 0 :(得分:1)
在Oracle中有很多方法可以返回集合/表格/数组/游标。我个人更喜欢以下内容,尽管jOOQ同样支持所有其他方法:
CREATE TYPE ids AS TABLE OF NUMBER(18);
/
CREATE OR REPLACE FUNCTION get_ids RETURN ids IS
v_result ids;
BEGIN
SELECT CAST(COLLECT(id) AS ids)
INTO v_result
FROM t_book;
RETURN v_result;
END get_ids;
/
相关生成的jOOQ类现在类似于:
public class GetIds extends AbstractRoutine<IdsRecord> {
// ...
}
public class IdsRecord extends ArrayRecordImpl<Long> {
// ...
}
public class Routines {
// For standalone calls
public static IdsRecord getIds(Configuration configuration) {
}
// For embedded calls
public static Field<IdsRecord> getIds() {
}
}
您现在可以使用独立呼叫:
Routines.getIds(configuration).forEach(System.out::println);
直接产生数值
1
2
3
4
或者,您使用DSL.table()
运算符
DSL.using(configuration)
.selectFrom(table(Routines.getIds()))
.fetch()
.forEach(System.out::println);
这会产生个人记录
+------------+
|COLUMN_VALUE|
+------------+
| 1|
+------------+
+------------+
|COLUMN_VALUE|
+------------+
| 2|
+------------+
+------------+
|COLUMN_VALUE|
+------------+
| 3|
+------------+
+------------+
|COLUMN_VALUE|
+------------+
| 4|
+------------+