powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / дублирующие значения в БД
8 сообщений из 8, страница 1 из 1
дублирующие значения в БД
    #36428907
VisMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
Задача такая: необходимо добавить строку в таблицу при этом предварительно проверив что такой строки еще нет

Реализовываю проверку на дублирующие строки при помощи validation: type - function return error text проверка следующая:

Declare
ret varchar2(4000);
BEGIN
select * into ret
from
( SELECT "SA"."CATALOGUE_LEVEL_2"."PLATFORM_SC"
FROM "SA"."CATALOGUE_LEVEL_2"
WHERE ( ( "SA"."CATALOGUE_LEVEL_2"."PLATFORM_SC" = :P4_PLATFORM_SC ) AND ( "SA"."CATALOGUE_LEVEL_2"."ID_LEVEL_1" = :P4_STR_SERVICE_SC ) )
union
select 'пустое'
from dual
)
where ROWNUM=1;

if ret= 'пустое' then
return 'На этом уровне уже есть такое значение';
else
return null;
end if;
END;


Потом доваляю значения через процесс PL/SQL.

Проблема в том что этот запрос (выделенный жирным красным) работает с логической ошибкой и я не могу понять какой, может кто нибудь подскажет как его поправить или как сделать решение более простым и правильным?
заранее благодарен.
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36429042
non-apexoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VisMaster, ваш запрос всегда возвращает как минимум одну строку, причём: когда данных не находится, возвращается 'пустое', в противном случае все зависит, скорее всего, от сортировки.

Одно из решений для validation:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare someval sometype;
begin
  select ... into someval from ... where ... and rownum <  2 ; /* union не нужно */
  return 'Данные дублируются';
exception when no_data_found then
  return null;
end;

...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36429175
VisMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подробный и быстрый ответ, очень помогло
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36432012
VisMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему не работает такой вариант того же запроса:
Declare
ret varchar2(4000);
BEGIN
if (:P5_VERSION is NULL) then
SELECT .. into ret
FROM ...
WHERE (...mytable.myversion is NULL and and rownum < 2);
return 'Такое требование или различие уже есть на данном уровне';
else
SELECT ... into ret
FROM ...
WHERE (...mytable.myversion=:P5_VERSION AND rownum < 2);
return 'Такое требование или различие уже есть на данном уровне';
end if;
exception when no_data_found then
return null;
END;

Ошибок не выдает но на exception не вылетает
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36432271
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VisMasterА почему не работает такой вариант того же запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE
  ret VARCHAR2( 4000 );
BEGIN
  IF (:P5_VERSION IS NULL) THEN
     SELECT .. INTO ret FROM ... WHERE (...mytable.myversion IS NULL AND AND rownum <  2 );
    RETURN 'Такое требование или различие уже есть на данном уровне';
  ELSE
     SELECT ... INTO ret FROM ... WHERE (...mytable.myversion = :P5_VERSION AND rownum <  2 );
    RETURN 'Такое требование или различие уже есть на данном уровне';
  END IF;
EXCEPTION
WHEN no_data_found THEN
  RETURN NULL;
END;

Ошибок не выдает но на exception не вылетает

Вы уверены, что "ошибок не выдаёт"?
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36432789
VisMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ошибок не выдает точно.
Второй "AND" появился когда я писал сообщение
Реальный запрос выглядит так:
Declare
ret varchar2(4000);
BEGIN
if (:P5_VERSION is NULL) then
SELECT "SA"."CATALOGUE_LEVEL_3_HW"."REQUIREMENT_CHARACTER" into ret
FROM "SA"."CATALOGUE_LEVEL_3_HW"
WHERE ("SA"."CATALOGUE_LEVEL_3_HW"."ID_LEVEL_2" = :P5_PLATFORM
AND "SA"."CATALOGUE_LEVEL_3_HW"."ID_LEVEL_2_VERSION" IS NULL
AND "SA"."CATALOGUE_LEVEL_3_HW"."ID_REQUIREMENT" = :P5_REQ_OR_DIFF and rownum < 2);
return 'Такое требование или различие уже есть на данном уровне';
else
SELECT "SA"."CATALOGUE_LEVEL_3_HW"."REQUIREMENT_CHARACTER" into ret
FROM "SA"."CATALOGUE_LEVEL_3_HW"
WHERE ("SA"."CATALOGUE_LEVEL_3_HW"."ID_LEVEL_2" = :P5_PLATFORM
AND "SA"."CATALOGUE_LEVEL_3_HW"."ID_LEVEL_2_VERSION" = :P5_VERSION
AND "SA"."CATALOGUE_LEVEL_3_HW"."ID_REQUIREMENT" = :P5_REQ_OR_DIFF and rownum < 2);
return 'Такое требование или различие уже есть на данном уровне';
end if;
exception when no_data_found then
return null;
END;


Но он не ищет дублирующиеся значения.
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36432819
non-apexoid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что возвращают ваши запросы, выполненные в SQL builder ?
...
Рейтинг: 0 / 0
дублирующие значения в БД
    #36433117
VisMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Была ошибка в логике построения запроса, он выполнялся но всегда возвращал data not found, поправил все заработало.
всем спасибо.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / дублирующие значения в БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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