powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Сравнение при insert в таблицу
25 сообщений из 35, страница 1 из 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
25 сообщений из 35, страница 1 из 2
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Сравнение при insert в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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