Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу / 25 сообщений из 26, страница 1 из 2
25.05.2018, 17:42
    #39650066
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
В клиентском приложении срабатывет исключение DUP_VAL_ON_INDEX из пакитжа, а там всег лишь INSERT ровно одной записи.
Никогда не анализировал индексы. Подскажите, оракл говорит о дубликатах при попытке вставки? Тогда не получается имитировать исключение. К примеру, создаю таблицу и индекс. Поля K и B_ID оба целые и не уникальные:
Код: plsql
1.
2.
3.
CREATE TABLE "MY_TTT" 
   ("ID" NUMBER, "K"  NUMBER, "B_ID" NUMBER);
CREATE UNIQUE INDEX "MY_UNIQ" ON "MY_TTT" (DECODE("K",1,"K"+"B_ID"));

В реале в таблице несколько индексов, а этот с такими св-вами:
UNIQUE
VALID
index_type= FUNCTION-BASED NORMAL
funcidx_status= ENABLED
column_expression= DECODE("K",1,"K"+"B_ID")

Не получается ловушка на DUP_VAL_ON_INDEX
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
    cnt integer;
begin
    delete from MY_TTT where b_id=355435; --where id >1;
    select count(b_id) into cnt from my_ttt; 
    dbms_output.put_line(cnt);

    insert into MY_TTT (id,k,b_id) VALUES (2,0,355435);
    select count(b_id) into cnt from my_ttt; --where id=2;
    dbms_output.put_line(cnt);

    EXCEPTION
        WHEN DUP_VAL_ON_INDEX THEN
            RAISE_APPLICATION_ERROR ( SQLCODE, 'ORACLE Error ' || SQLCODE|| ' : ' || SQLERRM);
        WHEN OTHERS THEN
            RAISE_APPLICATION_ERROR ( -20000, 'ORACLE Error ' || SQLCODE|| ' : ' || SQLERRM);
end; 
...
Рейтинг: 0 / 0
25.05.2018, 17:49
    #39650072
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98 Не получается ловушка на DUP_VAL_ON_INDEXТ.е. по-твоему, выражение DECODE("K",1,"K"+"B_ID") равно одному и тому же для обоих строк? А если начать думать?
...
Рейтинг: 0 / 0
25.05.2018, 17:51
    #39650075
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
...
Рейтинг: 0 / 0
25.05.2018, 17:52
    #39650077
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
Elic, это было предположение.
...
Рейтинг: 0 / 0
25.05.2018, 18:08
    #39650089
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
Ах, зараза, забыл написать, что сначала есть строка
insert into MY_TTT (id,k,b_id) VALUES (1,1,355434);

И я подумал, что 1 + 355434 == 0+ 355435.
Потому что в реале это единственный b_id из 4-х, у которого есть соседние b_id, вот на него и подозрение.
...
Рейтинг: 0 / 0
25.05.2018, 18:40
    #39650105
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
[quot exp98]И я подумал, что 1 + 355434 == 0+ 355435 [quot] а оно оказывается ==NULL ? но таких с NULL полно. А что ещё может дать исключение?

constraint k in {0, 1}
b_id - их конкретно 4 шт, сильно разных, и только 355434 ещё имеется, у остальных соседей нет.
...
Рейтинг: 0 / 0
25.05.2018, 23:10
    #39650181
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98,
Вы поняли эту конструкцию?
Код: plsql
1.
CREATE UNIQUE INDEX "MY_UNIQ" ON "MY_TTT" (DECODE("K",1,"K"+"B_ID"));


У Вас функциональный индекс на поле "K"=1 (остальное в индекс не попадет) со странным условием "K"+"B_ID".
Если индекс уникальный то при "K"=1 он будет делать "K"+"B_ID" т.е. 1 + "B_ID" и как следствие на индекс влияет только "B_ID", что не являеться уникальным ("Поля K и B_ID оба целые и не уникальные"). т.о. прибавлять 1 ко всем не вижу смысла, но кто знает Ваши селекты ...

exp98В клиентском приложении срабатывет исключение DUP_VAL_ON_INDEX...

exp98b_id - их конкретно 4 шт, сильно разных
Так как исключение срабатывает Вы ее (запись которую пытались добавить или изменить) не найдете в таблице т.к. исключение сработало (т.е. не понятно что Вы ищите)
...
Рейтинг: 0 / 0
28.05.2018, 11:11
    #39650915
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
MaximaXXL, спасибо за участие в проблеме. Направление поиска переместилось, я не знал, что decode() в индексе по умолчанию даёт NULL, ну и документация по индексам помогла.

Да, Именно так я и понимаю индексное выражение.
Искал я не отсутстввующую запись, а ту, к-рая могла мешать новой, выяснилось, что не совсем "ту" искал, но всё равно не нашёл.

К+Bid - ради бизнес-правила.
Никому это не интересно, но идея индекса была такой, что записей с К=1 не должно быть более одной. А если их нет, то при вставке задавать К=1, иначе NULL.

На деле перед вставкой стоит проверка
select count(*) into cnt from my_ttt where b_id= число,
но я переделал в проце вывод для клиента, и он показывает, что cnt=2, и кажется, что всё логично.

В то же время отдельно стоящий запрос на реальных таблицах
select count(*) /*into cnt*/ from my_ttt where b_id= число
даёт 1, а cnt=2.
Вопрос теперь в этом. Но дело может оказаться и хитрее, т.к. это проца вызывается из другой в цикле по курсору. Но там всего 4 вызова, и все должны нормално отрабатывать, ан нет ... такие дела.
...
Рейтинг: 0 / 0
28.05.2018, 11:30
    #39650938
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98На деле перед вставкой стоит проверка
select count(*) into cnt from my_ttt where b_id= число,В многопользовательской среде это глупая наивность.
...
Рейтинг: 0 / 0
28.05.2018, 12:14
    #39650987
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
Причина исключения не в наивности, т.к. легко воспроизводится на этих идешниках в монопольке. А вот в чём, до сих пор не понял.
Но кстаи, данная операция весьма ответственная, и её проводят "специально обученные люди". Ну а так, правда Ваша.
...
Рейтинг: 0 / 0
28.05.2018, 12:16
    #39650990
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
И всё равно, если вызываю процу из девелопера, то она исправно добавляет нужные 4 записи.
...
Рейтинг: 0 / 0
28.05.2018, 12:21
    #39650996
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98А вот в чём, до сих пор не понял.Твоё невежество прёт из всех щелей, поэтому попробуй задать вопрос так, чтобы быть понятым. http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
28.05.2018, 12:42
    #39651022
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
Рассказал бы, какие щели ты увидел, но если кто захочет поразбираться, то вопрос сейчас у меня звучит так.

Если запрос
select count(*) into cnt from my_ttt where b_id= число
выполняется во время работы клиентского приложения, то
cnt =2.

Когда я выполняю его аналог из девелопера
select count(*) /*into cnt*/ from my_ttt where b_id= число, то
cnt =1.

Это реальный запрос, с той разницей, что есть ещё другие индексы как уник, так и и не уник. Из-за чего может быть различие? Мифических других пользователей нет, это на отдельной БД.
...
Рейтинг: 0 / 0
28.05.2018, 13:03
    #39651040
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98,

ты несешь несвязный бред...
exp98выполняется во время работы клиентского приложения, тону, например, вставило твое "клиентское приложение" вторую строку, посчитало count, роллбэкнулось - и?

Либо создавай адекватный тест-кейс, который бы показывал твою проблему, либо давай полный код, а пока это просто какой-то бред...
...
Рейтинг: 0 / 0
28.05.2018, 13:23
    #39651060
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98если кто захочет поразбираться xtender , оно само роллбэкнулось ??
Весь фреймоворк устроен так, что приложение само не коммитится (кроме специальных случаев). Это делает юзер в ГУИ, в даном случае я за него, и я отвечаю: нет, не роллбэкнулось и не комитилось.

А базу тоже полную давать?
...
Рейтинг: 0 / 0
28.05.2018, 13:32
    #39651068
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98и не комитилось.ну какого гуя другая сессия будет видеть вторую строку?
...
Рейтинг: 0 / 0
28.05.2018, 13:35
    #39651072
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
Уважаемые ораклисты, вот так всегда устраивают "побоище на птичьем дворе".
Кто-то наносит красную метку, а другие курицы начинают заклёвывать, думая, что это кровь.
Не надо побоища, не тратьте времени на писанину либо пишите по делу.
...
Рейтинг: 0 / 0
28.05.2018, 13:35
    #39651073
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
xtender, я в одной сессии.
...
Рейтинг: 0 / 0
28.05.2018, 13:36
    #39651077
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
xtender, ах, ну да, клиент сидит в одной сессии от старта до выхода из программы.
...
Рейтинг: 0 / 0
28.05.2018, 13:38
    #39651078
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98,

Тебе вообще-то тут помогают понять элементарные вещи... Никакие "красные метки" никто кроме тебя тут не наносит.
...
Рейтинг: 0 / 0
28.05.2018, 13:38
    #39651079
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98а другие курицыЛамер начинает воинствовать?
...
Рейтинг: 0 / 0
28.05.2018, 14:00
    #39651090
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98xtender, я в одной сессии.и девелопер и клиентское приложение у тебя работают в одной сессии?

Зы. Жаль тут нельзя сохранять собственные комментарии о пользователе, чтобы легче было человека вспомнить.
...
Рейтинг: 0 / 0
28.05.2018, 14:12
    #39651095
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
xtender, если бы. В любом случае исходная таблица для клиента и девелопера одна и та же, а результат разный.

Получив на клиенте неприличный результат, я конечно же делаю откат. Наверное этим уже сбиваю с толку? Т.о. для девелопера таблица остаётся такой же, и там всё видно. А могу на клиенте закомитить, а в девелопере лишнее удалить. Всё легко воспроизводится десяток раз и с любого компа, и девелопер с любого компа.
...
Рейтинг: 0 / 0
28.05.2018, 14:18
    #39651101
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
exp98исходная таблица для клиента и девелопера одна и та же, а результат разный.
Все, что пока что вижу - бессвязный поток сознания.
Ни постановки проблемы, ни сути затруднений.
Делайте вменяемый тест-кейс... либо обращайтесь в лигу сексуальных реформ (с).
...
Рейтинг: 0 / 0
28.05.2018, 14:38
    #39651110
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу
xtenderЗы. Жаль тут нельзя сохранять собственные комментарии о пользователе, чтобы легче было человека вспомнить.В профиль пользователя, помимо "Откуда", нужно добавить "Куда" с редактированием всеми, кроме владельца профиля.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XE11g: не имитируется DUP_VAL_ON_INDEX при попытке INSERT в таблицу / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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