2017-04-13 8 views
0

これは動的選択クエリSPです。値がNULLでない場合は、where句には含まれていません。ストアドプロシージャの動的更新

create or replace PROCEDURE GET_STORE(
     _storeId IN NUMBER DEFAULT NULL, 
     _storename IN VARCHAR2 DEFAULT NULL, 
     _return_Result OUT SYS_REFCURSOR 
    )AS 
     BEGIN 
     OPEN _return_Result FOR 
     SELECT S.* FROM STORE S 
     WHERE (NVL(_storeId,0) =0 OR S.STOREID=_storeId) 
      AND (_storename IS NULL OR S.STORENAME=_storename); 
END RD_CITY; 

私たちが更新のために同じことをする方法は、nullでない列を更新することを意味します。

+0

この手順は非常に賢いですが、それは小さなdsadvantageを持っている - それは防ぐ任意のインデックスを使用してからオプテ​​ィマイザだ、といつもの更新ごとにフル・テーブル・スキャンを実行します。 – krokodilko

答えて

1

更新する行(キー)を実際に知りたい場合は、テーブル全体を更新します。したがって、各行に固有のプライマリキーがテーブルに必要です(storekeyという列を追加しました)。次に、あなたがnullではないだけ更新値にNVL関数を使用することができます。

create or replace PROCEDURE UPDATE_STORE(
     pstorekey IN NUMBER, 
     pstoreid IN VARCHAR2 DEFAULT NULL, 
     pstorename IN VARCHAR2 DEFAULT NULL 
    ) 
AS 
BEGIN 

    update store 
    set storeid = nvl(pstoreid,storeid), 
    storename = nvl(pstorename,storename) 
    where storekey = pstorekey; 

    commit; 

END update_store; 
0
CREATE OR REPLACE PROCEDURE GET_STORE(
    _storeId  IN STORE.STOREID%TYPE DEFAULT NULL, 
    _storename  IN STORE.STORENAME%TYPE DEFAULT NULL, 
    _return_Result OUT SYS_REFCURSOR 
) 
AS 
BEGIN 
    OPEN _return_Result FOR 
    SELECT * 
    FROM STORE 
    WHERE (_storeId IS NULL OR STOREID=_storeId) 
    AND (_storename IS NULL OR STORENAME=_storename); 
END GET_STORE; 
/

CREATE OR REPLACE PROCEDURE UPDATE_STORE(
    _storeId  IN STORE.STOREID%TYPE DEFAULT NULL, 
    _storename  IN STORE.STORENAME%TYPE DEFAULT NULL, 
    _othervalue IN STORE.OTHERVALUE%TYPE 
) 
AS 
BEGIN 
    UPDATE store 
    SET othervalue = _othervalue 
    WHERE (_storeId IS NULL OR STOREID=_storeId) 
    AND (_storename IS NULL OR STORENAME=_storename); 
END UPDATE_STORE; 
/
関連する問題