当前位置: 首页 > 知识库问答 >
问题:

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

隆飞驰
2023-03-14

背景和问题

我们使用包含元数据的文件来描述存储在csv文件中的数据。元数据文件包含最初从中导出数据的表的结构。我们使用jooq(pro版本)为临时表生成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语句的生成器在包含RAW数据类型列的oracle数据库中创建表?

共有1个答案

百里渊
2023-03-14

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

您必须通过修补生成的SQL字符串来解决此问题,可以通过普通SQL模板或使用ExecuteListener

 类似资料:
  • 问题内容: 我正在参加的编程班上为我提供了一个项目,但我不知道从哪里开始,并希望有人可以将我推向正确的方向。我只发布项目的一部分,以便有人可以向我展示一些代码,以了解如何完成编程,因为我之前参加过编程课程,但是我没有实践。 创建一个具有以下类的名为Registrar的应用程序: 一个学生类,该类至少为学生存储以下数据字段: 名称 学生证号码 学分数 还应该提供以下方法: 初始化名称和ID字段的构造

  • 问题内容: 问题: 是否可以在迁移脚本中创建一个新的数据库,然后连接到它?怎么样? 我的场景: 我正在尝试在Java项目(使用Jersey2.4 + tomcat 7 + PostgreSQL 9.3.1 + EclipseLink的RESTful应用程序)中使用flyway来管理使用git的不同开发人员之间的更改。我写了自己的初始化脚本,并运行了: 而且效果很好。问题是我无法使用脚本创建新的数据

  • 问题内容: 我已经完成了连接数据库(MySQL)的项目。现在,我要将项目导出为jar。但是我不知道如何包括其外部依赖项?在Eclipse中有什么方法可以做到这一点,还是应该为此使用任何脚本? 问题答案: 当你将项目导出为“可运行的jar”(在项目->导出->可运行的jar上单击鼠标右键)时,可以选择将所有依赖项打包到生成的jar中。它还有两种其他方式(请参见屏幕截图)来导出库,请在决定使用哪种打包

  • 问题内容: 使用SQLAlchemy,将创建一个Engine对象,如下所示: 如果to参数(在这种情况下为)中指定的数据库不存在,则访问将失败。如果指定的数据库不存在,是否可以告诉SQLAlchemy创建一个新数据库? 问题答案: 在postgres上,通常默认情况下存在三个数据库。如果您能够以超级用户身份(例如,角色)进行连接,则可以连接到或数据库。默认的pg_hba.conf只允许名为unix

  • 问题内容: 我想创建一个包含唯一字符串的数组。我怎样才能做到这一点? 问题答案: 如果要收集唯一元素,则为Set数据类型。Go没有集合数据类型,但是您可以使用来充当集合。 对于“好的”集合,请使用具有值类型(带有值)的映射并利用零值。对于内存占用最小的集合,请使用具有值类型的映射,因为类型的值不占用内存;并使用逗号分隔的习惯用法来判断值是否在集合/映射中。 这是set的“不错”版本的样子。代替切片

  • 问题:是否可以在迁移脚本中创建一个新的DB,然后连接到它?怎么做? 我的场景:我试图在我的Java项目(使用Jersey2.4+Tomcat7+PostgreSQL 9.3.1+EclipseLink的RESTful应用程序)中使用flyway来管理使用Git的不同开发人员之间的更改。我编写了我的init脚本并运行它: 而且效果很好。问题是我不能用我的脚本创建新的DB。当我在脚本中包含以下一行时: