2017-04-13 69 views
0

这是动态选择查询SP,如果该值不为空,它将包含在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; 

我们如何才能做到同样的事情更新,意味着更新那些非空的列。

+0

这个过程是非常聪明的,但它有一个微小的dsadvantage - 它阻止是使用任何指标的优化器,始终做一次全表扫描,每次更新。 – krokodilko

回答

1

你真的想知道你正在更新哪一行(键),否则你会更新整个表。所以你需要在表格上为每行唯一的一个主键(我添加了一个名为storekey的列)。然后你可以使用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; 
/