游標的常用屬性
1、SQL%ROWCOUNT
受最近的SQL語句影響的行數——數值型
(1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者光標已關閉。
(2)、返回獲取的行數。
(3)、除非遍歷整個游標,否則ROWCOUNT屬性不會給出真正的行數。
換句話說,不應該依賴這個屬性來告訴游標在打開后有多少行。
2、SQL%FOUND
最近的SQL語句是否影響了一行以上的數據——布爾型
(1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者游標已關閉。
(2)、如果游標處於打開狀態,則返回NULL,但未執行提取。
(3)、如果執行成功,則返回TRUE。如果沒有行被返回,則返回FALSE。
3、SQL%NOTFOUND
最近的SQL語句是否未影響任何數據——布爾型
(1)、如果聲明了游標,但不打開,則返回INVALID_CURSOR,或者游標已關閉。
(2)、如果游標處於打開狀態,則返回NULL,但未執行提取。
(3)、如果執行了成功的提取,則返回FALSE。 如果沒有行被返回,則返回TRUE。
4、SQL%ISOPEN
如果光標處於打開狀態,則返回TRUE;如果光標處於關閉狀態,則返回FALSE。
對於隱式游標而言永遠為FALSE——布爾型
例、當一條DML語句被執行后,DML的結果會保存在四個游標屬性中。隱式游標的SQL%ISOPEN的值永遠為FALSE。
1、當SELECT INTO,INSERT,UPDATE或DELETE成功時,
SQL%FOUND為True,
SQL%NOTFOUND為False,
SQL%ROWCOUNT等於影響的行數(SELECT INTO的ROWCOUNT一定為1;INSERT...VALUES...的ROW_COUNT一定為1)。
2、當SELECT INTO或INSERT不成功時,拋出異常;
當UPDATE或DELETE不成功時,
SQL%FOUND為False,
SQL%NOTFOUND為True,
SQL%ROWCOUNT等於0。
5、SELECT測試
-- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 SELECT 的測試
DECLARE
v_temp employees%ROWTYPE;
BEGIN
SELECT *
INTO v_temp
FROM employees e
WHERE employee_id = 10;
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('SQL%FOUND');
END IF;
-- 這里取不到的,因為有INTO的賦值
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.put_line('SQL%NOTFOUND');
END IF;
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.put_line('Exception: no_data_found');
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
END;
/*
測試結果:如果查到結果,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT = 1;
如果沒有查到結果,SQL%ROWCOUNT = 0,拋出異常
*/
6、INSERT測試
-- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 INSERT 的測試
-- 插入n條
BEGIN
INSERT INTO departments(department_id, department_name)
VALUES(270, 'Tang');
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('SQL%FOUND');
END IF;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.put_line('SQL%NOTFOUND');
END IF;
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Something Error!');
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
END;
/*
測試結果:如果發生了插入,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為插入的行數,通常為1;
如果插入不成功,SQL%ROWCOUNT = 0,拋出異常
*/
7、UPDATE測試
-- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 UPDATE 的測試
BEGIN
UPDATE employees e
SET salary = 10000
-- WHERE employee_id < 103;
WHERE employee_id < 10;
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('SQL%FOUND');
END IF;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.put_line('SQL%NOTFOUND');
END IF;
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
END;
/*
測試結果:如果發生了更改,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為對應修改的行數;
如果沒有發生過更改,SQL%FOUND = False,SQL%NOTFOUND = True,SQL%ROWCOUNT = 0
*/
8、DELETE測試
-- SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT 對 DELETE 的測試
BEGIN
DELETE FROM departments
WHERE department_id IN (250, 260);
IF SQL%FOUND THEN
DBMS_OUTPUT.put_line('SQL%FOUND');
END IF;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.put_line('SQL%NOTFOUND');
END IF;
DBMS_OUTPUT.put_line('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
END;
/*
測試結果:如果成功刪除,SQL%FOUND = True,SQL%NOTFOUND = False,SQL%ROWCOUNT為插入的行數,通常為1;
如果刪除不成功,SQL%FOUND = False,SQL%NOTFOUND = True,SQL%ROWCOUNT = 0
*/