Как я могу использовать мои сгенерированные триггеры из консоли sqlplus в буфер формы oracle? - PullRequest
0 голосов
/ 03 декабря 2018

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

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, как показано на следующих рисунках

enter image description here

enter image description here

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

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

enter image description here

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

затем я запустил его

enter image description here

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

Теперь давайте получим его через потоквсем, помогите :)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Отчасти проблема в том, что вы написали четыре триггера для одного события (ну, строго три триггера, потому что у вас есть два сценария с одинаковым именем триггера, но я предполагаю, что это всего лишь шутник cut'n'paste, и вы действительнонамеревался четвертый скрипт создать триггер с именем 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;

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

0 голосов
/ 04 декабря 2018

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

...