在PL / SQL Developer中记录彼此的链接

时间:2019-06-18 16:11:51

标签: oracle plsql record user-defined-types

需要在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的工具。

2 个答案:

答案 0 :(得分:0)

是的,您可以定义一个类型,然后以另一种类型引用它,稍后在代码或系统中进行定义。但是,正如Alex所问,您要完成什么? -也与mathguy发布的内容相反,您可以创建和使用其定义相互依赖的类型。我不建议这样做,但是...

From the documentation

  

不完整类型是由前向类型定义创建的类型。之所以称为不完整,是因为它具有名称,但没有属性或方法。它可以被其他类型引用,从而允许您定义相互引用的类型。但是,必须先完全指定类型,然后才能使用它创建表或对象列或嵌套表类型的列。

答案 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