oracle 游标

/**********************************************
	游标
	
	1、什么是游标
	游标是一种PL/SQL控制结构:可以对SQL语句的处理进行显示控制,
	便于对表的数据逐条进行处理。
	
	2、游标分类
	显式
	隐式
	
	3、游标的属性
	%FOUND
	%ISOPEN
	%NOTFOUND
	%ROWCOUNT
	

**********************************************/

/******************************************************
	简单应用
******************************************************/
DECLARE
	CURSOR mycur IS
	
	SELECT * FROM books;
	my_record books%ROWTYPE;
	
	BEGIN
		OPEN mycur; --打开游标 
		FETCH mycur INTO my_record; --将游标的值放置到变量里面
		
		WHILE mycur%FOUND LOOP
			
			DBMS_OUTPUT.PUT_LINE(my_record.BOOKS_ID||', '||my_record.BOOKS_NAME);
			FETCH mycur INTO my_record;
		END LOOP;
		CLOSE mycur;
	END;
	/
	
/******************************************************
	带参数的游标
******************************************************/
DECLARE
	CURSOR cur_para(id varchar2) IS
	
	SELECT BOOKS_NAME FROM books WHERE books.BOOKS_ID=id;
	
	t_name books.BOOKS_NAME%TYPE;
	
	BEGIN
		OPEN cur_para('0001');
		
		LOOP
			FETCH cur_para INTO t_name;
			
			EXIT WHEN cur_para%NOTFOUND;
			
			DBMS_OUTPUT.PUT_LINE(t_name);
		END LOOP;
		
		CLOSE cur_para;
	END;
/

/******************************************************
	带参数的游标 2 不需要打开与关闭游标
******************************************************/
DECLARE
	CURSOR cur_para(id varchar2) IS
	SELECT books_name FROM books WHERE books_id=id;
	
	BEGIN
		DBMS_OUTPUT.PUT_LINE('******** 结果集为*********');
		
		FOR cur IN cur_para('0001') LOOP
			
			DBMS_OUTPUT.PUT_LINE(cur.books_name);
		END LOOP;
	END;
/


/******************************************************
	带参数的游标 3 使用 ISOPEN 打开游标
******************************************************/
DECLARE
	b_name books.books_name%TYPE;
	
	CURSOR cur(id varchar2) IS
	SELECT books_name FROM books WHERE books_id=id;
	
	BEGIN
		
		IF cur%ISOPEN THEN
			DBMS_OUTPUT.PUT_LINE('CURSOR IS OPEN!');
		ELSE
			OPEN cur('0003');
		END IF;
		
		FETCH cur INTO b_name;
		
		CLOSE cur;
		DBMS_OUTPUT.PUT_LINE(b_name);
		
	END;
/

/******************************************************
	带参数的游标 3 使用 ROWCOUNT 打开游标
******************************************************/
DECLARE
	b_name varchar2(10);
	
	CURSOR cur IS
	SELECT dname FROM dept;

	BEGIN
		OPEN cur;
		
		LOOP
			FETCH cur INTO b_name;
			EXIT WHEN cur%NOTFOUND OR cur%NOTFOUND IS NULL;--没有值了 或 没有fetch
			DBMS_OUTPUT.PUT_LINE('ROWCOUNT='||cur%ROWCOUNT);
		END LOOP;
		
		CLOSE cur;
		
	END;
/


/******************************************************
	带参数的游标 3 使用游标修改数据
******************************************************/
DECLARE
	CURSOR cur IS
	SELECT dname FROm dept FOR UPDATE;
	
	text varchar2(10);
		
	BEGIN
		OPEN cur;
		
		FETCH cur INTO text;
		
		WHILE cur%FOUND LOOP
			UPDATE dept SET dname=dname||'_t' WHERE CURRENT OF cur;
			
			FETCH cur INTO text;
		END LOOP;
		
		CLOSE cur;
	END;
/


/******************************************************
	带参数的游标 3 隐式游标 不需要 声明 open close
******************************************************/
BEGIN
	FOR cur IN(SELECT dname FROM dept) LOOP
		DBMS_OUTPUT.PUT_LINE(cur.dname);
	END LOOP;
END;
/



你可能感兴趣的:(oracle 游标)