需要在PL / SQL Developer中创建互相引用的记录。我最近开始了解所有这一切,因此对实现此目标存在疑问,但也有一种想法浮现在我脑海:我不是第一个提出这个问题的人。因此,如果您知道该怎么做或有实现的想法,我将非常高兴您的帮助,但现在我将继续使用Google。
示例:
TYPE rtype1 IS RECORD
(
/*some code*/
r_type2 rtype2;
);
TYPE rtype2 IS RECORD
(
/*some code*/
r_type1 rtype1;
);
其他信息:
事实是,基于xsd方案,您需要生成记录和集合,但是由于在xsd方案中没有禁止这样做,所以出现了这种需求。并且必须创建类型,而不要使用用于xml的工具。
答案 0 :(得分:0)
是的,您可以定义一个类型,然后以另一种类型引用它,稍后在代码或系统中进行定义。但是,正如Alex所问,您要完成什么? -也与mathguy发布的内容相反,您可以创建和使用其定义相互依赖的类型。我不建议这样做,但是...
不完整类型是由前向类型定义创建的类型。之所以称为不完整,是因为它具有名称,但没有属性或方法。它可以被其他类型引用,从而允许您定义相互引用的类型。但是,必须先完全指定类型,然后才能使用它创建表或对象列或嵌套表类型的列。
答案 1 :(得分:0)
在完全指定类型之前,可以使用前向声明在PL / SQL中声明类型的存在。像这样:
DECLARE
TYPE rtype2; -- Forward declaration
TYPE rtype1 IS RECORD( r_type2 rtype2 );
TYPE rtype2 IS RECORD( r_type1 INTEGER );
BEGIN
NULL;
END;
/
但是,不能使用它来声明非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 );
但是,再次,如果您尝试使用非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 <>提琴here