{"record":{"id":"22451a21eedbc8b5","repo":"apache/seatunnel","slug":"oracle-insert-mode-append-values-does-not-support-22451a","errorCode":null,"errorMessage":"oracle_insert_mode=APPEND_VALUES does not support custom query.","messagePattern":"oracle_insert_mode=APPEND_VALUES does not support custom query\\.","errorType":"validation","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/sink/JdbcSinkFactory.java","lineNumber":432,"sourceCode":"            }\n            if (config.get(JdbcSinkOptions.USE_COPY_STATEMENT)) {\n                throw new OptionValidationException(\n                        \"oracle_insert_mode=APPEND_VALUES does not support copy statement.\");\n            }\n            if (config.get(JdbcSinkOptions.IS_EXACTLY_ONCE)) {\n                throw new OptionValidationException(\n                        \"oracle_insert_mode=APPEND_VALUES does not support exactly-once.\");\n            }\n            if (!config.get(JdbcSinkOptions.AUTO_COMMIT)) {\n                throw new OptionValidationException(\n                        \"oracle_insert_mode=APPEND_VALUES requires auto_commit=true.\");\n            }\n            if (!config.get(JdbcSinkOptions.GENERATE_SINK_SQL)) {\n                throw new OptionValidationException(\n                        \"oracle_insert_mode=APPEND_VALUES does not support custom query.\");\n            }\n            if (config.get(JdbcSinkOptions.SUPPORT_UPSERT_BY_INSERT_ONLY)) {\n                throw new OptionValidationException(\n                        \"oracle_insert_mode=APPEND_VALUES does not support insert-only upsert.\");\n            }\n            return true;\n        }\n    }\n\n    /**\n     * Submission-time validator for {@code is_exactly_once=true}.\n     *\n     * <p>JDBC XA sink does not support retries; {@code max_retries} must be 0 when exactly-once is\n     * enabled, otherwise duplicates may occur.\n     */\n    static class ExactlyOnceMaxRetriesValidator implements ConditionExtension<Boolean> {\n        @Override\n        public String description() {\n            return \"is_exactly_once=true requires max_retries=0\";\n        }\n","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/sink/JdbcSinkFactory.java#L414-L450","documentation":"The validator rejects oracle_insert_mode=APPEND_VALUES when generate_sink_sql=false, i.e. when a custom query is used. APPEND_VALUES hint generation only works with the connector's auto-generated INSERT statements, not user-supplied SQL.","triggerScenarios":"Sink configured with oracle_insert_mode=\"append_values\" plus a custom query (query option) instead of table-based generated SQL; generate_sink_sql is false so evaluate() throws at JdbcSinkFactory.java:432.","commonSituations":"Users writing custom INSERT ... SELECT or upsert queries for Oracle while keeping append_values mode; configs migrated from generated-SQL jobs to custom-query jobs.","solutions":["Remove the custom query and let the connector generate SQL (table-based sink), or","Switch oracle_insert_mode away from append_values when using a custom query"],"exampleFix":"// before\noracle_insert_mode = \"append_values\"\nquery = \"INSERT INTO t SELECT ...\"\n// after\n# custom query sink: use default insert mode\nquery = \"INSERT INTO t SELECT ...\"\n","handlingStrategy":"validation","validationCode":"if (\"append_values\".equalsIgnoreCase(config.get(\"oracle_insert_mode\"))\n    && config.get(\"query\") != null) {\n  throw new IllegalArgumentException(\"append_values requires generated SQL, not a custom query\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  validateSinkOptions(config);\n} catch (OptionValidationException e) {\n  // remove custom query or switch insert mode\n}","preventionTips":["Use table-based sinks (generated SQL) with APPEND_VALUES","When a custom query is needed, use the default insert mode","Check that generate_sink_sql is true when relying on APPEND_VALUES"],"tags":["jdbc","oracle","config-conflict","custom-query"],"backgroundTag":"conflicting-config-options","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}