|
Сравнение при 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 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
авторВ формсах через визард создаёшь блок на эти процедурах, в общих чертах всё... Это понятно, вопрос в другом, нужна ли таблица, если будет блок? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:10 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
авторда, но туда можно и любых других полей добавить которые отсутствуют в данной таблице, ни кто не запрещает, например поле из другой таблицы, просто в подпрограммах заполнять и работать с ним уже ответили на мой вопрос )) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:13 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
Простейший пример merge: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:37 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
pan159, и потом эта процедура вызывается из оракл формс? и when matched означает совпадение строк в таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 15:51 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
И еще вопрос, как привязать :блок1.поле1 и :блок1.поле2 привязать к этой процедуре? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2012, 09:57 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
stuart, ы спрашиваешь базовые вещи, на которые у меня лично нет времени отвечать, доку смотри, по 4.5 есть на русском, хотя на самом деле мне тоже в своё время старшие объесняли что да как... если тебе сильно надо опиши мнен подробно полностью задачу, постаруюсь помочь... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2012, 19:10 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
т.е. мне от тебя не надо инсёрты всякие и прочую лабуду, которая у тебя по 2 строки вставляет, опиши в подробностях что тебе надо, я тебе тогда скажу возможные, оптимальные пути решения на формс, так как я понял что ты в них вообще не сечёшь... опступление, они щас двигают свобю ADF in JDeveloper, говорят что круче формс... да уж, это полный пиз... надо знать всю кухню J2EE чтоб написать что то серьёзное... ха, тут я свой фрэймворк делал для гос проекта, он на 35% быстрей TopLink, короче атас эта ADF... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2012, 19:28 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
OldBoyOdeSu, я попытался сделать процедуру как описано выше и она у меня не сработала, да я в фрмсах совсем новичек. В общем суть залачи - есть кнопка и несколько полей, привязанных к блоку. Надо чтобы по нажатию клавиши срабатывал insert и вставлял информацию из этих полей. Это я сделал, ошибку с 2 строками исправил. Теперь самое интересное - надо чтобы с insert срабатывало условие, если поле в таблице совпадает с полем введенным на форме :блок1.поле1 то выдавать ошибку. Ваша вышеописанная программа по этому поводу теоретически правильна, но не работает в моем случае. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2012, 22:14 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
В моем конкретном случае не хочет отрабатываться следующее условие: Код: plsql 1. 2. 3. 4. 5.
форма на фразу where просто не реагирует ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2012, 10:22 |
|
Сравнение при insert в таблицу
|
|||
---|---|---|---|
#18+
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.
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.
Это набросок формы, дальше сам ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2012, 11:23 |
|
|
start [/forum/topic.php?all=1&fid=51&tid=1878554]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 313ms |
total: | 477ms |
0 / 0 |