Oracle_集合
游标遍历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_集合的更多相关文章
- oracle_集合函数
查询10和20号部门的员工 SQL> 1. select * from emp where deptno in (10,20); SQL> 2. select * from emp whe ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Java基础Collection集合
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
随机推荐
- Java连接Oracle10g
1.导入驱动包: a.找到oracle安装目录下的jdbc/lib中的文件classes12.jar: b.右击你创建的JAVA工程,找到Build path,选择Add External Archi ...
- javascript 继承、命名空间实现分享
命名空间是用来组织和重用代码的编译单元,在大型项目开发中javascript使用的越来越多时,我们就应该将项目里的js类库管理起来,如何将自己进行归类管理,防止命名冲突,但是Javascript默认不 ...
- ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM,KEL"
在启动ASM的时候报错,报错如下: SQL> startup ASM instance started Total System Global Area 130023424 bytes Fixe ...
- 多校7 HDU5816 Hearthstone 状压DP+全排列
多校7 HDU5816 Hearthstone 状压DP+全排列 题意:boss的PH为p,n张A牌,m张B牌.抽取一张牌,能胜利的概率是多少? 如果抽到的是A牌,当剩余牌的数目不少于2张,再从剩余牌 ...
- BootStrap入门教程 (三) :可重用组件(按钮,导航,标签,徽章,排版,缩略图,提醒,进度条,杂项)
上讲回顾:Bootstrap的基础CSS(Base CSS)提供了优雅,一致的多种基础Html页面要素,包括排版,表格,表单,按钮等,能够满足前端工程师的基本要素需求. Bootstrap作为完整的前 ...
- Java每日一则-001
Java中类名与文件名的关系 1.Java保存的文件名必须与类名一致: 2.如果文件中只有一个类,文件名必须与类名一致: 3.一个Java文件中只能有一个public类: 4.如果文件中不止一个类,文 ...
- JavaEE5 Tutorial_JavaBean,JSTL
<jsp:useBean id="beanName" class="fully_qualified_classname" scope="scop ...
- 获取week of year的小程序
#coding=utf8 import urllib, BeautifulSoup web=urllib.urlopen("http://whatweekisit.com/") s ...
- 关于C++ vector的拷贝
定义了vector变量,在使用时直接用了等号赋值,后来发现有问题,就查了一下vector怎么赋值? 说明:vector是一个构造对象,不能直接使用=符号进行复制,必须迭代每个元素来复制.或者重载=操作 ...
- vector 的resize与reserve
最近遇到一个坑,简单说来是resize与reserve的功能混淆了. 如下: 如果调用resize的化,编译会出错,如果给Text提供默认构造函数,则可以编译通过,最终输出的结果为10. 如果调用re ...