Скопируйте и измените запись Oracle, используя% ROWTYPE - PullRequest
3 голосов
/ 08 марта 2012

У меня нет доступа, чтобы проверить это сейчас, но есть следующее - или что-то в этом роде, так как мой код «вне головы» может быть не идеальным!- возможно в Oracle:

declare
  myRecord myTable%ROWTYPE;
begin
  select * into myRecord from myTable where key = 123;
  myRecord.key   := 456;
  myRecord.value := myRecord.value + 50;
  insert into myTable select * from table(myRecord);
end;

т.е. мы копируем запись из myTable - которая может иметь, скажем, 100 полей - с ключом 123 в переменную с той же схемой, затем обновляем несколькополей скопированной записи (например, здесь, новый ключ и обновленный value) перед вставкой его обратно в исходную таблицу: фактически, дублирование исходной записи с некоторыми изменениями, где это необходимо?

Я знаюЕсть и другие способы сделать это, но это выглядит довольно аккуратно, по сравнению с тем, что я видел ... если бы это работало, конечно!

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

На самом деле это даже проще, чем предложенный вами синтаксис

Настройка таблицы и данных

CREATE TABLE foo( 
  col1 NUMBER,
  col2 VARCHAR2(100)
);

INSERT INTO foo( col1, col2 )
  VALUES( 1, 'Justin' );

Блок PL / SQL для выбора, изменения и повторной вставки записи

declare
  l_foo_rec foo%rowtype;
begin
  select *
    into l_foo_rec
    from foo
   where col1 = 1;
  l_foo_rec.col2 := 'Michael';
  l_foo_rec.col1 := l_foo_rec.col1 + 1;
  insert into foo
    values l_foo_rec;
end;

Который при запуске выдает эти данные в FOO

  1* select * from foo
SQL> /

      COL1 COL2
---------- --------------------
         1 Justin
         2 Michael

Конечно, как указывает Гленн, как правило, будет более эффективно написать SQL-оператор, который вставляет новую строку, выбирая данные из существующей строки без необходимости вообще использовать PL / SQL. Однако, в зависимости от сложности вашей логики, подход PL / SQL может быть легче отладить и поддерживать.

3 голосов
/ 08 марта 2012
INSERT INTO myTable VALUES myRecord;

Несколько хороших примеров на этом сайте: http://psoug.org/reference/insert.html Полагаю, вы не хотите делать что-то подобное, потому что у вас много столбцов?

INSERT INTO myTable
  SELECT 456, value+50, colx, coly
     FROM myTable
     WHERE key = 123;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...