Oracle ORDB Иерархические данные - PullRequest
1 голос
/ 11 октября 2009

Я пытаюсь создать некоторые иерархические данные, используя функции отношения объектов Oracles.

Я определил «Пост» следующим образом:

create type Post as object (title varchar(20), body varchar(2000), 
  author varchar(200), parent REF Post,
  MEMBER FUNCTION numReplies RETURN NUMBER,
  PRAGMA RESTRICT_REFERENCES(numReplies, WNDS)
);
/

create table Posts of Post;

Теперь я хочу написать функцию numReplies, чтобы узнать, сколько постов имеют "self" пост в качестве родителя:

create or replace type body Post AS

MEMBER FUNCTION numReplies RETURN number IS
i INT;
BEGIN 
  SELECT COUNT(*) INTO i FROM Posts p WHERE p.parent = SELF;
  RETURN i;
END;

END;
/

Но я получаю ошибку компиляции:

Warning: Type Body created with compilation errors.

SQL> show errors;
Errors for TYPE BODY POST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/3      PL/SQL: SQL Statement ignored
6/56     PL/SQL: ORA-00932: inconsistent datatypes: expected TSTER123.POST
         got REF TSTER123.POST

Я попытался выполнить REF (SELF) в предложении where, и я получил то же сообщение об ошибке. Я также попробовал REF (p.parent) (который в любом случае не имеет смысла), и я получаю ошибку:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/3      PL/SQL: SQL Statement ignored
6/49     PL/SQL: ORA-00904: "P"."PARENT": invalid identifier

Я хочу использовать функции OR (это классный проект), поэтому я не хочу прибегать к добавлению столбца ID для публикации и использования этого. Как мне этого добиться?

ПРИМЕЧАНИЕ: следующий запрос работает, я просто не могу заставить его работать в функции, использующей SELF.

SELECT title, (select count(*) from Posts p2 where p2.parent = REF(p))
FROM Posts p;

EDIT:

Хорошо, я получил его для компиляции, но я не получаю ожидаемых данных.

Вот некоторые фиктивные данные, которые я использовал:

insert into Posts values ('foo', 'bar', 'tyler', null);
insert into Posts values ('hello world', 'bar', 'jatin', (select REF(p) FROM Posts p where p.title = 'foo'));
insert into Posts values ('bark', 'asd', 'tom', (select REF(p) FROM Posts p where p.title = 'hello world'));
insert into Posts values ('friendly', 'hgfags', 'tyler', (select REF(p) FROM Posts p where p.title = 'foo'));

А вот что компилируется:

create or replace type body Post AS
MEMBER FUNCTION numReplies RETURN number IS
i INT;
BEGIN 
  SELECT COUNT(*) INTO i FROM Posts p WHERE DEREF(p.parent) = SELF;
  RETURN i;
END;
END;
/

Но я не получаю правильных результатов:

SQL> SELECT title, (select count(*) from Posts p2 where p2.parent = REF(p)) From Posts p;

TITLE                (SELECTCOUNT(*)FROMPOSTSP2WHEREP2.PARENT=REF(P))
-------------------- ------------------------------------------------
foo                                                                 2
hello world                                                         1
bark                                                                0
friendly                                                            0

SQL> select title, p.numReplies() from Posts p;

TITLE                P.NUMREPLIES()
-------------------- --------------
foo                               0
hello world                       1
bark                              0
friendly                          0

Если я использую это:

create or replace type body Post AS
MEMBER FUNCTION numReplies RETURN number IS
i INT;
BEGIN 
  SELECT COUNT(*) INTO i FROM Posts p WHERE DEREF(p.parent).title = SELF.title;
  RETURN i;
END;
END;
/

Я получаю ожидаемые результаты, но я требую, чтобы каждое сообщение имело уникальный заголовок.

...