Как я могу использовать сгенерированные триггеры из консоли sqlplus в Bulider форм Oracle?

Я создал следующую таблицу:

create table Citizens_lic
(
No NUMBER(10) ,
ID NUMBER(10)   
constraint Citizens_ID_pk_1 PRIMARY KEY,
F_Name VARCHAR2(32) ,
M_Name VARCHAR2(32) ,
L_Name VARCHAR2(32) ,
DOB DATE ,
POF VARCHAR2(32) ,
GENDER VARCHAR2(32) ,
Soc_status VARCHAR2(32) ,
work_status VARCHAR2(32) ,
ISS_DATE date ,
EXP_Date date   
)

Затем я сгенерировал несколько триггеров для id, no, iss_date Exp_date из команды sqlplus, как показано на следующих рисунках.

введите описание изображения здесь

введите описание изображения здесь

после этого все триггеры отлично работают с командой sqlplus, все вставленные значения, такие как id, и никакие столбцы не создаются сами автоматически после создания строки

Теперь я хочу показать вам, где я застрял! Я пошел в конструктор форм Oracle. Я создал эту форму.

введите описание изображения здесь

и удалил все поля элементов ID, No, Iss_date, Exp_date, потому что в этом нет необходимости, каждый из них должен быть уже сгенерирован триггером.

потом я запустил это

введите описание изображения здесь

невозможно вставить!

Теперь давайте разберемся с потоком, кто-нибудь поможет :)


person Abe. Cherry    schedule 03.12.2018    source источник
comment
Если вы используете клавишу или пункт меню «Показать ошибку», он должен отображать фактическую ошибку, которая вызывает это общее сообщение об ошибке Oracle Forms. community.oracle.com/thread/863259?tstart=9479   -  person kfinity    schedule 04.12.2018
comment
Прочтите meta.stackoverflow.com/questions/285551/ и принятый ответ   -  person a_horse_with_no_name    schedule 04.12.2018
comment
:), понял сэр, #no_more_screenshots   -  person Abe. Cherry    schedule 12.12.2018


Ответы (2)


Частично проблема заключается в том, что вы написали четыре триггера для одного события (ну, строго три триггера, потому что у вас есть два сценария с одним и тем же именем триггера, но я предполагаю, что это просто промах, и вы действительно намеревались четвертый сценарий для создания триггера с именем citizens_lic_trigg_4). Другая часть проблемы заключается в том, что у вас есть два триггера, заполняющих :new.no, и ни один триггер, заполняющий :new.id, который является основным необходимо заполнить.

Срабатывание четырех триггеров на вставке вызывает в четыре раза больше накладных расходов, чем срабатывание одного триггера. Так что из соображений производительности лучше использовать только один триггер. Но это также помогает избежать ошибок в вашем коде, потому что сканирование одного скрипта проще, чем сканирование четырех. В частности, когда вы просто редактируете кешированный оператор (ed afiedt.buf), чтобы не видеть все четыре сценария (*).

Итак, лучшая реализация:

create or replace trigger citizens_lic_trigg
     before insert on citizens_lic
     for each row
begin
    /* or maybe these two assignments should be the other way round??? */
    :new.id := citizens_lic_seq_1.nextval;
    :new.no := round(dbms_random.value(1000500000,1099999999));
    :new.iss_date := sysdate;
    :new.exp_date := sysdate + (365*5);
end;

(*) Если вы не делаете снимок экрана после каждого редактирования, как вы это сделали здесь. Но это действительно неэффективно: в конечном итоге вам будет полезно иметь отдельные именованные файлы для каждого сценария, чтобы вы могли сохранять их в системе управления версиями.

person APC    schedule 03.12.2018

две мысли: оба ваших триггера _1 и _2 вставьте в new.no. на втором снимке экрана дважды создается триггер _3. Я бы сказал, что ваша проблема в том, что вы не предоставляете никакой ценности для своего ПК, идентификатора. HTH

person Peter    schedule 03.12.2018