6 Stimmen

Oracle - Aktualisierung der einen oder anderen Spalte auf der Grundlage einer Bedingung

Ich möchte einen Datensatz in einer Tabelle aktualisieren, aber auf der Grundlage einer Bedingung werde ich entweder eine Spalte oder eine andere aktualisieren, aber ich möchte nicht 2 separate Anweisungen haben, weil die Anweisungen sehr lang und detailliert sind.

Hier ist der Grundgedanke mit einer starken Vereinfachung, um auf den Punkt zu kommen.

PROCEDURE Animal_something(p_updater VARCHAR2)

begin

  if p_updater = 'person' then   
    -- I want to update the modified_by  
  else   
    -- if p_updater = 'a process' I want to update modified_by_process

Update table_creatures
   set animal_type = 'Dog ,

**modified_by** = 'Bob'   
**or do this**  
**modified_by_process =** 'creature_package'

 where animal_legs = '4'

I nicht wollen :

if p_updater = 'person' then 
  Update table_creatures   
     set animal_type = 'Dog ,  
         modified_by = 'Bob'  
   where animal_legs = '4';  
else  

  Update table_creatures  
     set animal_type = 'Dog , 
         modified_by_process = 'creature_package'  
   where animal_legs = '4';

end;

8voto

Quassnoi Punkte 396418
UPDATE  table_creatures
SET     animal_type = 'Dog',
        modified_by = CASE p_updater WHEN 'person' THEN 'Bob' ELSE modified_by END,
        modified_by_process = CASE p_updater WHEN 'process' THEN 'creature_package' ELSE modified_by_process END
WHERE   animal_legs = 4

1voto

Dave Costa Punkte 45801

Sie könnten dynamisches SQL verwenden, z. B.:

PROCEDURE Animal_something(p_updater VARCHAR2)

  sql_string_pt1  VARCHAR2(2000) := 'UPDATE table_creatures SET animal_type = :1';
  sql_string_pt2  VARCHAR2(2000) := NULL;
  sql_string_pt3  VARCHAR2(2000) := ' WHERE animal_legs = :3';

begin

  if p_updater = 'person' then   
    sql_string_pt2 := ', modified_by = :2';
  else
    sql_string_pt2 := ', modified_by_process = :2';
  end if;

  EXECUTE IMMEDIATE sql_string_pt1 || sql_string_pt2 || sql_string_pt3
    USING 'Dog', 'Bob', '4';

end;

Dies hat zwei Vorteile gegenüber der Antwort von Quassnoi: die Verwendung von Bindungsvariablen und die Tatsache, dass nicht bei jeder Ausführung beide Spalten aktualisiert werden müssen, was zu einem Redo führen würde, auch wenn der tatsächliche Wert nicht geändert wird.

Nachteilig ist, dass die Anweisung zur Kompilierzeit überhaupt nicht validiert wird.

-1voto

Bharat Punkte 6758
UPDATE  table_creatures 
SET     animal_type = 'Dog', 
        modified_by = DECODE(p_updater , 'person' , 'BOB' , 
                                         'proces' , 'creature_package' ,
                                         'GIVE DEFAULT VALUE')          
WHERE   animal_legs = 4;

Sie können dies versuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X