在oracle中,我想創建一個刪除sproc,它根據刪除的結果返回一個整數。oracle程序返回整數
這是我到目前爲止。
create or replace
PROCEDURE Testing
(
iKey IN VARCHAR2
)
AS
BEGIN
delete from MyTable WHERE
TheKey = iKey;
END Testing;
我試過把RETURNS INTEGER放進去,但是sproc不會編譯。
在oracle中,我想創建一個刪除sproc,它根據刪除的結果返回一個整數。oracle程序返回整數
這是我到目前爲止。
create or replace
PROCEDURE Testing
(
iKey IN VARCHAR2
)
AS
BEGIN
delete from MyTable WHERE
TheKey = iKey;
END Testing;
我試過把RETURNS INTEGER放進去,但是sproc不會編譯。
使用函數和隱式SQL遊標來確定的行數刪除
create or replace
FUNCTION Testing
(
iKey IN VARCHAR2
) RETURN INTEGER
AS
BEGIN
delete from MyTable WHERE
TheKey = iKey;
RETURN SQL%ROWCOUNT;
END Testing;
這應該工作
過程不返回值。一個函數返回一個值,但是你不應該在一個函數中做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參數似乎試圖返回狀態碼。如果發生錯誤,您通常可以通過假設成功並拋出異常來更好地服務。
您可能正在尋找一個函數。
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包中。
您可以使用存儲過程返回結果。
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;
的SQL%ROWCOUNT
只會立即返回值的DML其價值後,如果執行了另一條DML將重置。
爲了解決這個問題,因爲我是在一個循環中我的DML之後發出以下命令執行刪除操作:
row_count := row_count + SQL%ROWCOUNT;
請確保您聲明並初始化row_count := 0;
2選擇加刪除?改爲使用stjohnrow建議的SQL%ROWCOUNT方法。 – 2008-11-04 18:08:18
這很酷。不知道這一點。這顯然更好。 – 2008-11-04 18:12:14