запись ссылок друг на друга в PL / SQL Developer - PullRequest
0 голосов
/ 18 июня 2019

Возникла необходимость создавать записи в 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 голосов
/ 19 июня 2019

Вы можете использовать предварительное объявление, чтобы объявить о существовании типа в 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

Вы можете сделать это, используя типы данных объекта и REF в области действия SQL:

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 <> скрипка здесь

0 голосов
/ 18 июня 2019

Да, вы можете определить тип и затем ссылаться на него в другом типе, который вы определите позже в коде или в системе. Однако, как спросил Алекс, что вы пытаетесь достичь? - Также вопреки тому, что опубликовал mathguy, вы можете создавать и использовать типы, определения которых являются взаимозависимыми. Я не рекомендую делать это, но ...

Из документации :

неполный тип - это тип, созданный определением прямого типа. Он называется неполным, потому что у него есть имя, но нет атрибутов или методов. На него могут ссылаться другие типы, что позволяет вам определять типы, которые ссылаются друг на друга. Однако вы должны полностью указать тип, прежде чем использовать его для создания таблицы, столбца объекта или столбца типа вложенной таблицы.

...