Estamos intentando almacenar un registro:

DSLContext dsl = DSL.using(conn, SQLDialect.ORACLE12C);
KampartikelRecord kampartikelRecord = dsl.newRecord(KAMPARTIKEL);
kampartikelRecord.setKampagne(387);
kampartikelRecord.setArtnr("090248");
kampartikelRecord.setArtId(5558);
kampartikelRecord.store();

Pero obtenemos:

org.jooq.exception.DataAccessException: SQL [insert into "TOSCA"."KAMPARTIKEL" ("KAMPAGNE", "ART_ID", "ARTNR") values (?, ?, ?)]; ORA-04043: Objekt "TOSCA" ist nicht vorhanden
    at org.jooq_3.12.1.ORACLE12C.debug(Unknown Source)
    at org.jooq.impl.Tools.translate(Tools.java:2717)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:755)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:383)
    at org.jooq.impl.TableRecordImpl.storeInsert0(TableRecordImpl.java:206)
    at org.jooq.impl.TableRecordImpl$1.operate(TableRecordImpl.java:177)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:130)
    at org.jooq.impl.TableRecordImpl.storeInsert(TableRecordImpl.java:173)
    at org.jooq.impl.UpdatableRecordImpl.store0(UpdatableRecordImpl.java:196)
    at org.jooq.impl.UpdatableRecordImpl$1.operate(UpdatableRecordImpl.java:136)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:130)
    at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:132)
    at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:124)
    at ch.tosca.common.repository.JooqRepositoryTest.insertKampartikel(JooqRepositoryTest.java:66)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.sql.SQLSyntaxErrorException: ORA-04043: Objekt "TOSCA" ist nicht vorhanden
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:456)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:451)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1040)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:550)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:268)
    at oracle.jdbc.driver.T4C8Odsy.doODSY(T4C8Odsy.java:146)
    at oracle.jdbc.driver.T4C8Odsy.doODSYTable(T4C8Odsy.java:126)
    at oracle.jdbc.driver.T4CConnection.doDescribeTable(T4CConnection.java:5168)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:4654)
    at org.jooq.impl.ProviderEnabledConnection.prepareStatement(ProviderEnabledConnection.java:136)
    at org.jooq.impl.SettingsEnabledConnection.prepareStatement(SettingsEnabledConnection.java:125)
    at org.jooq.impl.AbstractDMLQuery.prepare0(AbstractDMLQuery.java:859)
    at org.jooq.impl.AbstractDMLQuery.prepare(AbstractDMLQuery.java:754)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:336)
    ... 48 more

He leído un problema de GitHub sobre la incompatibilidad del controlador, pero la base de datos y el controlador ojdbc8 son versiones 12.2.0.1.0

¿Qué estamos haciendo mal?

2
Simon Martinelli 25 sep. 2019 a las 16:26

1 respuesta

La mejor respuesta

Este es un problema conocido, que se ha informado varias veces:

Todavía no estoy 100% seguro de qué error del servidor Oracle o JDBC lo causa, pero se puede evitar no calificando la tabla con el nombre del esquema o evitando citar el nombre del esquema. A continuación, se explica cómo reproducirlo con JDBC simple:

Como reproducirlo

Usando esta tabla

CREATE TABLE T (
  ID NUMBER(7),
  CONSTRAINT pk PRIMARY KEY (ID)
);

Utilice la sobrecarga Connection.prepareStatement(String, String[]), como hace jOOQ, internamente:

try (Connection c = dbSetup.getConnection()) {
    try (PreparedStatement s = c.prepareStatement(
        "insert into \"TEST\".\"T\" (\"ID\") values (?)", new String[] { "ID" })) {
        s.setInt(1, 1);
        s.execute ();
    }
}

Soluciones

No cites el nombre del esquema:

try (Connection c = dbSetup.getConnection()) {
    try (PreparedStatement s = c.prepareStatement(
        "insert into TEST.\"T\" (\"ID\") values (?)", new String[] { "ID" })) {
        s.setInt(1, 1);
        s.execute ();
    }
}

Evite la calificación por completo:

try (Connection c = dbSetup.getConnection()) {
    try (PreparedStatement s = c.prepareStatement(
        "insert into \"T\" (\"ID\") values (?)", new String[] { "ID" })) {
        s.setInt(1, 1);
        s.execute ();
    }
}

Usando las soluciones alternativas en jOOQ:

  • Puede desactivar la calificación del esquema con Settings.renderSchema
  • Puede desactivar las citas de identificadores con Settings.renderQuotedNames

Finalmente arreglaremos esto en jOOQ a través de https://github.com/jOOQ/jOOQ/issues / 7962

También he creado una discusión en el canal de la comunidad de Oracle para JDBC: https://community.oracle.com/message/15550855#15550855

1
Lukas Eder 7 feb. 2020 a las 15:21