Hi Manfred, Looks like I have a SQL-Bug in my Oracle integration for source code generation:
java.sql.SQLException: ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile I'll check into that more in-depth and potentially release a 1.5.9.1 patch for Oracle users Thanks for reporting this Lukas 2011/6/1 Manfred Schäfer <[email protected]>: > Hi Lukas, > > My Oracle Version is 11g 11.1.0.7.0 > > the Keys class is empty: > > > import javax.annotation.Generated; > > import org.jooq.impl.AbstractKeys; > > > /** > * This class is generated by jOOQ. > * > * A class modelling foreign key relationships between tables of the > LOCATIONS2 schema > */ > @Generated(value = "http://jooq.sourceforge.net", > comments = "This class is generated by jOOQ") > @SuppressWarnings({"unchecked"}) > public class Keys extends AbstractKeys { > > // IDENTITY definitions > > // UNIQUE and PRIMARY KEY definitions > > // FOREIGN KEY definitions > > /** > * No instances > */ > private Keys() {} > } > > I've got one error in the generation log which looks unrelated: > > DEBUG [main] (JooqLogger.java:142) - Adding unique key : > UNIQUE_PLAN_LOCATION (LOCATIONS2.LOCATIONPLAN.FK__LOCATION_KEY) > DEBUG [main] (JooqLogger.java:142) - Executing query : select > "cc1"."CONSTRAINT_NAME" "fk_name", "cc2"."CONSTRAINT_NAME" "uk_name", > "cc1"."TABLE_NAME" "fk_table", "cc2"."TABLE_NAME" "uk_table", > "cc1"."COLUMN_NAME" "fk_column" from "SYS"."ALL_CONSTRAINTS" join > "SYS"."ALL_CONS_COLUMNS" "cc1" on "cc1"."CONSTRAINT_NAME" = > "SYS"."ALL_CONSTRAINTS"."CONSTRAINT_NAME" join > "SYS"."ALL_CONS_COLUMNS" "cc2" on ("cc2"."CONSTRAINT_NAME" = > "SYS"."ALL_CONSTRAINTS"."R_CONSTRAINT_NAME" and "cc2"."POSITION" = > "cc1"."POSITION") where ("SYS"."ALL_CONSTRAINTS"."OWNER" = > 'LOCATIONS2' and "cc1"."OWNER" = 'LOCATIONS2' and "cc2"."OWNER" = > 'LOCATIONS2' and "cc1"."CONSTRAINT_NAME" = (select > "SYS"."ALL_CONSTRAINTS"."CONSTRAINT_NAME" from > "SYS"."ALL_CONS_COLUMNS" join "SYS"."ALL_CONSTRAINTS" on > "SYS"."ALL_CONS_COLUMNS"."CONSTRAINT_NAME" = > "SYS"."ALL_CONSTRAINTS"."CONSTRAINT_NAME" where > ("SYS"."ALL_CONSTRAINTS"."CONSTRAINT_TYPE" = 'R' and > "SYS"."ALL_CONS_COLUMNS"."OWNER" = 'LOCATIONS2' and > "SYS"."ALL_CONS_COLUMNS"."TABLE_NAME" = "cc1"."TABLE_NAME" and > "SYS"."ALL_CONS_COLUMNS"."COLUMN_NAME" = "cc1"."COLUMN_NAME"))) order > by "fk_name" asc, "cc2"."POSITION" asc > DEBUG [main] (JooqLogger.java:142) - Statement executed : Total: > 14.371ms > ERROR [main] (JooqLogger.java:268) - Error while fetching relations > java.sql.SQLException: ORA-01427: Unterabfrage für eine Zeile liefert > mehr als eine Zeile > > at > oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) > at > oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) > at > oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) > at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455) > at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413) > at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034) > at > oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194) > at > oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791) > at > oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866) > at > oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186) > at > oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387) > at > oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431) > at > oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491) > at > org.jooq.impl.AbstractResultProviderQuery.executeLazy(AbstractResultProviderQuery.java:125) > at > org.jooq.impl.AbstractResultProviderQuery.execute(AbstractResultProviderQuery.java:68) > at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:90) > at > org.jooq.util.oracle.OracleDatabase.loadForeignKeys(OracleDatabase.java:182) > at > org.jooq.util.AbstractDatabase.getRelations0(AbstractDatabase.java:424) > at > org.jooq.util.AbstractDatabase.getRelations(AbstractDatabase.java:308) > at > org.jooq.util.DefaultColumnDefinition.getPrimaryKey(DefaultColumnDefinition.java:141) > at > org.jooq.util.AbstractTableDefinition.getMainUniqueKey(AbstractTableDefinition.java:71) > at org.jooq.util.DefaultGenerator.generate(DefaultGenerator.java:460) > at org.jooq.util.GenerationTool.main(GenerationTool.java:142) > at org.jooq.util.GenerationTool.main(GenerationTool.java:101) > > the DDL statement (reengineered from SQL Developer) > > CREATE TABLE "LOCATIONS"."MTRLFRMTRLRDRTMPLT" > ( > "PK__MATERIALORDERTEMPLATE_ID" NUMBER(20,0) NOT NULL ENABLE, > "FK__MATERIAL_NO" VARCHAR2(256 BYTE), > "ADDTOAREA" VARCHAR2(1 BYTE), > "PK_ID" NUMBER(20,0) NOT NULL ENABLE, > "IGNOREEXISTINGMATERIAL" VARCHAR2(1 BYTE), > "QUANTITY" NUMBER(10,0), > PRIMARY KEY ("PK__MATERIALORDERTEMPLATE_ID", "PK_ID") USING INDEX > PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL > 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 > FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE > "LOCATIONS_DATA" ENABLE, > CONSTRAINT "MTRLFRMTRLRDRTMPLT_MTRL_MTRL" FOREIGN KEY > ("FK__MATERIAL_NO") REFERENCES "LOCATIONS"."MATERIAL" ("PK_NO") ON > DELETE > SET NULL ENABLE, > CONSTRAINT "MTRLFRMTRLRDRTMPLT_MTRLRDRTMPL" FOREIGN KEY > ("PK__MATERIALORDERTEMPLATE_ID") REFERENCES > "LOCATIONS"."MATERIALORDERTEMPLATE" ("PK_ID") ON > DELETE CASCADE ENABLE > ) > PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE > ( > INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 > PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT > ) > TABLESPACE "LOCATIONS_DATA" ; > CREATE INDEX "LOCATIONS"."IDX_MTRLFRMTRLRDRTMPLT_MTRLRDR" ON > "LOCATIONS"."MTRLFRMTRLRDRTMPLT" > ( > "PK__MATERIALORDERTEMPLATE_ID" > ) > PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE > ( > INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 > PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT > ) > TABLESPACE "LOCATIONS_INDEX" ; > CREATE INDEX "LOCATIONS"."IDX_MTRLFRMTRLRDRTMPLT_MTRL_MT" ON > "LOCATIONS"."MTRLFRMTRLRDRTMPLT" > ( > "FK__MATERIAL_NO" > ) > PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE > ( > INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 > PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT > ) > TABLESPACE "LOCATIONS_INDEX" ; > CREATE UNIQUE INDEX "LOCATIONS"."SYS_C005603" ON > "LOCATIONS"."MTRLFRMTRLRDRTMPLT" > ( > "PK__MATERIALORDERTEMPLATE_ID", "PK_ID" > ) > PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE > ( > INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 > PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT > ) > TABLESPACE "LOCATIONS_DATA" ; > > > that was a little bit messy but hopefully it will help you. > > cheers, > > Manfred > > > 2011/5/30 Lukas Eder <[email protected]>: >> Hi Manfred, >> >> This works fine for me both in my Oracle XE development database, and >> in a "full-fledged" 11g database, so I'm guessing it's not a version >> issue here (unless you have some other version than 10g or 11g? >> >> Can you do these things for me: >> >> - Provide me with the generated Keys.java class (if it exists) >> - Provide me with any errors in your generation log, that you might have >> gotten >> - Provide me with the generated Mtrlfrmtrlrdrtmplt.java class >> - Provide me with the definition of the MTRLFRMTRLRDRTMPLT table >> (CREATE TABLE ... statement, including all key specifications) >> >> Cheers >> Lukas >> >> 2011/5/30 Manfred Schäfer <[email protected]>: >>> Hi, >>> >>> i'm generating source code with jooq 1.5.9. The debug output tells me, >>> that JOOQ has correctly identified the primary keys: >>> >>> DEBUG [main] (JooqLogger.java:142) - Adding primary key : >>> SYS_C0013879 (LOCATIONS.MTRLFRMTRLRDRTMPLT.PK__MATERIALORDERTEMPLATE_ID) >>> DEBUG [main] (JooqLogger.java:142) - Adding primary key : >>> SYS_C0013879 (LOCATIONS.MTRLFRMTRLRDRTMPLT.PK_ID) >>> >>> >>> But in the generated code all primary and foreign keys are missing. >>> The generation properties file conatins the line >>> >>> generator.generate.relations=true >>> >>> If i'm using the same libs with my toy XE Database, the generation >>> works as expected!? >>> >>> regards, >>> >>> Manfred >>> >> >
