【问题标题】:How to create a database table containing a RAW field with jooq如何使用 jooq 创建包含 RAW 字段的数据库表
【发布时间】: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);

标签: java oracle jooq


【解决方案1】:

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

您必须通过plain SQL templating 或使用ExecuteListener 修补生成的SQL 字符串来解决此问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2015-12-11
    相关资源
    最近更新 更多