2016-11-28 23 views
0

Iはオラクル - バルク複数行計算

以下の表名と同様の要件を有する: - 数

Salary_detail(少なくとも10,00,000レコードを有する)

給与

ハイキング - 番号

net_salary - > cal_netsal(給与、ハイキング)

(cal_netsalがnet_salを計算するための関数である)

TOTAL_SAL ---> TOTAL_SAL(給料、ハイキング)

TOTAL_SAL機能

previous_sal - で> previous_sal(給料、ハイキング)

previous_salは関数です。私はnet_salary、TOTAL_SALとprevious_sal列

1.Iを計算する必要が

バックそのテーブル内の対応する列への単一の行のすべての3つの列

2.insertを計算する必要があります。 これを達成する最も良い方法は何ですか?

親切にあなたは簡単にすでに作成機能を使用することで、既存の列を更新することができます

+0

私が理解していることは、給与とハイキングの列が既に表に移入されており、他の3列を更新する必要があるということですか? –

+0

はい!そのはすでに存在し、我々は残りの部分を移入する必要があり、 ところでその性能向上の一部:( –

+0

「UPDATEのsalary_details SET net_salary = cal_netsal(給与、ハイキング)、 TOTAL_SAL = TOTAL_SAL(給与、ハイキング)、 previous_sal = previous_sal (給与、ハイキング) WHERE 1 = 1 ' –

答えて

1

、以下の更新がテーブル内の既存のレコードの世話をします助けます。

UPDATE salary_details 
    SET net_salary = cal_netsal (salary, hike) 
    , total_sal = total_sal (salary, hike) 
    , previous_sal = previous_sal (salary, hike) WHERE 1 = 1 

新しいレコードがテーブルに挿入または更新された場合は、トリガがcreated.Trigger意志された後、後に既存の列と手動たびにそれを行うには必要はありませんを更新する前に、挿入トリガーを作成することができます

CREATE OR REPLACE TRIGGER sal_biu_trg 
       BEFORE INSERT OR UPDATE ON salary_details 
       FOR EACH ROW 
    BEGIN 
     IF INSERTING OR UPDATING THEN 
     :NEW.net_salary = cal_netsal (:NEW.salary,:NEW.hike); 
     :NEW.total_sal = total_sal (:NEW.salary,:NEW.hike); 
     :NEW.previous_sal = previous_sal (:NEW.salary,:NEW.hike); 
    END IF; 
    EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line(SQLERRM); 
    END; 
/
+0

以下の解決策を見つけてください。ただし、 'その他のときはdbms_output ...'は気になりません。しかし、問題は例外処理に関するものではありませんので、私はそれを乗り越えていきます。:) –

+0

@MatthewMcPeak:例外ハンドリングでdbms_outputも嫌いです。例外を処理する方法、ログを記録する方法、発生させる方法などによって異なります。 –

+0

ありがとうGaurav :) –

関連する問題