tanrong 2019-12-17
游标的常用属性
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
*/