Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 存储过程中的动态更新_Database_Oracle_Stored Procedures - Fatal编程技术网

Database 存储过程中的动态更新

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

这是动态选择查询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的列。

您确实想知道您正在更新键的行,否则您将更新整个表。因此,表上需要一个主键,该主键对于我添加了一个名为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;
/