在 PL/SQL 开发者中记录相互链接

record linking to each other in PL/SQL Developer

需要在 PL / SQL Developer 中创建相互引用的记录。我是最近才开始明白这一切的,所以对这个目标的实现有疑虑,但我的脑子里一直在想我不是第一个问这个问题的人。因此,如果您知道如何去做或有实施的想法,我将很高兴得到您的帮助,但现在我将继续google。

示例:

TYPE rtype1 IS RECORD
(
/*some code*/
r_type2 rtype2;
);

TYPE rtype2 IS RECORD
(
/*some code*/
r_type1 rtype1;
);

附加信息:

事实是,在xsd方案的基础上,需要生成记录和collections,但是因为在xsd方案中不禁止,这样的需要出现了。并且有必要创建类型,而不是使用用于处理 xml.

的工具

是的,您可以定义一个类型,然后在您稍后在代码或系统中定义的另一个类型中引用它。然而,正如亚历克斯所问,你想要完成什么? -- 同样与 mathguy 发布的内容相反,您可以创建和使用定义为 co-dependent 的类型。我不建议这样做,但是...

From the documentation:

An incomplete type is a type created by a forward type definition. It is called incomplete because it has a name but no attributes or methods. It can be referenced by other types, allowing you define types that refer to each other. However, you must fully specify the type before you can use it to create a table or an object column or a column of a nested table type.

在完全指定类型之前,您可以使用前向声明在 PL/SQL 中声明类型的存在。像这样:

DECLARE
  TYPE rtype2;                              -- Forward declaration
  TYPE rtype1 IS RECORD( r_type2 rtype2 );
  TYPE rtype2 IS RECORD( r_type1 INTEGER );
BEGIN
  NULL;
END;
/

但是,你不能用它来声明一个non-REF相互递归的类型;如果你试试这个:

DECLARE
  TYPE rtype2;
  TYPE rtype1 IS RECORD( r_type2 rtype2 );
  TYPE rtype2 IS RECORD( r_type1 rtype1 );
BEGIN
  NULL;
END;
/

然后你得到错误:

ORA-06550: line 4, column 18:
PLS-00318: type "RTYPE2" is malformed because it is a non-REF mutually recursive type
ORA-06550: line 4, column 3:
PL/SQL: Item ignored

您可以使用对象数据类型和 SQL 范围内的 REF 来做到这一点:

CREATE TYPE otype1;                                       -- Forward declaration
CREATE TYPE otype2 IS OBJECT( o_type1 REF otype1 );
CREATE OR REPLACE TYPE otype1 IS OBJECT( o_type2 otype2 );

但是,如果您尝试使用 non-REF 相互递归类型:

CREATE TYPE otype1;
CREATE TYPE otype2 IS OBJECT( o_type1 otype1 );
/* ORA-24344: success with compilation error */
CREATE TYPE otype1 IS OBJECT( o_type2 otype2 );
/* ORA-04055: Aborted: "OTYPE1" formed a non-REF mutually-dependent cycle with "OTYPE2". */

那就不行了

db<>fiddle here