Oracle SQL: иерархия таблиц самообращения. Как добавить родителей после выбора наверх с помощью временной таблицы / цикла? - PullRequest
0 голосов
/ 22 октября 2019
  • У меня есть таблица Jobmst, у которой есть первичный ключ jobmst_id, и родительский элемент посредством собственной ссылки на jobmst_prntid.

  • Таким образом, по сути, родители становятся группами для работы или других групп, так как вы можете вкладывать много уровней глубоко.

  • Я пытаюсь определитькогда есть несколько календарей (evntmst_ids) для данного родителя.

  • Но позже, если они скажут на уровне 3 в глубине иерархии, я хочу добавить уровень 2 и уровень 1 обратночерез другой незарегистрированный CTE, через процесс воссоздания jobmst_ids.

  • Чтобы сделать это, я попытался использовать временную таблицу видов, называемых jids. Идея состояла в том, чтобы добавлять все jobmst_ids для потомков родительских идентификаторов несколько раз, пока счетчик количества записей во временной таблице не останется постоянным, после чего все родители родителей родителей и т. Д. Будут добавлены.

Но я продолжаю получать это для jids:


PL / SQL: ORA-00942: таблица или представление не существует

ORA-00942

Есть ли какой-то контекст, который делает jids невидимым? Как мне изменить код, чтобы это исправить? Совет очень ценится.


declare
 cnt number;
 lastcnt number;
begin
with cals_in_group(jobmst_prntid, evntmst_id, cal_count) AS
(
  select jobmst_prntid, evntmst_id, count(1)
  from jobmst
  group by jobmst_prntid, evntmst_id
  order by jobmst_prntid, evntmst_id
),
group_stats_gt_1(jobmst_prntid, tot_job_in_group, num_cal_in_group) AS
(
  select jobmst_prntid, sum(cal_count) , count(1)
  from cals_in_group
  having count(1) > 1
  group by jobmst_prntid
  order by jobmst_prntid
),
/*
select num_cal_in_group, jobmst_prntid
from group_stats_gt_1
order by num_cal_in_group,jobmst_prntid
*/
jids(jobmst_id) AS
(
 select jobmst_prntid from group_stats_gt_1
)
--select jobmst_id from jids;

 select count(1)
 into cnt
 from jids;
 lastcnt := -1;
 WHILE cnt <> lastcnt
 LOOP
   lastcnt := cnt;
   insert into jids
    select jobmst_id 
    from jobmst 
    where jobmst_prntid in(select jobmst_id from jids)
    and   jobmst_id not in(select jobmst_id from jids);
  select count(1)
  into cnt
  from jids;
 END LOOP;
 select count(1) from jids;
end;

1 Ответ

0 голосов
/ 22 октября 2019

Чтобы сделать это, я попытался использовать временную таблицу сортов, называемых jids

Если jids является CTE, это:

jids(jobmst_id) AS
(
 select jobmst_prntid from group_stats_gt_1
)

тогда это не сработает. Вы ничего не можете вставить в него.

Если это должна быть настоящая временная таблица, то создайте глобальную временную таблицу (или частную, в зависимости от используемой вами версии Oracle).

Что-токак это:

SQL> create global temporary table gtt_jids (jobmst_id number)
  2  on commit preserve rows;

Table created.

SQL> begin
  2    for cur_r in (select empno from emp where deptno = 10) loop
  3      insert into gtt_jids values (cur_r.empno);
  4    end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> select * from gtt_jids;

 JOBMST_ID
----------
      7782
      7839
      7934

SQL>

Помимо документации Oracle, посмотрите на Глобальные временные таблицы @ ORACLE-BASE, где все находится в одном месте, с примерами.

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