2008-11-04 67 views
8

在oracle中,我想創建一個刪除sproc,它根據刪除的結果返回一個整數。oracle程序返回整數

這是我到目前爲止。

create or replace 
PROCEDURE Testing 
( 
iKey IN VARCHAR2 
) 
AS 

BEGIN 
    delete from MyTable WHERE 
    TheKey = iKey; 

END Testing; 

我試過把RETURNS INTEGER放進去,但是sproc不會編譯。

回答

2

使用函數和隱式SQL遊標來確定的行數刪除

create or replace 
FUNCTION Testing 
( 
iKey IN VARCHAR2 
) RETURN INTEGER 
AS 

BEGIN 
    delete from MyTable WHERE 
    TheKey = iKey; 

    RETURN SQL%ROWCOUNT; 

END Testing; 

這應該工作

16

過程不返回值。一個函數返回一個值,但是你不應該在一個函數中做DML(否則你不能像在SQL語句中引用函數那樣的事情,你會混淆權限授予,因爲通常DBA希望能夠授予只讀用戶訪問權限所有的功能,以便用戶一直在進行計算,等等)。

您可以向過程添加OUT參數以返回狀態。如果「成功」是指一個或多個行進行了更新,可以使用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參數似乎試圖返回狀態碼。如果發生錯誤,您通常可以通過假設成功並拋出異常來更好地服務。

0

您可能正在尋找一個函數。

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包中。

+0

2選擇加刪除?改爲使用stjohnrow建議的SQL%ROWCOUNT方法。 – 2008-11-04 18:08:18

+0

這很酷。不知道這一點。這顯然更好。 – 2008-11-04 18:12:14

5

您可以使用存儲過程返回結果。

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; 
0

SQL%ROWCOUNT只會立即返回值的DML其價值後,如果執行了另一條DML將重置。

爲了解決這個問題,因爲我是在一個循環中我的DML之後發出以下命令執行刪除操作:

row_count := row_count + SQL%ROWCOUNT; 

請確保您聲明並初始化row_count := 0;