sql >> データベース >  >> RDS >> Oracle

テーブルを更新するOracle関数。レコードがnullの場合はINSERT

    必要なのはマージだけです 声明。両方の要件を一度に実行できます。

    構文は-

    です。
    MERGE INTO table_a a
      USING table_b b
        ON (a.column= b.column)
      WHEN MATCHED THEN
        UPDATE SET a.column= b.column
      WHEN NOT MATCHED THEN
        INSERT (column1, column2)
        VALUES (b.val1, b.val2);
    

    更新 プロシージャパラメータのUSING句を示す例

    USING(
    SELECT
    p_HEAD_MARK hm, 
    p_PROJECT_NAME pn, 
    p_COLI_NUM cn, 
    p_ONSITE_UPD_QTY ouq
    FROM DUAL) s
    

    これらをs.hm, s.pn, s.cn, s.ouqとして使用します

    アップデート2 完全なテストケース

    テーブルemp1があるとしましょう 行なし。 enameを取るプロシージャを作成します INPUTとして、empに挿入するために使用します MERGEを使用したテーブル 。

    SQL> SELECT * FROM emp1;
    
    no rows selected
    
    SQL>
    SQL> CREATE OR REPLACE
      2  PROCEDURE p(
      3      p_ename IN VARCHAR2)
      4  AS
      5  BEGIN
      6    MERGE INTO emp1 e USING
      7    (SELECT p_ename AS ename FROM dual
      8    ) s ON(e.ename = s.ename)
      9  WHEN MATCHED THEN
     10    UPDATE SET e.empno = 100 WHEN NOT MATCHED THEN
     11    INSERT
     12      (ename
     13      ) VALUES
     14      (s.ename
     15      );
     16  END;
     17  /
    
    Procedure created.
    
    SQL>
    SQL> sho err
    No errors.
    SQL>
    SQL> BEGIN
      2    p('SCOTT');
      3  END;
      4  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    値が挿入されたかどうかを見てみましょう。

    SQL> SELECT ename FROM emp1;
    
    ENAME
    ----------
    SCOTT
    
    SQL>
    



    1. Sugarcrm、レコードを保存しながらカスタムコードを書く

    2. 事前定義された値を持つ複数選択のRails4フィールドタイプ

    3. Mysqlが起動しません-ibdata1が破損していますか? -オペレーティングシステムのエラー番号13-権限の問題

    4. ストアドプロシージャを使用してMySQLのテーブルをシャッフルします