Database 存储过程中的动态更新
这是动态选择查询SP,如果该值不为null,则它将包含在where子句中,否则不包含Database 存储过程中的动态更新,database,oracle,stored-procedures,Database,Oracle,Stored Procedures,这是动态选择查询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_Res
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的列。您确实想知道您正在更新键的行,否则您将更新整个表。因此,表上需要一个主键,该主键对于我添加了一个名为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;
这个过程非常聪明,但它有一个小小的优势——它防止了优化人员使用任何索引,并且每次更新都会进行完整的表扫描。
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;
/