Avatar billede novacdk Nybegynder
27. maj 2012 - 14:30 Der er 2 kommentarer

Kopiere række med nyt id or returnere det i?

Jeg skal lave en kopi af en række, som skal oprettes med et nyt id, og det nye id skal returneres, så jeg kan hente de nye data fra mit program. Først gjorde jeg noget lignende det nedenstående:

INSERT INTO table (id, text)
SELECT seq.nextval, text
FROM table WHERE id = :id

Hvilket virker. Men når jeg prøver:

INSERT INTO table (id, text)
SELECT seq.nextval, text
FROM table WHERE id = :id
RETURNING id INTO :outValue

så får jeg fejlen: "ORA-00933: SQL-kommando er ikke korrekt afsluttet"

Er der nogen, der ved, hvad der er galt eller hvordan det eventuelt kan lade sige gøre, at kopiere en række, erstatte en eller flere værdier og returnere id'et?
Avatar billede pgroen Nybegynder
29. maj 2012 - 08:33 #1
Umiddelbart forstår jeg ikke hvorfor du ikke benytter seq.currval, i stedet for din 'returning' konstruktion.

INSERT INTO table (id, text)
SELECT seq.nextval, text
FROM table WHERE id = :id;

SELECT seq.currval
  INTO :outValue
  FROM dual;

Eller også kunne man gøre det mere direkte:

SELECT seq.nextval
  INTO :outValue
  FROM dual;

INSERT INTO table (id, text)
SELECT :outValue, text
FROM table WHERE id = :id;

Men for eksemplets skyld kunne en løsning være noget i stil med:

DECLARE
  r test_table%ROWTYPE;
  outValue NUMBER;
BEGIN
  SELECT * INTO r
  FROM test_table
  WHERE id := :id;
 
  SELECT seq.nextval
  INTO r.id
  FROM dual;

  INSERT INTO test_table
  VALUES r
  RETURNING id INTO outValue;
END;
Avatar billede novacdk Nybegynder
29. maj 2012 - 09:49 #2
Mange tak for dit svar. Jeg endte med at opgive at bruge returning og i stedet for bare bruge :outValue som parameter, som du også foreslår. Svaret er godtaget.

Det er ved at være længe siden, jeg har brugt Eksperten, men da jeg ikke umiddelbart kan se en knap, hvor jeg kan acceptere dit svar, går jeg ud fra, at det er skrevet som en kommentar.
Smid et svar så får du dine point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester