隐式游标常用属性之 SQL%FOUND,SQL%NOTFOUND 和 SQL%ROWCOUNT
隐式游标的几个常用属性如下:
SQL%ROWCOUNT 受最近的SQL语句影响的行数——数值型
SQL%FOUND 最近的SQL语句是否影响了一行以上的数据——布尔型
SQL%NOTFOUND 最近的SQL语句是否未影响任何数据——布尔型
SQL%ISOPEN 对于隐式游标而言永远为FALSE——布尔型
当一条DML语句被执行后,DML的结果会保存在四个游标属性中。隐式游标的SQL%ISOPEN的值永远为FALSE。
当SELECT INTO,INSERT,UPDATE或DELETE成功时,
SQL%FOUND为True,
SQL%NOTFOUND为False,
SQL%ROWCOUNT等于影响的行数(SELECT INTO的ROWCOUNT一定为1;INSERT...VALUES...的ROW_COUNT一定为1)。
当SELECT INTO或INSERT不成功时,抛出异常;
当UPDATE或DELETE不成功时,
SQL%FOUND为False,
SQL%NOTFOUND为True,
SQL%ROWCOUNT等于0。
附上测试代码,SELECT比另外三个多了Exception:
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,抛出异常 */
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,抛出异常 */
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 */
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 */
完毕。下一篇写NO_DATA_FOUND和SQL%NOT_FOUND的对比。