代码之家  ›  专栏  ›  技术社区  ›  shaunf

Oracle过程返回整数

  •  8
  • shaunf  · 技术社区  · 16 年前

    在Oracle中,我希望创建一个基于删除结果返回整数的删除存储过程。

    这就是我目前为止所拥有的。

    create or replace
    PROCEDURE Testing
    ( 
    iKey IN VARCHAR2
    )
     AS 
    
    BEGIN
      delete from MyTable WHERE 
      TheKey = iKey;
    
    END Testing;
    

    我试过将返回整数放入,但存储过程无法编译。

    5 回复  |  直到 11 年前
        1
  •  2
  •   stjohnroe    16 年前

    使用函数和隐式SQL光标确定删除的行数

    create or replace
    FUNCTION Testing
    ( 
    iKey IN VARCHAR2
    ) RETURN INTEGER
     AS 
    
    BEGIN
      delete from MyTable WHERE 
      TheKey = iKey;
    
      RETURN SQL%ROWCOUNT;
    
    END Testing;
    

    那就行了

        2
  •  16
  •   Justin Cave    16 年前

    过程不返回值。函数返回一个值,但您不应该在函数中执行DML(否则,您不能执行诸如在SQL语句中引用函数之类的操作,您会混淆权限授予,因为通常DBA希望能够授予只读用户访问所有函数的权限,以便用户一致地执行计算等)。

    可以向过程中添加out参数以返回状态。如果“success”意味着更新了一行或多行,则可以使用sql%rowcount获取先前SQL语句修改的行数的计数,并使用该计数填充返回参数,即。

    CREATE OR REPLACE PROCEDURE test_proc (
      p_iKey    IN VARCHAR2,
      p_retVal OUT INTEGER
    )
    AS
    BEGIN
      DELETE FROM myTable
       WHERE theKey = p_iKey;
    
      IF( SQL%ROWCOUNT >= 1 )
      THEN
        p_retVal := 1;
      ELSE
        p_retVal := 0;
      END IF;
    END test_proc;
    

    当然,从一般的代码清晰性角度来看,我对似乎试图返回状态代码的out参数持怀疑态度。通常情况下,假设成功并在出现错误时抛出异常会更好地为您服务。

        3
  •  5
  •   user34850    16 年前

    可以使用存储过程返回结果。

    CREATE OR REPLACE PROCEDURE testing (iKey IN VARCHAR2, oRes OUT NUMBER)
    AS
    BEGIN
       DELETE FROM MyTable
             WHERE TheKey = iKey;
    
       oRes := SQL%ROWCOUNT;
    END;
    

    要调用该过程,请使用如下内容:

    DECLARE
       pRes   NUMBER;
    BEGIN
       testing ('myspecialkey', pRes);
       DBMS_OUTPUT.put_line (pRes);
    END;
    
        4
  •  0
  •   Jacob Schoen    16 年前

    您可能正在寻找一个函数。

    FUNCTION TESTING (iKEY IN VARCHAR2) RETURN NUMBER
    IS
      v_count NUMBER;
      yourNumber NUMBER;
    BEGIN
    
      SELECT COUNT(*) INTO v_count
      FROM MyTable
      WHERE TheKey = iKey;
    
      IF v_count > 0
        THEN
           DELETE FROM MyTable 
           WHERE TheKey = iKey;
    
           SELECT COUNT(*) INTO v_count
           FROM MyTable
           WHERE TheKey = iKey;
    
           IF (v_count = 0)
             THEN
               yourNumber :=  1; --means successful deletion
           END IF;
      ELSE
           yourNumber := 0; --means no items to delete
      END IF;
      return yourNumber;
    
      EXCEPTION
          WHEN OTHERS THEN
            RETURN -1; --means error was encountered
    END TESTING;
    

    注意:在我工作的地方,我们通常将函数放在SQL包中。

        5
  •  0
  •   Robert Mars_win    11 年前

    这个 SQL%ROWCOUNT 只会在DML之后立即返回一个值,如果执行另一个DML,它的值将重置。

    为了在循环中执行删除操作时解决问题,我在DML之后发出了以下命令:

    row_count := row_count + SQL%ROWCOUNT;
    

    请确保您声明并初始化 row_count := 0;