【发布时间】:2021-05-18 05:01:35
【问题描述】:
背景和问题
我们使用包含元数据的文件来描述存储在 csv 文件中的数据。元数据文件包含最初导出数据的表的结构。我们使用 jooq(专业版)为一个临时表生成 create 语句,其中加载了来自 csv 文件的数据。生成的 ddl 随后由 pl/sql 包执行。
这通常可以正常工作,但 oracle 原始字段存在问题。我不知道如何创建一个包含 oracle RAW 的表,因为 SQLDataType 不包含 RAW。
简化的可运行示例
package ch.and.stackoverflow.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 语句的生成器在 oracle 数据库中创建包含 RAW 数据类型列的表?
【问题讨论】:
-
您是如何将
RAW类型添加到您的 DDL 中的?通过直接引用OracleDataType.RAW? -
否,使用 DataType> dataType = DefaultDataType.getDataType(SQLDialect.ORACLE12C, columnMetaData.dataType);其中 columnMetaData.dataType 是“RAW”。以及字段的创建:DSL.field(columnMetaData.getColumnName(), dataType);