У меня есть хранимая процедура, которая производит правильный вывод, и я хотел бы сохранить результаты в материализованном представлении.У меня возникают проблемы с концептуализацией того, как заставить это работать, потому что процедура опирается на созданную мной временную таблицу с именем tmp$
.
Моя цель состоит в том, чтобы переписать хранимую процедуру так, чтобы она не требовалась.используйте временную таблицу, и результаты могут быть сохранены в материализованном представлении.
Моя конечная цель - создать структуру данных, которая соответствует требованиям алгоритма Modified Preorder Tree Traversal
.
tmp$
временная таблица:
CREATE GLOBAL TEMPORARY TABLE tmp$
(
id VARCHAR2(8),
l INT,
r INT
) ON COMMIT DELETE ROWS;
Хранимая процедура:
CREATE OR REPLACE PACKAGE pkg AS
PROCEDURE p (
p_id IN VARCHAR2,
seq IN OUT INT
);
END pkg;
CREATE OR REPLACE PACKAGE BODY pkg AS
PROCEDURE p (
p_id IN VARCHAR2,
seq IN OUT INT
)
AS
BEGIN
seq := seq + 1;
INSERT INTO tmp$ (
id,
l,
r
) VALUES (
p_id,
seq,
NULL
);
FOR i IN (
SELECT
id
FROM
tab1
WHERE
parent_id = p_id
ORDER BY
id
) LOOP
p(i.id,seq);
END LOOP;
seq := seq + 1;
UPDATE tmp$
SET
r = seq
WHERE
id = p_id;
END;
END pkg;
tab1
данные
+-----+-----------+
| id | parent_id |
+-----+-----------+
| 01 | null |
+-----+-----------+
| 100 | 01 |
+-----+-----------+
| 901 | 01 |
+-----+-----------+
| 250 | 01 |
+-----+-----------+
| 400 | 01 |
+-----+-----------+
| 001 | 01 |
+-----+-----------+
| 500 | 01 |
+-----+-----------+
| 600 | 01 |
+-----+-----------+
| 010 | 01 |
+-----+-----------+
| 450 | 01 |
+-----+-----------+
Вызов хранимой процедуры:
VAR n NUMBER
EXEC :n := 0;
EXEC pkg.p('01',:n);
select * from tmp$;
Выполнение pkg.p
заполняет таблицу tmp$
следующими данными:
+-----+----+----+
| id | l | r |
+-----+----+----+
| 01 | 1 | 20 |
+-----+----+----+
| 001 | 2 | 3 |
+-----+----+----+
| 010 | 4 | 5 |
+-----+----+----+
| 100 | 6 | 7 |
+-----+----+----+
| 250 | 8 | 9 |
+-----+----+----+
| 400 | 10 | 11 |
+-----+----+----+
| 450 | 12 | 13 |
+-----+----+----+
| 500 | 14 | 15 |
+-----+----+----+
| 600 | 16 | 17 |
+-----+----+----+
| 901 | 18 | 19 |
+-----+----+----+
Если я попытаюсь поместить эти четыре строки выше в предложении CREATE MATERIALIZED VIEW
, материализованное представление будет пустым.
Я не уверен, как вообще начать решать это.Стоит ли смотреть на использование таблицы сбора?Я не уверен, как это будет работать, поскольку p
работает рекурсивно.