2016-12-22 7 views
1

条件が存在する場合はレコードを更新したい場合は挿入するか挿入します。私は、削除と挿入を使用して質問を書いています。私は難しさに直面して、更新と挿入に変換しています。Oracleの代わりに(更新&挿入)の手順を(削除&挿入)する方法

PS:私はSQL%ROWCOUNTを使ってみましたが、どこかの構文が間違っていると思います。 ご協力いただければ幸いです。以下は

私はあなたが手順を必要としない

Create Or Replace Procedure sal_proc(Empid Varchar2,Fmdt Date,bp Number) 
As 
Begin 
--delete 
delete from Emp_Sal 
Where Empid = Empid 
And Fmdt = Fmdt; 
--insert 
Insert Into Emp_Sal(empid,fmdt,Basicpay) Values (empid,fmdt,Bp); 
End; 

答えて

3

を使用していますPROCです。あなたは、同時に行を更新または挿入するためにMERGEを使用することができます。

merge into Emp_Sal e 
using ( 
     /* your values to insert/update */ 
     select 2 as Empid, 'c' as Fmdt, 100 as Bp from dual 
    ) x 
on (e.Empid = x.Empid And e.Fmdt = x.Fmdt) 
when matched 
    then /* if a record exists, update */ 
     update set Basicpay = Bp 
when not matched 
    then /* it the record does not exist, insert */ 
    insert values (x.empid, x.fmdt, x.Bp) 

もちろん、あなたの入力パラメータを処理したり、あなたの手順で実行する必要があり何でもするプロシージャの内部にこれを使用することができます。

Create Or Replace Procedure sal_proc(Empid Varchar2,Fmdt Date,bp Number) 
As 
Begin 
    merge into Emp_Sal e 
    using ( 
      /* your values to insert/update */ 
      select Empid as Empid, Fmdt as Fmdt, bp as Bp from dual 
     ) x 
    on (e.Empid = x.Empid And e.Fmdt = x.Fmdt) 
    when matched 
     then /* if a record exists, update */ 
      update set Basicpay = Bp 
    when not matched 
     then /* it the record does not exist, insert */ 
     insert (empid,fmdt,Basicpay) values (x.empid, x.fmdt, x.Bp); 
End; 

ヒント:使用パラメータに混乱を避けるために異なるフロンカラム名を付けます。良い例としては、p_XXXのようなパラメータ名を使うことができます。これがいかに危険なのほんの一例:

SQL> create or replace procedure checkPar(n in number) is 
    2  c number; 
    3 begin 
    4  select count(1) 
    5  into c 
    6  from checkTab 
    7  where n = n; 
    8  -- 
    9  dbms_output.put_line(c); 
10 end; 
11/

Procedure created. 

SQL> select * from checkTab; 

     N 
---------- 
     1 
     2 
     3 

SQL> exec checkPar(1); 
3 

PL/SQL procedure successfully completed. 

SQL> exec checkPar(999); 
3 

PL/SQL procedure successfully completed. 
+0

に存在しない場合は動作するはずです – Abhishek

+1

表示されているように、これをこの手順で簡単に使用できます。 – Aleksej

+0

私は実行しようとしています。私は返信して戻ってきます。助けてくれてありがとうございます – Abhishek

0

ない非常に効率的な方法が、膨大なデータを私はPHPからこのプロシージャをコールしていますので、私は手順を必要なテーブル

CREATE OR REPLACE PROCEDURE sal_proc (E_Empid VARCHAR2, F_Fmdt DATE, b_bp NUMBER) 
    AS 
    var number; 
    BEGIN 

     Begin 
     --Checking if record exists 
     select 1 
     into var 
     from Emp_Sal 
     Where Empid = E_Empid 
     And Fmdt = F_Fmdt; 

     exception 
     when no_data_found then 
      var:= 0; 
     End; 

     if var <> 1 then 
     --insert 
     INSERT INTO Emp_Sal (empid, fmdt, Basicpay)  
      VALUES (e_empid, f_fmdt, b_Bp); 
     else 

     update Emp_Sal 
     set col ....<>; 

     end if; 

    END; 
+0

これはうまくいかないと私は思っています。SELECTクエリは、カラムではなくパラメータと一致します。 – Aleksej

+0

私はあなたが私のロジックを理解していないと思います。テーブルがレコードを持っている場合、SELECTは1を返します。その場合、私の 'IF ELSE'ブロックが動作します。あなたが「マージ」のように言ったのと同じです。私はあなたが何かがうまく動作しないと信じるなら、あなたはダウンボートしてはならないと思う: – XING

+1

私の質問の例を見てください。あなたの選択は、テーブルに多くのレコードがある場合はtoo_many_rowsを、レコードがない場合はno_data_foundを返します。 – Aleksej

関連する問題