2016-08-30 5 views
3

Ich habe eine Tabelle sagen EMPLOYER mit EMPLOYER_ID als Primärschlüssel. Ich schreibe das folgende Skript eine Zeile in der Tabelle zu aktualisieren:Aktualisieren einer Tabelle mit Datensatz-Objekt

declare 
    emp_row EMPLOYER%ROWTYPE; 
begin 
    select * into emp_row from EMPLOYER where rownum <= 1; 
    emp_row.NAME := 'ABC'; 
    emp_row.AGE := 99; 
    -- Can I write something like below? 
    update EMPLOYER set ??? = emp_row where EMPLOYER_ID = emp_row.EMPLOYER_ID; 
end; 

Kann ich in einer einzigen Anweisung eine Zeile mit einem Satztyp Objekt aktualisieren? So wie im obigen Beispiel gezeigt.

+0

Bitte vollständige Frage –

+0

Die Frage ist bereits aktualisiert. –

Antwort

1

Bitte versuchen Sie so etwas wie dieses

update EMPLOYER set ROW = emp_row where EMPLOYER_ID = emp_row.EMPLOYER_ID; 

Denken Sie daran: Dieses Update setzt den Wert jeder Spalte in der Tabelle, einschließlich der Primärschlüssel, so dass Sie die SET ROW Syntax mit großer Sorgfalt verwendet werden soll.

1

Ja, Sie können:

declare 
    emp_row EMPLOYER%ROWTYPE; 
begin 
    select * into emp_row from EMPLOYER where rownum <= 1; 
    emp_row.NAME := 'ABC'; 
    emp_row.AGE := 99; 
    update EMPLOYER e set row = emp_row 
    where e.EMPLOYER_ID = emp_row.EMPLOYER_ID; 
end; 

Beachten Sie jedoch, dass diese versuchen, jede Spalte in der Zeile zu aktualisieren, den Primärschlüssel enthält. Wenn Ihre Tabelle jemals eine virtuelle Spalte erhält, schlägt dies fehl.

0

Um Sie zu beantworten Frage:
Sie müssen jede Spalte mit zum Beispiel aktualisieren: ColumnA = recordName.ColumnA, Sie können nicht eine ganze Zeile auf einmal einfügen.

Ihnen einen Rat geben:
Die SELECT INTO ist irgendwie gefährlich Ich denke, becasue wenn Ihr Tisch wird versuchen, leer Sie einen NULL-Wert zu legen, was in dem folgenden Fehler führen: ORA-01403: no data found.
Dieser Fehler kann in größeren Projekten nur schwer gefunden werden.

Vielleicht gibt Ihnen dieses Beispiel eine Idee:
Hier verwende ich einen Cursor, um die Zeilen aus einer Tabelle zu holen.
Da ich nicht durch sie durchschlinge wird nur der erste gefundene Datensatz genommen und in rEmployer gespeichert.
So rEmpoyer enthält alle Daten aus der ersten Zeilennummer aus dieser Tabelle.

Ich benutze einen Boolean, um zu überprüfen, ob es Daten gibt, und wenn wir es getan haben, setzen wir es auf TRUE.
Danach aktualisieren wir die Tabelle.

DECLARE 
    CURSOR cEmployer IS 
     SELECT * 
     FROM Employer; 

    rEmployer cEmployer%ROWTYPE; 
    fFound  BOOLEAN := FALSE; 
BEGIN 
    -- By not using a loop, only the first record is taken. 
    OPEN cEmployer; 
    FETCH cEmployer INTO rEmployer; 
    IF cEmployer%FOUND THEN 
     -- There is a row in the table 'Employer'. 
     fFound := TRUE; 
    END IF; 
    CLOSE cTemp; 

    -- Modify some values and add update the row: 
    IF fFound THEN 
     -- MOdify some values. 
     rEmployer.Name := 'ABC'; 
     rEmployer.Age := '99'; 

     -- Update the table. 
     UPDATE Employer 
     SET  Name = rEmployer.Name, 
      Age = rEmployer.Age 
     WHERE EmployerId = rEmployer.EmployerId; 

     COMMIT; 
    END IF; 
END; 
/
Verwandte Themen