Вставьте проблему, пытаясь с оператором несуществующего в оракуле - PullRequest
0 голосов
/ 14 июня 2019

Попытка вставить значения, если конкретное значение столбца не существует в таблице

Я пытался с подзапросом, где заявление

INSERT
INTO ANIMALDATA VALUES
 ( 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
 )
where not exists 
(select NAMES from ANIMALDATA where NAMES='Lion');

Если лев не существует, оператор вставки должен выполнить

Дайте мне представление о том, чего мне не хватает, поскольку я новичок в вопросах оракула. помогите мне продолжить. заранее спасибо

Ответы [ 3 ]

0 голосов
/ 14 июня 2019

Поскольку у вас есть условие, я думаю, вам нужно сделать INSERT INTO ... SELECT:

(ОБНОВЛЕНИЕ: оператор CREATE TABLE предназначен для предоставления простых тестовых данных. Он не является частью решения).

создать таблицу animaldata (first, kingdom, names, num, nl, dte, s) как

выберите 1, 'Животные', 'Тигр', 11, 'a', '13 -06-2019 ',' STOP 'из двойного;

INSERT 
INTO ANIMALDATA select 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
from dual
where not exists 
(select NAMES from ANIMALDATA where NAMES='Lion');

С наилучшими пожеланиями, Рагу Эштон

0 голосов
/ 14 июня 2019

Во-первых, не используйте max(<value>) + 1 для поиска новых значений для столбца - это не очень хорошо для одновременных сеансов.

Вместо этого вы должны создать последовательность и использовать ее в своих вставках.

Далее, если вы пытаетесь выполнить upsert (обновить строку, если она существует, или вставить, если она не существует), вы можете использовать инструкцию MERGE. В этом случае вы пытаетесь вставить строку, если она еще не существует, поэтому вам не нужна часть обновления.

Поэтому вы должны делать что-то вроде:

CREATE SEQUENCE animaldata_seq
 START WITH     <find MAX VALUE OF animaldata.first>
 INCREMENT BY   1
 MAXVALUE 9999999999999999
 CACHE 20
 NOCYCLE;

MERGE INTO animaldata tgt
  USING (SELECT 'Animals' category,
                'Lion' animal,
                10 num_animals,
                NULL unknown_col,
                TRUNC(SYSDATE) date_added,
                'STOP' action
         FROM   dual) src
  ON (tgt.animal = src.animal)
WHEN NOT MATCHED THEN
  INSERT (<list of animaldata columns>)
  VALUES (animaldata_seq.nextval,
          src.animal,
          src.unknown_col,
          src.date_added,
          src.action);

Обратите внимание, что я попытался указать столбцы, которые нужно вставить, - это хорошая практика! Код, в котором есть операторы вставки, в которых нет списка вставляемых столбцов, подвержен ошибкам, если кто-то добавит столбец в таблицу.

Я также предположил, что столбец, в который вы добавляете дату, имеет тип данных DATE; Я использовал sysdate (усеченное для удаления части времени) в качестве значения для вставки, но вы можете указать, какую дату использовать, и в этом случае вы должны использовать to_date(<string date>, '<string date format')

0 голосов
/ 14 июня 2019

пожалуйста, попробуйте ниже.Спасибо,

INSERT
INTO ANIMALDATA a
select 
   ( SELECT MAX(first)+1 FROM ANIMALDATA
   )
   ,
   'Animals',
   'Lion',
   10,
   '',
   '13-06-2019',
   'STOP'
from dual
where not exists 
(select 1 from ANIMALDATA b where b.NAMES='Lion' and a.NAMES = b.NAMES );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...