游标遍历select语句

set serveroutput on;

declare type sp_test1_cursor is ref cursor;
test1_cursor sp_test1_cursor;
v_name user_tables.TABLE_NAME%type;
v_count number;
strsql varchar2(100);
begin
open test1_cursor for select table_name from user_tables;
loop
fetch test1_cursor into v_name;
if v_name is not null then
strsql:='select count(*) from ' || v_name;
execute immediate strsql into v_count;
end if;
exit when test1_cursor%notfound;
dbms_output.put_line(v_name||' '||v_count);
end loop;
close test1_cursor;
end;

全信息

declare
cursor mysor is select * from emp;
begin
for i in mysor
loop
dbms_output.put_line(i.ename||e.deptno);
end loop;
end;
 create or replace procedure test_procedure_job

as
v1 varchar2(50);
v2 varchar2(50);
v3 varchar2(50);
begin
for v1 in
(select t.id
from test_table t)
loop
select t.username,t.password into v2,v3 from sshtest t where t.id = v1.id; dbms_output.put_line(v1.id || ',' || v2 || ',' || v3); end loop; end test_procedure_job;

一维数组

SET SERVEROUT ON SIZE 100000

DECLARE

  TYPE T_VARRAY IS VARRAY(3) OF VARCHAR2(20);

  V_VAR T_VARRAY := T_VARRAY('I', 'LOVE', 'STUDY');

BEGIN

  FOR I IN 1 .. V_VAR.COUNT LOOP

    DBMS_OUTPUT.PUT_LINE(V_VAR(I));

  END LOOP;

END;

For 循环

   PL/SQL中有两种类型的FOR循环:数字型FOR循环和游标型FOR循环。数值型FOR循环式传统的大家熟悉的“计数”循环,这种FOR循环的迭代次数在循环开始的时候就知道了。如果在FOR循环的范围处没有设置循环索引的递进方向从低到高或者从高到低(reverse将范围条件置反)。语法如下:

FOR loopIndex    IN [REVERSE] lowest_number..heighest_number 

LOOP

    . . . 可以执行的语句

END LOOP;

使用这种循环的原因:

    如果只想有限次的执行一段代码,又不想过早的结束循环,就可以使用数值型的FOR循环。

【如】输出从satrtIndex开始到endIndex的数字

PROCEDURE display_number(

    startIndex    IN    INTEGER,

    endIndex     IN    INTEGER

)AS

BEGIN

FOR currentIndex IN startIndex.. endIndex

    LOOP

        DBMS_OUTPUT.PUT_LINE(currentIndex );

END LOOP;

END;

FOR info IN (SELECT * FROM student)

LOOP

    . . . info.C_NAME

END LOOP;

使用数字型FOR循环的规则:

a、不要声明循环索引,PL/SQL会自动、隐式的用一个INTEGER类型的局部变量作为循环索引。作用范围就是该循环本省,不能在循环之外使用

b、在范围部分使用的表达式会在循环开始时被求值一次。范围部分不会随着循环的反复执行而被重复求值,如果在循环体内部改变范围表达式使用的变量,这种改变对范围边界没有任何作用

c、在循环体内部不要改变索引值或者范围边界值。

d、使用reverse关键字可以迫使循环从上边界到下边界递减进行,但是你必须保证上边界大于下边界

处理非平滑增长:

    PL/SQL并没有提供可以指定特殊的累进步幅得“进步”语法。在PL/SQL中数值型的FOR循环的各种变体中,递进步幅总是为1为单位进步。如果让循环只有当遇到1到100之间的偶数时才执行?你可以使用MOD函数。如:

FOR loop_index IN 1..100 LOOP

    IF MOD (loop_index, 2) = 0 THEN

       calc_values(loop_index);

    END IF;

END LOOP;

或者

FOR loop_index IN 1..50 LOOP

    calc_values(loop_index*2);

END LOOP;

游标型FOR循环:

    游标型FOR循环是和一个现实游标或者直接放在循环边界中的SELECT语句关联在一起的循环。如果你需要取出游标的每条记录依次处理,就可以使用游标FOR循环,而这种也是游标的主要用法。语法如下:

FOR record IN {cursor_name | select statement}

LOOP

    executable statements

END LOOP;

其中record是一个记录,这个记录是PL/SQL根据cursor_name这个游标%ROWTYPE属性隐式声明出来的。注意:不要现实的声明一个与循环索引(record)同名的记录,会导致逻辑错误。直接在循环中嵌套SELECT语句。

FOR student IN (SELECT * FROM students)

LOOP

    DBMS_OUTPUT.PUT_LINE( student.N_USERNAME );

END LOOP;

然而,应该避免使用这种方式,因为SELECT出现在了不该出现的地方,维护难以理解。

如:我们将更新所有员工的薪水。

方式一:

DECLARE

    CURSOR student_cursor IS

        SELECT id, name, salaray FROM employers;

    student    student_cursor%ROWTYPE;

BEGIN

    OPEN student_cursor;

    LOOP

        FETCH student_cursor INTO student;

        EXIT WHEN student_cursor%NOTFOUND;

        UPDATE students SET salary= student .salary*0.3 WHERE id=student.id;    

    END LOOP;

    CLOSE student_cursor;

END;

方式二:

DECLARE

    CURSOR student_cursor IS

        SELECT id, name, salaray FROM employers;

BEGIN

    LOOP student IN student_cursor 

        UPDATE students SET salary= student .salary*0.3 WHERE id=student.id;    

    END LOOP;

END;

游标

SET SERVEROUTPUT ON;

DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE; CURSOR emp_cursor IS
SELECT empno,ename from emp where empno<>1000; BEGIN LOOP IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF; FETCH emp_cursor INTO v_empno,v_ename;
EXIT WHEN emp_cursor%NOTFOUND; dbms_output.put_line('empno is:' || v_empno || ' emp name is:' || v_ename); END LOOP; END;
/

运行结果

anonymous block completed
empno is:7369 emp name is:SMITH
empno is:7499 emp name is:ALLEN
empno is:7521 emp name is:WARD
empno is:7566 emp name is:JONES
empno is:7654 emp name is:MARTIN
empno is:7698 emp name is:BLAKE
empno is:7782 emp name is:CLARK
empno is:7788 emp name is:SCOTT
empno is:7839 emp name is:KING
empno is:7844 emp name is:TURNER
empno is:7876 emp name is:ADAMS
empno is:7900 emp name is:JAMES
empno is:7902 emp name is:FORD
empno is:7934 emp name is:MILLER
要注意的一点:FETCH 后,马上进行EXIT 比较好。这是因为如果不是这样,在循环中还有来一次,此时可能有干了一些操作,这回导致出现问题。 还有一点,由于 第一次FETCH之前,%NOTFOUND 的值为空。 所以如果 FETCH 从来没有真的成功过,那么 EXIT WHEN emp_cusor%NOTFOUND 有可能一直为NULL,这样就一直在循环里无法退出。所以,更好的写法是: EXIT WHEN emp_cursor%NOTFOUND OR emp_cursor%NOTFOUND IS NULL 结束

Oracle_集合的更多相关文章

  1. oracle_集合函数

    查询10和20号部门的员工 SQL> 1. select * from emp where deptno in (10,20); SQL> 2. select * from emp whe ...

  2. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  3. .Net多线程编程—并发集合

    并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...

  4. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  5. 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)

    建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. Java基础Collection集合

    1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:

  8. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  9. Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...

随机推荐

  1. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (六) 自动化测试结构小节

    上一篇‘e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录 ...

  2. 关于LyX的一些小问题

    LyX转HTML(MS WORD)的脚本elyxer的更新: 首先从官网下载最新版的软件包.解压后,在命令行下python install.py执行安装(直接双击install.py应该也可以),py ...

  3. HDU 1536 sg-NIM博弈类

    题意:每次可以选择n种操作,玩m次,问谁必胜.c堆,每堆数量告诉. 题意:sg—NIM系列博弈模板题 把每堆看成一个点,求该点的sg值,异或每堆sg值. 将多维转化成一维,性质与原始NIM博弈一样. ...

  4. IO-同步,异步,阻塞,非阻塞,阅读摘要

    http://www.cnblogs.com/Fly-Wind/p/io.html http://blog.csdn.net/historyasamirror/article/details/5778 ...

  5. android sdk manager 闪退 打不开问题

    android sdk manager 闪退 打不开问题 环境 win8系统 如果访问不了  dl-ssl.google.com 网址,在C:\Windows\System32\Drivers\etc ...

  6. 【转】一步步教你读懂NET中IL(图文详解)

    本文章以一个实际的例子,让你了解堆叠式 VM 的运作原理,并对 .NET IL(Intermediate Language)有最基本的領略,需要的朋友可以参考下  .NET CLR 和 Java VM ...

  7. Base64编解码(C++版)

    #include <string> using namespace std; class ZBase64 { public:     /*编码     DataByte         [ ...

  8. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案

    首先,卸载相关的软件,然后删除所有和virtual studio相关的目录 然后如果还出现该问题,则: Mark一下,解决方法:将嵌入清单设置为"否" 发生场合:在用 C++写一个 ...

  9. Sql CLR

    using System;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsof ...

  10. Castle IOC容器实践之FactorySupport Facility

    PDF版本下载:http://file.ddvip.com/2008_10/1223538519_ddvip_4853.rar示例代码下载:http://file.ddvip.com/2008_10/ ...