如何使用 jooq 创建包含 RAW 字段的数据库 table

How to create a database table containing a RAW field with jooq

背景和问题

我们使用包含元数据的文件来描述存储在 csv 文件中的数据。元数据文件包含最初导出数据的 table 的结构。我们使用 jooq(专业版)为临时 table 生成创建语句,其中加载了来自 csv 文件的数据。生成的 ddl 随后由 pl/sql 包执行。

这通常工作正常,但 oracle 原始字段存在问题。我不知道如何创建包含 oracle RAW 的 table,因为 SQLDataType 不包含 RAW。

简化的可运行示例

package ch.and.Whosebug.questions;

import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.jooq.impl.DefaultDataType;

import java.util.List;

public class JooqAndRawDatatypeFieldSimple {

    public static void main(final String[] args) {

        // VARCHAR2
        DataType<?> varchar2DataType = DefaultDataType.getDataType(SQLDialect.ORACLE12C, "VARCHAR2");
        varchar2DataType = varchar2DataType.length(24);
        Field<?> varchar2Field = DSL.field("VARCHAR2_COL", varchar2DataType);

        // NUMBER
        DataType<?> numberDataType = DefaultDataType.getDataType(SQLDialect.ORACLE12C, "NUMBER");
        numberDataType = numberDataType.precision(5).scale(2);
        Field<?> numberField = DSL.field("NUMBER_COL", numberDataType);

        // RAW
        DataType<?> rawDataType = DefaultDataType.getDataType(SQLDialect.ORACLE12C, "RAW");
        rawDataType = rawDataType.length(100);
        Field<?> rawField = DSL.field("RAW_COL", rawDataType);


        String sql = DSL.createTable("TEST_TABLE").columns(List.of(varchar2Field, numberField, rawField)).getSQL();

        System.out.println(sql);
    }
}

这导致以下 ddl:

CREATE TABLE "TEST_TABLE" (
    VARCHAR2_COL varchar2(24) NULL,
    NUMBER_COL number(5, 2) NULL,
    RAW_COL raw NULL
    )

声明无效,因为 RAW 需要大小 (https://docs.oracle.com/cd/E11882_01/server.112/e41085/sqlqr06002.htm#SQLQR959)。

问题

如何使用 jooq 作为 ddl 语句的生成器在包含 RAW 数据类型列的 oracle 数据库中创建 table?

这似乎是 jOOQ 中的错误:https://github.com/jOOQ/jOOQ/issues/11455

您必须通过 plain SQL templating or using an ExecuteListener

修补生成的 SQL 字符串来解决这个问题