The jOOQ code generator internally uses the following query to reliably search all PL/SQL RECORD package types:
SELECT "x"."TYPE_OWNER", "x"."TYPE_NAME", "x"."TYPE_SUBNAME","a".subprogram_id, "a"."ARGUMENT_NAME" "ATTR_NAME", "a"."SEQUENCE" "ATTR_NO", "a"."TYPE_OWNER" "ATTR_TYPE_OWNER", nvl2("a"."TYPE_SUBNAME", "a"."TYPE_NAME", NULL) "package_name", COALESCE("a"."TYPE_SUBNAME", "a"."TYPE_NAME", "a"."DATA_TYPE") "ATTR_TYPE_NAME", "a"."DATA_LENGTH" "LENGTH", "a"."DATA_PRECISION" "PRECISION", "a"."DATA_SCALE" "SCALE" FROM "SYS"."ALL_ARGUMENTS" "a" JOIN ( SELECT "a"."TYPE_OWNER", "a"."TYPE_NAME", "a"."TYPE_SUBNAME", MIN("a"."OWNER") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "OWNER", MIN("a"."PACKAGE_NAME") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "PACKAGE_NAME", MIN("a"."SUBPROGRAM_ID") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "SUBPROGRAM_ID", MIN("a"."SEQUENCE") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "SEQUENCE", MIN("next_sibling") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "next_sibling", MIN("a"."DATA_LEVEL") KEEP (DENSE_RANK FIRST ORDER BY "a"."OWNER" ASC, "a"."PACKAGE_NAME" ASC, "a"."SUBPROGRAM_ID" ASC, "a"."SEQUENCE" ASC) "DATA_LEVEL" FROM ( SELECT lead("a"."SEQUENCE", 1, 99999999) OVER ( PARTITION BY "a"."OWNER", "a"."PACKAGE_NAME", "a"."SUBPROGRAM_ID", "a"."DATA_LEVEL" ORDER BY "a"."SEQUENCE" ASC ) "next_sibling", "a"."TYPE_OWNER", "a"."TYPE_NAME", "a"."TYPE_SUBNAME", "a"."OWNER", "a"."PACKAGE_NAME", "a"."SUBPROGRAM_ID", "a"."SEQUENCE", "a"."DATA_LEVEL", "a"."DATA_TYPE" FROM "SYS"."ALL_ARGUMENTS" "a" WHERE "a"."OWNER" IN ('TEST')
In your case, the result would be something like:
TYPE_NAME TYPE_SUBNAME ATTR_NAME ATTR_TYPE_NAME LENGTH ---------------------------------------------------------------------- TEST_PACKAGE PERSON_RECORD_TYPE FIRST_NAME VARCHAR2 1000 TEST_PACKAGE PERSON_RECORD_TYPE LAST_NAME VARCHAR2 1000
Current restrictions:
- Only types that are referenced by at least one other type and / or procedure will be found in the query. This restriction is inherited from the
ALL_ARGUMENTS dictionary in the request. %ROWTYPE not returned correctly because the row type does not refer to the columns TYPE_NAME / TYPE_SUBNAME .
Further information here: https://blog.jooq.org/2016/11/08/use-jooq-to-read-write-oracle-plsql-record-types