[alibaba/druid]SQLStatementParser cannot parse INSERT ALL statements

2023-12-09 995 views
8

Run Environment

  • jdk:1.8
  • druid:1.2.20

Exception StackTrace

com.alibaba.druid.sql.parser.ParserException: not supported.pos 10, line 1, column 8, token ALL
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:616)
        at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:102)
        at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:366)
        at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:359)
        at org.springblade.core.mp.plugins.SqlLogInterceptor.statement_close(SqlLogInterceptor.java:128)
        at com.alibaba.druid.filter.FilterChainImpl.statement_close(FilterChainImpl.java:2887)

Exception Sql

INSERT ALL

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, 
                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES
            (
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?,
                ?
            )

回答

2

我查了下是Oracle的语法,我用DbType.oracle验证解析是ok的,你反馈的信息没有给出DbType是啥,请核实你的配置是不是配错了,把DbType配成其它类型的了。

Oracle 语法说明: https://www.oracletutorial.com/oracle-basics/oracle-insert-all/

测试代码:


 @Test
    public void test_insert_all() throws Exception {
        for (DbType dbType : new DbType[]{DbType.oracle}) {
            String sql = "INSERT ALL\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )\n"
                + "          \n"
                + "            INTO ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, \n"
                + "                BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) VALUES\n"
                + "            (\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?,\n"
                + "                ?\n"
                + "            )";

            SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
            SQLStatement statement = parser.parseStatement();
            System.out.println("原始的sql===" + sql);
            String newSql = statement.toString();
            System.out.println("生成的sql===" + newSql);

        }
    } 
0

不好意思,没仔细阅读mybatis-plus的源码,漏了DbType,我的DbType是dm,达梦数据库

我是开启了mybatis-plus的语句打印功能,它以下的代码涉及了dbtype的获取

        String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType();
        String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION);

我在该段代码上打了断点,返回dbType是dm

1

网上找不到达梦数据库支持 Oracle insert all的语法介绍,只有介绍兼容mysql语法,你看下你到底用的什么数据库,如果真的是达梦数据库,提供一下达梦数据库支持 Oracle insert all的语法的说明资料。