вопрос о оракуле - PullRequest
       8

вопрос о оракуле

0 голосов
/ 24 августа 2010

В моем триггере есть две вставки, которые запускаются обновлением. Моя таблица Vendor_Hist имеет поле с именем thID, которое является первичным ключом в таблице Task_History. thID получает свое значение из mySeq.nextval.

INSERT INTO TASK_HISTORY
    ( thID, phId, LABOR, VERSION )         

    ( select   mySeq.NEXTVAL, mySeq2.CurrVal,  LABOR,  tmpVersion 
      from   tasks t     
      where t.project_id = :new.project_ID ); 

  select mySeq.currval into tmpTHID from dual; -- problem here! 

   INSERT INTO VENDOR_HIST 
    ( vhID, thID, Amount, Position, version  ) 

    ( select mySeq3.NEXTVAL,   tmpTHID,  
                Amount, Position, tmpVersion
      from   vendors v2, tasks t2     
      where  v2.myID =  t2.myID 
      and      t2.project_id = :new.project_ID );      

Теперь моя проблема в том, что tmpTHID всегда является последним значением mySeq.nextVal. Итак, если thID в task_history равен 1,2,3, я получаю три вставки в таблицу vendor_hist с 3,3,3. Это должно быть 1,2,3. Я тоже пробовал

  INSERT INTO TASK_HISTORY
    ( thID, phId, LABOR, VERSION )         

    ( select   mySeq.NEXTVAL, mySe2.CurrVal,  LABOR,  tmpVersion 
      from   tasks t     
      where t.project_id = :new.project_ID )  returning thID into :tmpTHID;

но затем я получаю сообщение "предупреждение скомпилировано с ошибками", когда я запускаю триггер. Как мне убедиться, что thID в первой вставке также одинаков во второй вставке?

Надеюсь, это имеет смысл.

Ответы [ 2 ]

0 голосов
/ 24 августа 2010

Вместо currVal он работает со следующим подвыбором.

   (  select min(thID) from task_history t3
       where t3.project_id = t2.project_id
       and t3.myID = t2.myID 
       and t3.version = tmpVersion ), 
0 голосов
/ 24 августа 2010
for i in (select * from tasks t
           where t.project_id = :new.project_id)
loop
  insert into task_history
  ( thID, phId, LABOR, VERSION )              
  values
  (mySeq.NEXTVAL, mySeq2.CurrVal,  i.LABOR,  i.tmpVersion);

  for each j in (select * from vendors v
                  where i.myId = v.myId)
  loop
    insert into vendor_history
    ( vhID, thID, Amount, Position, version  )         
    values    
    (mySeq3.NEXTVAL, mySeq.CURRVAL, j.Amount, j.Position, j.tmpVersion)
  end loop;
end loop;

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

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