如何使用 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 字符串来解决这个问题
背景和问题
我们使用包含元数据的文件来描述存储在 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