下面是我写的一个取得该用户的所有的表的数据记录数,是个存储过程,用到游标了,如下:
CREATE OR REPLACE PROCEDURE PRO_USER_TABLE_ROWS_COUNT IS
CURSOR MY_CUR IS --定义游标
SELECT * FROM USER_TABLES;
ROWS_COUNT NUMBER := 0;
BEGIN
DELETE FROM IFNEWG.TEMP_TABLE;
COMMIT;
FOR R IN MY_CUR LOOP --循环游标
EXECUTE IMMEDIATE ' SELECT COUNT(*) FROM ' || R.TABLE_NAME
INTO ROWS_COUNT; --依次取得每个表的记录数赋值给ROWS_COUNT
INSERT INTO IFNEWG.TEMP_TABLE VALUES (R.TABLE_NAME, ROWS_COUNT);
EXIT WHEN MY_CUR%NOTFOUND; --当游标找不到记录时退出循环
END LOOP;
COMMIT;
END PRO_USER_TABLE_ROWS_COUNT;
以上--部分是注释,上面的存储过程在PL/SQL中可以直接执行
-- 定义游标
declare
cursor aa is
select names,num from test;
begin
for bb in aa
loop
if bb.names = "ORACLE" then
end if
end loop;
end
论坛里的例子:
create or replace procedure test is
cursor v_cur_6(ids varchar2) is
select * from T where instr(','||ids||',',','||to_char(A)||',')=0;
v_cur_line_6 v_cur_6%ROWTYPE;
begin
open v_cur_6('1,2');
loop
fetch v_cur_6 into v_cur_line_6;
exit when v_cur_6%notfound;
dbms_output.put_line('---------');
end loop;
close v_cur_6;
end;
例:
CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number)
AS
v_ename EMP.ENAME%TYPE;
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=p_empno;
INSERT INTO FORMER_EMP(EMPNO,ENAME)
VALUES (p_empno,v_ename);
DELETE FROM emp
WHERE empno=p_empno;
UPDATE former_emp
SET date_deleted=SYSDATE
WHERE empno=p_empno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!');
END
例:
DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN
在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列 。
打开游标
使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:
OPEN cursor_name
cursor_name是在声明部分定义的游标名。