powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обращение к элементам курсора
11 сообщений из 11, страница 1 из 1
Обращение к элементам курсора
    #39377911
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
На работе из за отсутствия специалиста по Oracle пришлось реализовывать некоторый функционал, а сам я никогда этого не касался.
Написал функцию которая берет некоторые данные и помещает их в курсор:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
FUNCTION FILL_REMOVAL_ATR(POESTEAMTURBINES_VID NUMBER, PERIODID NUMBER) RETURN RECORDSET  IS

VC RECORDSET;
BEGIN
OPEN VC for select pr.STOP_ID, pr.REMOVAL_LAST_YEAR 
from forms fr left join PR340_FR73_S1_T1 pr on pr.FORMS_ID = fr.id where period_id = PERIODID - '1'
and pr.POE_STEAM_TURBINES_VID = POESTEAMTURBINES_VID;
 RETURN (VC);
END FILL_REMOVAL_ATR;


Она возвращает значения в виде {<STOP_ID=3,REMOVAL_LAST_YEAR=2015>,}
Есть у меня триггер, который обращается к функции, берет значение назначает их для новой записи
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create or replace TRIGGER "SCI_TURBINE_PAR_EVENT" BEFORE INSERT ON SCI_TURBINE_PAR
FOR EACH ROW
 BEGIN
   IF :NEW.HAS_REMOVAL = 0
   THEN :new.STOP_ID := FILL_EVENT.FILL_REMOVAL_ATR(:NEW.POE_STEAM_TURBINES_VID);
            --:new.REMOVAL_LAST_YEAR := FILL_EVENT.FILL_REMOVAL_ATR( :NEW.POE_STEAM_TURBINES_VID);
   END IF;  
END;



и все было нормально когда функция возвращала курсору одну переменную.
Весь вопрос в том как теперь триггеру обращаться к элементам курсора? Я плохо знаком с синтаксисом.
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39377930
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egor8413,

процедура с тремя ин-аут-параметрами
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39377948
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure FILL_REMOVAL_ATR(p_POE_STEAM_TURBINES_VID NUMBER, p_PERIOD_ID NUMBER,
p_STOP_ID in out number, p_REMOVAL_LAST_YEAR  in out number)
IS

BEGIN

   select pr.STOP_ID, pr.REMOVAL_LAST_YEAR 
     into p_STOP_ID, p_REMOVAL_LAST_YEAR 
     from forms fr left join PR340_FR73_S1_T1 pr
       on pr.FORMS_ID = fr.id
    where period_id = p_PERIOD_ID - 1
      and pr.POE_STEAM_TURBINES_VID = p_POE_STEAM_TURBINES_VID;

END FILL_REMOVAL_ATR;

create or replace TRIGGER "SCI_TURBINE_PAR_EVENT" BEFORE INSERT ON SCI_TURBINE_PAR
FOR EACH ROW
BEGIN
   IF :NEW.HAS_REMOVAL = 0
   THEN
      FILL_REMOVAL_ATR(:NEW.POE_STEAM_TURBINES_VID, p_PERIOD_ID??, :new.STOP_ID, :new.REMOVAL_LAST_YEAR);
   END IF;  
END;
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39378338
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! все что вы написали работает правильно, т.е. возвращает необходимые данные. Но в моей ситуации появляется ошибка.
Сначала при добавлении записи у меня срабатывает триггер
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace TRIGGER "REA"."AUTOCREATE_TRIGGER" 
BEFORE
insert ON REA.FORMS
for each row
 WHEN (NEW.LIST_OF_FORMS_ID=59 OR NEW.LIST_OF_FORMS_ID=60) begin
  IF :NEW.LIST_OF_FORMS_ID=59
      THEN   AUTOCREATE.AUTOCREATE_SCI_TURBINE_PAR(:NEW.POWER_FACILITIES_VID, :NEW.ID);
      END IF;
end;



Вызываемая им процедура выглядит так :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
PROCEDURE AUTOCREATE_PR340_FR73_S1_T1(
    POWERFACILITIES NUMBER,
    FORMSID NUMBER) as
    BEGIN
FOR row IN (select VID from poe_steam_turbines 
            where POWER_FACILITIES_VID = POWERFACILITIES
            and IS_ACTUAL = 1) LOOP
INSERT INTO PR340_FR73_S1_T1 (
        HAS_PROLONGATION ----ПРОДЛЕНИЕ
       ,HAS_REMARKING ---ПЕРЕМАРКИРОВКА
       ,HAS_REPLACEMENT --ЗАМЕНА
       ,HAS_REMOVAL --ВЫВОД
       ,POE_STEAM_TURBINES_VID
       ,FORMS_ID
       ) VALUES (
         0
        ,0
        ,0
        ,0
        ,row.VID
        ,FORMSID
    );
    END LOOP;
END AUTOCREATE_PR340_FR73_S1_T1;



А затем уже при инсерте в PR340_FR73_S1_T1 срабатывает триггер, который вы мне помогли написать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace TRIGGER "SCI_TURBINE_PAR_EVENT" BEFORE INSERT ON SCI_TURBINE_PAR
FOR EACH ROW
DECLARE
 period NUMBER;
 BEGIN
SELECT PERIOD_ID into period FROM FORMS where Id = :NEW.FORMS_ID;
   IF :NEW.HAS_REMOVAL = 0
   THEN 
        FILL_EVENT.FILL_REMOVAL_ATR(:NEW.POE_STEAM_TURBINES_VID, period,
        :NEW.STOP_ID, :NEW.REMOVAL_LAST_YEAR);
   END IF;  
END;



И в нем вызывается процедура
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
PROCEDURE FILL_REMOVAL_ATR(p_POE_STEAM_TURBINES_VID NUMBER, p_PERIOD_ID NUMBER,
                          p_STOP_ID in out number, p_REMOVAL_LAST_YEAR in out NUMBER)
IS
BEGIN 
    SELECT pr.STOP_ID, pr.REMOVAL_LAST_YEAR
    INTO p_STOP_ID, p_REMOVAL_LAST_YEAR
    FROM FORMS fr LEFT JOIN PR340_FR73_S1_T1 pr
    ON pr.FORMS_ID = fr.ID
    WHERE PERIOD_ID = p_PERIOD_ID - 1
    AND pr.POE_STEAM_TURBINES_VID = p_POE_STEAM_TURBINES_VID;
END FILL_REMOVAL_ATR;


И именно на втором триггере возникает ошибка
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
play.api.Application$$anon$1: Execution exception[[PersistenceException: ERROR executing DML bindLog[] error[ORA-01403: данные не найдены\n ORA-01403: данные не найдены\n ORA-06512: на  "REA.SCI_TURBINE_PAR_EVENT", line 4\n ORA-04088: ошибка во время выполнения триггера 'REA.SCI_TURBINE_PAR_EVENT'\n ORA-06512: на  "REA.AUTOCREATE", line 549\n ORA-06512: на  "REA.AUTOCREATE_TRIGGER", line 3\n ORA-04088: ошибка во время выполнения триггера 'REA.AUTOCREATE_TRIGGER'\n ]]]
	at play.api.Application$class.handleError(Application.scala:296) ~[play_2.10-2.3.8.jar:2.3.8]
	at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.10-2.3.8.jar:2.3.8]
	at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.10-2.3.8.jar:2.3.8]
	at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.10-2.3.8.jar:2.3.8]
	at scala.Option.map(Option.scala:145) [scala-library.jar:na]
Caused by: javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[ORA-01403: данные не найдены\n ORA-01403: данные не найдены\n ORA-06512: на  "REA.SCI_TURBINE_PAR_EVENT", line 4\n ORA-04088: ошибка во время выполнения триггера 'REA.SCI_TURBINE_PAR_EVENT'\n ORA-06512: на  "REA.AUTOCREATE", line 549\n ORA-06512: на  "REA.AUTOCREATE_TRIGGER", line 3\n ORA-04088: ошибка во время выполнения триггера 'REA.AUTOCREATE_TRIGGER'\n ]
	at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:97) ~[avaje-ebeanorm-3.3.4.jar:na]
	at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:57) ~[avaje-ebeanorm-3.3.4.jar:na]
	at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeInsertBean(DefaultPersistExecute.java:66) ~[avaje-ebeanorm-3.3.4.jar:na]
	at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:448) ~[avaje-ebeanorm-3.3.4.jar:na]
	at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:478) ~[avaje-ebeanorm-3.3.4.jar:na]
Caused by: java.sql.SQLException: ORA-01403: данные не найдены
ORA-01403: данные не найдены
ORA-06512: на  "REA.SCI_TURBINE_PAR_EVENT", line 4
ORA-04088: ошибка во время выполнения триггера 'REA.SCI_TURBINE_PAR_EVENT'
ORA-06512: на  "REA.AUTOCREATE", line 549
ORA-06512: на  "REA.AUTOCREATE_TRIGGER", line 3
ORA-04088: ошибка во время выполнения триггера 'REA.AUTOCREATE_TRIGGER'


Что у меня может быть не так и в какую сторону копать, чтобы выявить ошибку?
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39378350
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egor8413,

Код: plsql
1.
SELECT PERIOD_ID into period FROM FORMS where Id = :NEW.FORMS_ID;


Проверять, всегда ли запрос возвращает данные.

И либо обрабатывать возникающую ошибку, либо неявно гасить её используя агрегацию и обработку NULL.

Код: plsql
1.
SELECT nvl(max(PERIOD_ID),some_default_period_id) into period FROM FORMS where Id = :NEW.FORMS_ID;
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39379483
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вся проблема именно в :NEW.FORMS_ID. Когда подставляю какой существующий ID - все норм. Как проверить присваивается ли какой либо новый ID ?
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39379488
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверять, всегда ли запрос возвращает данные.

exception when NO_DATA_FOUND
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39379498
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнении
Код: plsql
1.
SELECT nvl(max(PERIOD_ID),2016) into period FROM FORMS where Id = :NEW.FORMS_ID;


срабатывает нормально, т. е используется 2016 и я думаю что это явно указывает что :NEW.FORMS_ID = NULL.
Но почему именно :NEW.FORMS_ID = NULL, остальные параметры (:NEW.POE_STEAM_TURBINES_VID,
:NEW.STOP_ID, :NEW.REMOVAL_LAST_YEAR) имеют значения, а именно с этим проблема. Ведь ошибка происходит на строке
Код: plsql
1.
INSERT INTO PR340_FR73_S1_T1 (

в процедуре autocreate, ведь на этом моменте уже сгенерирован новый ID, возможно ли его как то передать в триггер SCI_TURBINE_PAR_EVENT ?
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39379555
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А затем уже при инсерте в PR340_FR73_S1_T1 срабатывает триггер, который вы мне помогли написать

create or replace TRIGGER "SCI_TURBINE_PAR_EVENT" BEFORE INSERT ON SCI_TURBINE_PAR


Разберитесь для начала с вашими таблицами и триггерами.
Вызнавать телепатически вашу конфигурацию особого желания нет.
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39379578
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извиняюсь за неразбериху на самом деле там SCI_TURBINE_PAR и PR340_FR73_S1_T1 это синонимы, на самом деле это одна таблица.
...
Рейтинг: 0 / 0
Обращение к элементам курсора
    #39380447
Egor8413
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказывается вся проблема была в том что нельзя обращаться к изменяемой таблице. Я сделал буферную таблицу, в которую в момент срабатывания триггера заношу все те данные что мне нужны, использую их далее и потом очищаю эту буферную таблицу.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обращение к элементам курсора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]