powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Сравнение при insert в таблицу
35 сообщений из 35, показаны все 2 страниц
Сравнение при insert в таблицу
    #37640527
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Нужно при вставке значений в таблицу, сделать сравнение по одному полю и если оно совпадает со значением в базе, то данное значение не вставлять.
Как это можно реализовать?

Спасибо.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641175
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,
если честно мало что понял из постановки... я бы делел так:

- написал подпрограмму на сервере: my_pkg.is_can_insert возвращает флаг говорящий о том, можно ли вставить новую запись в таблицу;
- перед комитом срабатыват тригер PRE-COMMIT на уровне формы, в нём можно посмотреть статус интересующего рекорда/блока (get_block_property/get_record_property) если запись будет INSERT, то вызвать my_pkg.is_can_insert для проверки;
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641179
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так же можно использовать pre-insert тригер, он гарантированно срабатывает для каждой записи перед инсёртом, там делать проверку и генерировать исключение (raise form_trigger_failure) которое прервёт обработку, затем выдать сообщение.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641254
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSu ,

есть обычный insert into.....
надо, чтобы во время выполнения этого триггера срабатывало исключение, при котором поле в таблице не должно быть равно вставляемому полю.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641255
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

есть обычный insert into..... -
надо, чтобы во время выполнения этого триггера срабатывало исключение

есть тригер в котором есть код:
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641256
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
insert into..... так чтоли?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641257
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSuinsert into..... так чтоли?

да
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641261
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опиши подробно что надо, типа: есть блок на процедуре на нём есть тригер в котором и т.д. или есть user triger в котором...
просто в формсах насколько я знаю insert into генерируется автоматически если блок на таблице или ты сам в процедуре должен это делать если блок на процедуре...

я плохо понимаю что надо тебе делать...
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641273
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу:

Есть некий блок "блок1" с полями из таблицы, есть канва, на которой можно по нажатию клавиши вставить эти данные в таблицу и есть кнопка, которая отрабатывает триггер insert into , используя эти поля с канвы.
Надо, чтобы при вставке этих нескольких полей было сравнение по одному из полей с таблицей и если значение в таблице совпадает с вставляемым, то тогда выдавать ошибку.
Не понимаю как можно вытащить данные из таблицы для сравнения кроме select, и сделать так чтобы можно было сравнить одно из полей допустим :блок1.поле1 с полем в таблице.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641393
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stuartсделать сравнение по одному полю и если оно совпадает со значением в базе, то данное значение не вставлять.
Уникальный индекс по этому полю и ловить exeption ?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641458
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,
"Не понимаю как можно вытащить данные из таблицы для сравнения кроме select, и сделать так чтобы можно было сравнить одно из полей допустим :блок1.поле1 с полем в таблице. "

способов как минимум два
1)MARGE но надо код переносить на сервер, и вызывать из формса(приводить не буду)
2)Обычный инсерт с условием

Пример

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE z_test(id VARCHAR2(5), val VARCHAR2(5))
/
--v forme block1.item1 is z_test.id; block1.item2 is z_test.val
begin
    insert into z_test(id, val)
    select :block1.item1, :block1.item2
    from dual
    where not exists(select 1 from z_test where val = :block1.item2);
        
    if(sql%rowcount = 0)then
        --record is found
        --error;
        null;
    end if;

end;
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641467
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как вообще без select я не знаю...
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641518
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня insert выглядит немного по-другоу
Код: plsql
1.
2.
3.
4.
go_block('блок1');
  insert into tablica
  values (:блок1.поле1, :блок1.поле2);
  commit;



Правда вставляет сразу 2 строки )))
А когда начинаю дописывать select ниже, выдает ошибку, так как :блок1.поле1, :блок1.поле2 уже используются.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641564
Фотография pan159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MERGE - команда SQL, специально для этого предназначенная.

Но Forms, по крайней мере 6i, ее не понимает, считает ошибкой. Поэтому нужно создать процедуру на сервере, куда вставить merge, а уж процедуру вызывать из Forms.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641571
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

что то у тебя сильно закручено всё... как простой инсерт может вставлять сразу две записи? даже если блок многострочный то всегда работа идёт с текущей записью...
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641604
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тот insert что я написал вставляет сразу 2, формс 6.

Смотрю MERGE тоже не просто реализуется, что такое using table_reference?
Код: plsql
1.
2.
3.
4.
5.
MERGE INTO TABLE_NAME USING table_reference ON (condition)
   WHEN MATCHED THEN
   UPDATE SET column1 = value1 [, column2 = value2 ...]
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...



И как этот MERGE будет сравнивать значения в таблице?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641768
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

это тебе не поможет он не будет сильно отличаться от того инсерта что я привел, смысл тот же в данном случае и к тому же ты не сможешь непосредственно написать это в тригере (ошибка компиляции, merge не поддерживается)

тебе надо будет на сервере писать подпрограмму в которую передаёшь параметры и вызывать её из тригера
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641805
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда такой вопрос, какие параметры передавать для сравнения поля из формс и значения самого поля? И я так понимаю, эта подпрограмма будет осуществлять и вставку значений в таблицу.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641866
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

передавать эти параметры: (:блок1.поле1, :блок1.поле2);

у меня складывается впечатление что ты идёшь по неверному пути, это говорит хотя бы выражение commit; вместо принятого в формсах commit_form; так же непонятно почему например не сделать блок на процедурах, если ты всё равно делаешь из него инсерт, а в этой процедуре делай что хочешь и как хочешь, на вход ей автоматически будут данные из твоего блока, оттуда же можешь генерировать свои собственные исключения, которые затем можешь перехватывать в формсах и реагировать на них соответветственно логики (например выдать сообщение что в БД есть поле с таким значением)
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641933
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSu,

Сделать блок на процедурах, это я так понимаю взять, к примеру, Pre-insert?

Исправил на commit_form, все равно добавляет 2 строчки в таблицу.

На счет программы на сервере понял.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641955
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

Сделать блок на процедурах, это я так понимаю взять, к примеру, Pre-insert?
нет, не совсем Pre-insert - это тригер который вызывается у любого базового блока(который связан с БД) перед тем как текущая запись будет вставленна в таблицую Блок на процедуре создаётся так:
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37641971
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSu,

привык Ctrl+Enter = перевод каретки, а тут сразу пост...

так вот создаёшь в БД пакет, в нём type is record с полями которые будут связаны с блоком + процедуры для работы с блоком которые нужны slc ins upd del. В формсах через визард создаёшь блок на эти процедурах, в общих чертах всё...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
type r_block is record(
  id 		number, 
  field_1 	varchar2(100)
);
type t_block is table of r_block index by pls_integer;

procedure slc_block(p_t in out nocopy t_block, p_id number);  
procedure upd_block(p_t in out nocopy t_block);  
procedure ins_block(p_t in out nocopy t_block);  



вся логика вобработки в этих процедурах ,вызываются автаматически при commit_form; (кроме slc_block естественно) в зависимости от операции и на вход поступает рекорд с данными из формы
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642007
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSu,

Спасибо, как я понимаю этот блок будет непосредственно привязан к таблице?
А пакет в БД создается и в нем уже прописывается этот блок?

Просто еще не создавал ни пакетов ни процедур в самой БД, а в задаче есть таблица, которую нужно привязать к форме.

И в формсах визард предлагает сделать блок на процедуре или на таблице.
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642031
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

"этот блок будет непосредственно привязан к таблице?" да, но туда можно и любых других полей добавить которые отсутствуют в данной таблице, ни кто не запрещает, например поле из другой таблицы, просто в подпрограммах заполнять и работать с ним

например
type r_block is record(
id number,
field_1 varchar2(100),
field_from_oter_tbl number
);

я обычно так и делаю, т.е. все блоки в формсах на процедурах, все процедуры на сервере в пакетах, на все пакеты гранты, но нет ни одного гранта на любые другие объекты в схеме для внешних пользователей, т.е. посути они ни с чем кроме этих пакетов работать не могут
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642032
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ формсах через визард создаёшь блок на эти процедурах, в общих чертах всё...

Это понятно, вопрос в другом, нужна ли таблица, если будет блок?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642041
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторда, но туда можно и любых других полей добавить которые отсутствуют в данной таблице, ни кто не запрещает, например поле из другой таблицы, просто в подпрограммах заполнять и работать с ним

уже ответили на мой вопрос ))
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642095
Фотография pan159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейший пример merge:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure save_filter(module varchar2, filt varchar2) is
begin
    merge into user_filter u
    using (select user a, module m, filt b from dual) n
    on ( u.user_name = n.a and u.module = n.m) 
    when matched then update set u.filter = n.b
    when not matched then insert (user_name, module, filter)
    values(n.a,n.m,n.b);  
end;
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37642123
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pan159,

и потом эта процедура вызывается из оракл формс?
и when matched означает совпадение строк в таблице?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37643316
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос, как привязать :блок1.поле1 и :блок1.поле2 привязать к этой процедуре?
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37646405
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

ы спрашиваешь базовые вещи, на которые у меня лично нет времени отвечать, доку смотри, по 4.5 есть на русском, хотя на самом деле мне тоже в своё время старшие объесняли что да как... если тебе сильно надо опиши мнен подробно полностью задачу, постаруюсь помочь...
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37646424
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. мне от тебя не надо инсёрты всякие и прочую лабуду, которая у тебя по 2 строки вставляет, опиши в подробностях что тебе надо, я тебе тогда скажу возможные, оптимальные пути решения на формс, так как я понял что ты в них вообще не сечёшь...

опступление, они щас двигают свобю ADF in JDeveloper, говорят что круче формс... да уж, это полный пиз... надо знать всю кухню J2EE чтоб написать что то серьёзное... ха, тут я свой фрэймворк делал для гос проекта, он на 35% быстрей TopLink, короче атас эта ADF...
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37647885
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OldBoyOdeSu, я попытался сделать процедуру как описано выше и она у меня не сработала, да я в фрмсах совсем новичек.

В общем суть залачи - есть кнопка и несколько полей, привязанных к блоку. Надо чтобы по нажатию клавиши срабатывал insert и вставлял информацию из этих полей. Это я сделал, ошибку с 2 строками исправил.

Теперь самое интересное - надо чтобы с insert срабатывало условие, если поле в таблице совпадает с полем введенным на форме :блок1.поле1 то выдавать ошибку. Ваша вышеописанная программа по этому поводу теоретически правильна, но не работает в моем случае.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE z_test(id VARCHAR2(5), val VARCHAR2(5))
/
--v forme block1.item1 is z_test.id; block1.item2 is z_test.val
begin
    insert into z_test(id, val)
    select :block1.item1, :block1.item2
    from dual
    where not exists(select 1 from z_test where val = :block1.item2);
        
    if(sql%rowcount = 0)then
        --record is found
        --error;
        null;
    end if;

end;
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37648204
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем конкретном случае не хочет отрабатываться следующее условие:

Код: plsql
1.
2.
3.
4.
5.
	go_block('блок1');
  insert into (select поле1, поле2 from table
  where :блок1.поле1 <> поле1)                     
  values  (:блок1.поле1, :блок1.поле2);
  commit_form; 



форма на фразу where просто не реагирует
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37648287
OldBoyOdeSu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuart,

я так понял что данные на форме ты ниоткуда не подгружаешь, иначе надо исправить slc процедуру чтоб она брала нормальные данные, так же в данном случае инсёрт процедура не нужна

принцып такой:
1)есть таблица
CREATE TABLE z_test(id VARCHAR2(5), val VARCHAR2(5))

2)создаёшь пакет в БД
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
REATE OR REPLACE 
PACKAGE zt_form
IS
type r_block is record(
  id 		number, 
  field_1 	varchar2(100)
);
type t_block is table of r_block index by pls_integer;

procedure slc_block(p_t in out nocopy t_block, p_id number); 
procedure upd_block(p_t in out nocopy t_block);  

END; -- Package spec
/


CREATE OR REPLACE 
PACKAGE BODY zt_form
IS
FIELD_DUPLICATE       EXCEPTION; PRAGMA EXCEPTION_INIT(FIELD_DUPLICATE, -20003);

procedure slc_block(p_t in out nocopy t_block, p_id number)
is
begin
    select null, null
    into p_t(1).id, p_t(1).field_1
    from dual;
end;

procedure upd_block(p_t in out nocopy t_block)
is
begin
    insert into z_test(id, val)
    select p_t(1).id, p_t(1).field_1
    from dual
    where not exists(select 1 from z_test where val = p_t(1).field_1);
        
    if(sql%rowcount = 0)then
        raise FIELD_DUPLICATE;
    end if;
end;

   -- Enter further code below as specified in the Package spec.
END;
/



3)Форму создаёшь
create new block wizard -> select procedure(ZT_FORM.slc_block) Refresh, database items >> (ID, FIELD_1)
argument p_id (0 - dummy)

Next>>
Insert procedure = null не используем
Update procedure = ZT_FORM.upd_block, Refresh

на канву поместить эти элементы, сделать кнопку на тригер(WHEN-BUTTON-PRESSED) повешать такой код:
commit_form;

на форме тригер (WHEN-NEW-FORM-INSTANCE):
go_block('BLOCK7');
execute_query;

тригер ON-LOCK
null;

триггер ON-ERROR
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE 
  errnum NUMBER        := ERROR_CODE; 
  errtxt VARCHAR2(100) := substr(ERROR_TEXT,1,100); 
  errtyp VARCHAR2(3)   := ERROR_TYPE; 
  db_err varchar2(80);
BEGIN 
		db_err:=substr(errtxt,instr(errtxt,'ORA-',-1,1)+4);
		if db_err between 20000 and 20999 then
	  	if db_err = 20003 then
	  		Message('RECORD DUPLICATE!!!', ACKNOWLEDGE); 
	  	end if;			
		end if;
end;



Это набросок формы, дальше сам
...
Рейтинг: 0 / 0
Сравнение при insert в таблицу
    #37648334
stuart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Сравнение при insert в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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