|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
Всем привет. Нужно при вставке значений в таблицу, сделать сравнение по одному полю и если оно совпадает со значением в базе, то данное значение не вставлять. Как это можно реализовать? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 18:24 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, если честно мало что понял из постановки... я бы делел так: - написал подпрограмму на сервере: my_pkg.is_can_insert возвращает флаг говорящий о том, можно ли вставить новую запись в таблицу; - перед комитом срабатыват тригер PRE-COMMIT на уровне формы, в нём можно посмотреть статус интересующего рекорда/блока (get_block_property/get_record_property) если запись будет INSERT, то вызвать my_pkg.is_can_insert для проверки; ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 07:04 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
так же можно использовать pre-insert тригер, он гарантированно срабатывает для каждой записи перед инсёртом, там делать проверку и генерировать исключение (raise form_trigger_failure) которое прервёт обработку, затем выдать сообщение. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 07:14 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSu , есть обычный insert into..... надо, чтобы во время выполнения этого триггера срабатывало исключение, при котором поле в таблице не должно быть равно вставляемому полю. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:34 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, есть обычный insert into..... - надо, чтобы во время выполнения этого триггера срабатывало исключение есть тригер в котором есть код: ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:37 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
insert into..... так чтоли? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:38 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSuinsert into..... так чтоли? да ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:39 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
опиши подробно что надо, типа: есть блок на процедуре на нём есть тригер в котором и т.д. или есть user triger в котором... просто в формсах насколько я знаю insert into генерируется автоматически если блок на таблице или ты сам в процедуре должен это делать если блок на процедуре... я плохо понимаю что надо тебе делать... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:43 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
Пишу: Есть некий блок "блок1" с полями из таблицы, есть канва, на которой можно по нажатию клавиши вставить эти данные в таблицу и есть кнопка, которая отрабатывает триггер insert into , используя эти поля с канвы. Надо, чтобы при вставке этих нескольких полей было сравнение по одному из полей с таблицей и если значение в таблице совпадает с вставляемым, то тогда выдавать ошибку. Не понимаю как можно вытащить данные из таблицы для сравнения кроме select, и сделать так чтобы можно было сравнить одно из полей допустим :блок1.поле1 с полем в таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 09:52 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuartсделать сравнение по одному полю и если оно совпадает со значением в базе, то данное значение не вставлять. Уникальный индекс по этому полю и ловить exeption ? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 11:06 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, "Не понимаю как можно вытащить данные из таблицы для сравнения кроме select, и сделать так чтобы можно было сравнить одно из полей допустим :блок1.поле1 с полем в таблице. " способов как минимум два 1)MARGE но надо код переносить на сервер, и вызывать из формса(приводить не буду) 2)Обычный инсерт с условием Пример Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 11:31 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
а как вообще без select я не знаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 11:34 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
У меня insert выглядит немного по-другоу Код: plsql 1. 2. 3. 4.
Правда вставляет сразу 2 строки ))) А когда начинаю дописывать select ниже, выдает ошибку, так как :блок1.поле1, :блок1.поле2 уже используются. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 11:53 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
MERGE - команда SQL, специально для этого предназначенная. Но Forms, по крайней мере 6i, ее не понимает, считает ошибкой. Поэтому нужно создать процедуру на сервере, куда вставить merge, а уж процедуру вызывать из Forms. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 12:12 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, что то у тебя сильно закручено всё... как простой инсерт может вставлять сразу две записи? даже если блок многострочный то всегда работа идёт с текущей записью... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 12:14 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
Тот insert что я написал вставляет сразу 2, формс 6. Смотрю MERGE тоже не просто реализуется, что такое using table_reference? Код: plsql 1. 2. 3. 4. 5.
И как этот MERGE будет сравнивать значения в таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 12:28 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, это тебе не поможет он не будет сильно отличаться от того инсерта что я привел, смысл тот же в данном случае и к тому же ты не сможешь непосредственно написать это в тригере (ошибка компиляции, merge не поддерживается) тебе надо будет на сервере писать подпрограмму в которую передаёшь параметры и вызывать её из тригера ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 13:26 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
Тогда такой вопрос, какие параметры передавать для сравнения поля из формс и значения самого поля? И я так понимаю, эта подпрограмма будет осуществлять и вставку значений в таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 13:41 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, передавать эти параметры: (:блок1.поле1, :блок1.поле2); у меня складывается впечатление что ты идёшь по неверному пути, это говорит хотя бы выражение commit; вместо принятого в формсах commit_form; так же непонятно почему например не сделать блок на процедурах, если ты всё равно делаешь из него инсерт, а в этой процедуре делай что хочешь и как хочешь, на вход ей автоматически будут данные из твоего блока, оттуда же можешь генерировать свои собственные исключения, которые затем можешь перехватывать в формсах и реагировать на них соответветственно логики (например выдать сообщение что в БД есть поле с таким значением) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 14:01 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSu, Сделать блок на процедурах, это я так понимаю взять, к примеру, Pre-insert? Исправил на commit_form, все равно добавляет 2 строчки в таблицу. На счет программы на сервере понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 14:28 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, Сделать блок на процедурах, это я так понимаю взять, к примеру, Pre-insert? нет, не совсем Pre-insert - это тригер который вызывается у любого базового блока(который связан с БД) перед тем как текущая запись будет вставленна в таблицую Блок на процедуре создаётся так: ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 14:35 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSu, привык Ctrl+Enter = перевод каретки, а тут сразу пост... так вот создаёшь в БД пакет, в нём type is record с полями которые будут связаны с блоком + процедуры для работы с блоком которые нужны slc ins upd del. В формсах через визард создаёшь блок на эти процедурах, в общих чертах всё... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
вся логика вобработки в этих процедурах ,вызываются автаматически при commit_form; (кроме slc_block естественно) в зависимости от операции и на вход поступает рекорд с данными из формы ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 14:45 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSu, Спасибо, как я понимаю этот блок будет непосредственно привязан к таблице? А пакет в БД создается и в нем уже прописывается этот блок? Просто еще не создавал ни пакетов ни процедур в самой БД, а в задаче есть таблица, которую нужно привязать к форме. И в формсах визард предлагает сделать блок на процедуре или на таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:01 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, "этот блок будет непосредственно привязан к таблице?" да, но туда можно и любых других полей добавить которые отсутствуют в данной таблице, ни кто не запрещает, например поле из другой таблицы, просто в подпрограммах заполнять и работать с ним например type r_block is record( id number, field_1 varchar2(100), field_from_oter_tbl number ); я обычно так и делаю, т.е. все блоки в формсах на процедурах, все процедуры на сервере в пакетах, на все пакеты гранты, но нет ни одного гранта на любые другие объекты в схеме для внешних пользователей, т.е. посути они ни с чем кроме этих пакетов работать не могут ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:10 |
|
|
start [/forum/topic.php?fid=51&msg=37641866&tid=1878554]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 322ms |
total: | 490ms |
0 / 0 |