ORA-01731: встречено определение кругового обзора - PullRequest
1 голос
/ 01 октября 2009

мы переходим к оракулу со стороны сервера sql.

на sqlserver у нас был вид, подобный следующему

create view blah
AS 
Select column1, 
       column2
 FROM  blah;

но выполнение этого на оракуле приводит к ошибке кругового обзора.

Разве это не разрешено на стороне оракула?

Ответы [ 3 ]

5 голосов
/ 01 октября 2009

Вы не можете иметь ссылку на само представление. Это логически не имеет смысла. Представление - это, по сути, кэшированный запрос, результаты которого отображаются в виде таблицы. Как запрос может ссылаться на себя?

Действительно, определения циклического представления в Oracle не допускаются. Если у вас есть определение кругового представления, то, скорее всего, в вашей базе данных есть ошибка, которую нужно устранить. Возможно, перевод с SQL-сервера на Oracle был ошибочным и случайно ввел это циклическое определение?

2 голосов
/ 20 февраля 2014

На самом деле вы можете сделать это в ORACLE, но это более хрупко, поскольку вам нужно явно перечислить выходные столбцы вашего CTE. Поэтому, если вы меняете таблицы, вам нужно вручную обновить CTE.

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

CREATE OR REPLACE VIEW deploy.PHARMACYDISPENSE_EX
AS 
   WITH SRC (
        PDID, WAREID, GCN_SEQNO, QTY, UOFM, XACTDTTM, CREATEDON, PROCESSEDON, 
        XACTTYPE, OPDID, CLOSEDON, BYPASSEDON, BYPASSEDBY, ITEMNO, LOTNO, 
        EXP_DATE, VOLUMETYPE, POTYPE, DEPTH
   ) AS (
        SELECT D.PDID, D.WAREID, D.GCN_SEQNO, D.QTY, D.UOFM, D.XACTDTTM, 
               D.CREATEDON, D.PROCESSEDON, D.XACTTYPE, D.OPDID, D.CLOSEDON, 
               D.BYPASSEDON, D.BYPASSEDBY, D.ITEMNO, D.LOTNO, D.EXP_DATE, 
               D.VOLUMETYPE, D.POTYPE, 0 FROM deploy.PHARMACYDISPENSE D 
        WHERE OPDID IS NULL
        UNION ALL
        SELECT D.PDID, D.WAREID, D.GCN_SEQNO, D.QTY, D.UOFM, D.XACTDTTM, 
               D.CREATEDON, D.PROCESSEDON, D.XACTTYPE, D.OPDID, D.CLOSEDON, 
               D.BYPASSEDON, D.BYPASSEDBY, D.ITEMNO, D.LOTNO, D.EXP_DATE, 
               D.VOLUMETYPE, D.POTYPE, (S.DEPTH + 1) 
        FROM deploy.PHARMACYDISPENSE D JOIN SRC S ON S.PDID = D.OPDID
)
SELECT PD.*
FROM SRC PD;

Важной частью здесь является WITH SRC (<output column list>) AS .... Вам нужен этот список выходных столбцов. Так что это возможно и работает, просто требует немного больше кода, чем в SQL Server.

0 голосов
/ 01 октября 2009

Ваш пример неполон - ну, по крайней мере, не показывает соответствующие части.:

<code>
-- create a table
CREATE TABLE Scrap
(fieldName  VARCHAR2(20));
-- create a view
CREATE VIEW ScrapVW1
AS
SELECT * FROM Scrap;
-- create a second view that uses the first view
CREATE VIEW ScrapVW2
AS
SELECT * FROM Scrap
UNION ALL
SELECT * FROM ScrapVW1;
-- recreate the first view that references the 2nd view which contains a reference to itself
CREATE OR REPLACE VIEW SCRAP_VW1
AS
SELECT * FROM ScrapVW2;

Выдает ошибку циклической ссылки при попытке воссоздать ScrapVW1. Я полагаю, что при конвертации происходит непреднамеренное столкновение имен. Если это будет довольно сложно, я избавлюсь от синтаксиса CREATE OR REPLACE VIEW и просто использую CREATE VIEW, что приведет к ошибке «ORA-00955 Name уже используется».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...