




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一ORACLE基础知识复习一.Oracle数据库中常用的数据类型 varchar2(长度)可变长字符串 char(长度) 定长 number()表示整数或者浮点数number(8) number(8,2) clog 字符的大对象 blog 二进制的大对象 DATE 日期二.数据库查询 1)SELECT语句 从表中提取查询数据.语法为SELECT DISTINCT column1,column2, FROM tablename WHERE conditions GROUP BY conditions ORDER BY expressions ASC/DESC; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。 2)WHERE子句。 WHERE子句用来选择符合条件的的记录. like . 通配查询 _,% between . and . ,表示结果在这之间,between and是一个闭区间。 !=,=,这三个都可以表示不等于。 in (va1,val2,.) 判断结果是否在这个集合中存在 。 like . 字符串通配查询,%表示0或多个字符,_表示一个字符。 . and . 表示只有两个条件同时满足 . or . 表示条件只要满足其中之一就可以 all . 是要求都满足条件。 not .,则是可以与以上的条件产生反效果。 . is null 使用来判断值是不是空。 3) ORDER BY子句 ORDER BY 子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。 ASC(默认,升序) DESC(降序) order by 目标列名(别名) 排序顺序(不写排序顺序,会默认为升序排序) 例:select first_name from s_emp order by first_name; select first_name from s_emp order by first_name desc; 三.SQL常用的命令分类及例子 数据定义语言:create(创建)、alter(更改)和drop(删除)命令。 数据操纵语言:insert(插入)、select(选择)、delete(删除)和update(更新)命令。 事务控制语言:commit(提交)、savepoint(保存点)和rollback(回滚)命令。 数据控制语言:grant(授予)和revoke(回收)。 1.数据定义语言举例: SQL create table myTab(no number(4),name varchar2(20);创建一个名为myTab的表,包含两列no和name; SQL alter table myTab modify (name varchar2(25);修改myTab中的name列,使此列能容纳25个字符; SQL alter table myTab add (tel_no varchar2(20);给表myTab增加一列tel_no; SQL alter table myTab drop column tel_no;删除表myTab的tel_no列; SQL drop table myTab;删除表myTab; SQL truncate table myTab;删除表myTab中的所有行(截断表),注意:不可以回滚。 2.数据操纵语言举例: SQL insert into myTab values(001,John); 向表myTab中插入一行数据; SQL select distinct salary “薪水” from s_emp where salary1500 order by sal desc; 选择表中salary大于1500的数据,以别名“薪水”显示并按照salary的降序进行排列输出; SQL create table empa as select empno,ename,job,sal from emp; 从emp表中选择“empno,ename,job,sal”四列的数据建立新表empa; SQL create table empa as select * from emp where 1=2; 使用一个假条件根据现有表emp创建一个只包含结构的空表empa; SQL delete from empa where sal update empa set sal=1500 where sal commit;用于提交并结束事务处理; SQL savepoint mark1;保存点类似于标记,用来标记事务中可以应用回滚的点; SQL rollback to savepoint mark1;回滚到保存点mark1。 四.Oracle数据库函数 注意:dual表(虚表)是专门用于函数测试和运算的. 1.字符函数 字符是大小写敏感的 转小写 lower(字段名) 转大写 upper(字段名) 首字母大写 initcap(字段名) 字符串拼接 concat(字段1, 字段2) 截取子串 substr(字段名, 起始位置,取字符个数) 例: select first_name,substr(first_name,2,2) sub from s_emp;(从名字的第二个字符开始取两个字符) select first_name,substr(first_name,-2,2) sub from s_emp;(从名字的倒数第二个字符开始取两个字符) 2.数值函数 四舍五入函数 round(数据,保留到小数点后几位) 1表示保留到小数点后一位,-1表示保留到小数点前一位。 例:select round(15.36,1) from dual; 截取数值函数 trunc (数据,保留到小数点后几位) 例:select trunc(123.456,1) from dual; 截取到小数点后一位,注意:与round函数不同,不会四舍五入。 3.日期函数 缺省日期格式,日-月-年 dd-mon-rr 修改当前会话的日期格式,会按照指定的格式输出日期 alter session set nls_date_format=yyyy mm dd hh24:mi:ss; 返回当前日期 sysdate 例:select sysdate from dual; 4.不同数据类型间转换函数 将日期转成字符 to_char(date,日期格式) 日期格式要用有效格式,格式大小写敏感 yyyy mm dd hh24:mi:ss(标准日期格式),year(年的全拼),month(月的全拼),day(星期的全拼),ddspth (日期的全拼) 例:select to_char(sysdate,yyyy mm dd hh24:mi:ss)from dual; select to_char(sysdate,year month day ddspth)from dual; 将字符串转成日期 to_date(.,日期格式) 例:select to_char(to_date(2006 11 03,yyyy mm dd),dd-month-yy) from dual; 五.表连接(关联查询) 等值连接 select table1.column1,table2.column2 from table1 t1,table2 t2 where t1.column3=t2.column4; 表连接时,当表与表之间有同名字段时,可以加上表名或表的别名,加以区分,使用时要用表名.字段名或表别名.字段名(列名)。当表的字段名是唯一时,可以不用加上表名或表的别名。 注意:当为表起了别名,就不能再使用表名.字段名了。 例如:select e.first_name | | e.last_name name, dept_name from s_emp e, s_dept d where e.dept_id=d.id; 非等值连接 select 表别名1.字段名1,表别名2.字段名2,. from 表1 表别名1 ,表2 表别名2 where 表别名1.字段名3 . 表别名2.字段名4 .可以使比较运算符,也可以使其他的除了=的运算符 例:select first_name, salary from s_emp where salary between 1000 and 2000; 自连接 把一个表的两个字段关系转换成两个表字段之间的关系. select 表别名1.字段名1,表别名2.字段名2,. from 表1 表别名1 ,表1 表别名2 where 表别名1.字段名3=表别名2.字段名4; 例:select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id; 外连接 使用一张表中的所有记录去和另一张表中的记录按条件匹配(空值也会匹配)这个表中的所有记录都会显示。 /想在哪边模拟记录就在哪边加上(+) SELECT e.last_name, e.dept_id, FROM s_emp e, s_dept d WHERE e.dept_id=d.id(+); 结果为:所有员工及对应部门的记录,包括没有对应部门编号dept_id的员工记录。 SELECT e.last_name, FROM s_emp e, s_dept d WHERE e.dept_id(+)=d.id; 结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。 六.组函数 group by把 select 的结果集分成几个小组,这个group by 子句可以跟在 select 语句后或是 having前面。group by子句也会触发排序操作,会按分组字段排序。 select 组函数或分组的字段名. from 表名 group by 字段名1,字段名2,.; 例:select avg(salary) from s_emp group by dept_id; 注意:组函数会忽略空值,但是count(*)除外,他会把空记录也记录在内。avg和sum这两个函数的参数只能是number型的。 以下所提到的函数可以使用任意类型做参数。 max(.),min(.)求最大值和最小值, count(*)统计表中记录数。 例:select max(),avg(a.salary), max() from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id; 注意:只要写了group by子句,select后就只能用group by之后的字段或者是组函数。having子句可以过滤组函数结果或是分组的信息,并且写在group by子句后。 七.子查询 可以嵌在sql语句中的select语句。 在select语句中嵌套子查询时,会先执行子查询。一般的会将子查询放在运算符的右边。 注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值),还是多行运算符(范围,多值)。配合使用子查询返回的结果必须符合运算符的用法。 例: select first_name| |last_name name from s_emp where title in (select title from s_emp where dept_id=42); 查询和42部门员工职位相同的所有员工的姓名 八.约束 针对表中的字段进行定义的。 primary key(主键约束 PK)保证实体的完整性,保证记录的唯一 主键约束,唯一且非空,并且每一个表中只能有一个主键,有两个字段联合作为主键时,将两个字段放在一起唯一标识记录,叫做联合主键。 主键约束的定义: 第一种定义形式: create table test(c number primary key ); 列级约束 第二种定义形式: create table test(c number , primary key(c) ) ; 表级约束 create table test(c1 number constraints pk_c1 primary key ); 此约束有名字: pk_c1 create tabletest(c number , c2 number , primary key (c ,c1) ) ; 用表级约束可以实现联合主键 foreign key(外键约束 FK)保证引用的完整性,外键约束,外键的取值是受另外一张表中的主键或唯一键的约束,不能够取其他值,只能够引用主键或唯一键的值,被引用的表,叫做 parent table(父表),引用方的表叫做child table(子表),要想创建子表,就要先创建父表,记录的插入也是如此,先父表后子表,删除记录,要先删除子表记录,后删除父表记录,要修改记录,如果要修改父表的记录要保证没有被子表引用。要删表时,要先删子表,后删除父表。(可以通过使用cascade constraints 选项来删除父表) carete table parent(c1 number primary key ); create table child (c number primary key , c2 number references parent(c1); 或表级约束定义: create table child( c number primary key , c2 number , foreign key(c2) references parent(c1); 非空约束(not null)这是一个列级约束,在建表时,在数据类型的后面加上 not null ,也就是在插入时不允许插入空值。 例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32); unique 唯一约束 唯一约束,允许为空,要求插入的记录中的值是唯一的。 例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address); check约束 检查约束,可以按照指定条件,检查记录的插入。check中不能使用伪列,不能使用函数,不能引用其他字段。 例:create table sal (a1 number , check(a11000); 九.数据字典 数据字典是由系统维护的,包含数据库的信息 数据字典示图 user_XXXXX 用户示图 all_XXXXX 所有示图 dba_XXXXX 数据库中所有示图 v$_XXXXX 动态性能示图 dict或 dictionary 表示数据字典的数据字典。 user_constraints 用户的表中约束的表 其中有constraints_name字段存放的是约束名,constraint_type字段存放的是约束的类型,r_constraints_name字段表示外键引用自何处. user_cons_column表,是用户的列级约束表,column_name字段存放的是约束字段的名字,position字段存放的是约束在联合键中的位置. 十.事务transaction 原子操作,也就是不可分割的操作,必须一起成功一起失败。 事务的结束动作就是commit,DDL,DCL语句执行会自动提交commit。 sqlplus正常退出是会做提交动作的commit;,当系统异常推出是,会执行回滚操作rollback;。 一个没有结束的事务,叫做活动的事务 (active transaction),活动的事务中修改的数据,只有本会话才能看见。 十一.Oracle中的伪列 伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是不能插入、更新或删除它们的值。常用的伪列:rowid和rownum。 rowid:数据库中的每一行都有一个行地址,rowid伪列返回该行地址。可以使用rowid值来定位表中的一行。通常情况下,rowid值可以唯一地标识数据库中的一行。 rowid伪列有以下重要用途: 1)能以最快的方式访问表中的一行; 2)能显示表的行是如何存储的。 3)可以作为表中行的唯一标识。 如:SQL select rowid,ename from emp; rownum:对于一个查询返回的每一行,rownum伪列返回一个数值代表的次序。 rownum伪列特点: 1) 有个特点要么等于1 要么小于某个值, 不能直接等于某个值, 不能大于某个值。 2)常用于分页显示。 返回的第一行的rownum值为1,第二行的rownum值为2,依此类推。通过使用rownum伪列,用户可以限制查询返回的行数。 如:SQLselect * from emp where rownum10 with check option; 十四.索引(index) 建立索引的目的就是为了加快查询速度,建立索引后会使DML操作效率慢,但是对用户查询会提高效率。删除一个表时,相对应的索引也会删除。另外,索引是会进行排序。 创建一个索引: create index 索引名 on 表名 (字段名); create index test_index on test(c1); 删除索引: drop index test_index; 注意:创建索引就是为了减少物理读,索引会减少扫描的时间。在经常要用到where的子句的字段,应该使用索引,另外还要看所查询的数据与全部数据的百分比,表越大,查询的记录越少,索引的效率就越高.二Oracle数据库游标使用大全 SQL是用于访问ORACLE数据库的语言,PL/SQL扩展和加强了SQL的功能,它同时引入了更强的程序逻辑。 PL/SQL支持DML命令和SQL的事务控制语句。DDL在PL/SQL中不被支持,这就意味作在PL/SQL程序块中不能创建表或其他任何对象。较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限。下面我们将讨论各种用于访问ORACLE数据库的DDL和TCL语句。查询SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中。SELECT INTO语法如下:SELECT DISTICT|ALL*|column,column,.INTO (variable,variable,. |record)FROM table|(sub-query)aliasWHERE.PL/SQL中SELECT语句只返回一行数据。如果超过一行数据,那么就要使用显式游标(对游标的讨论我们将在后面进行),INTO子句中要有与SELECT子句中相同列数量的变量。INTO子句中也可以是记录变量。%TYPE属性在PL/SQL中可以将变量和常量声明为内建或用户定义的数据类型,以引用一个列名,同时继承他的数据类型和大小。这种动态赋值方法是非常有用的,比如变量引用的列的数据类型和大小改变了,如果使用了%TYPE,那么用户就不必修改代码,否则就必须修改代码。例:v_empno SCOTT.EMP.EMPNO%TYPE;v_salary EMP.SALARY%TYPE; 不但列名可以使用%TYPE,而且变量、游标、记录,或声明的常量都可以使用%TYPE。这对于定义相同数据类型的变量非常有用。DELCAREV_A NUMBER(5):=10;V_B V_A%TYPE:=15;V_C V_A%TYPE;BEGINDBMS_OUTPUT.PUT_LINE(V_A=|V_A|V_B=|V_B|V_C=|V_C);ENDSQL/V_A=10 V_B=15 V_C=PL/SQL procedure successfully completed.SQL其他DML语句其它操作数据的DML语句是:INSERT、UPDATE、DELETE和LOCK TABLE,这些语句在PL/SQL中的语法与在SQL中的语法相同。我们在前面已经讨论过DML语句的使用这里就不再重复了。在DML语句中可以使用任何在DECLARE部分声明的变量,如果是嵌套块,那么要注意变量的作用范围。例:CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number)ASv_ename EMP.ENAME%TYPE;BEGINSELECT ename INTO v_enameFROM empWHERE empno=p_empno;INSERT INTO FORMER_EMP(EMPNO,ENAME)VALUES (p_empno,v_ename);DELETE FROM empWHERE empno=p_empno;UPDATE former_empSET date_deleted=SYSDATEWHERE empno=p_empno;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE(Employee Number Not Found!);ENDDML语句的结果当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。隐式游标只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性.SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。SQL%FOUND和SQL%NOTFOUND在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:. TRUE :INSERT. TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE. TRUE :SELECT INTO至少返回一行当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。SQL%ROWCOUNT 在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.SQL%ISOPENSQL%ISOPEN是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。事务控制语句事务是一个工作的逻辑单元可以包括一个或多个DML语句,事物控制帮助用户保证数据的一致性。如果事务控制逻辑单元中的任何一个DML语句失败,那么整个事务都将回滚,在PL/SQL中用户可以明确地使用COMMIT、ROLLBACK、SAVEPOINT以及SET TRANSACTION语句。COMMIT语句终止事务,永久保存数据库的变化,同时释放所有LOCK,ROLLBACK终止现行事务释放所有LOCK,但不保存数据库的任何变化,SAVEPOINT用于设置中间点,当事务调用过多的数据库操作时,中间点是非常有用的,SET TRANSACTION用于设置事务属性,比如read-write和隔离级等。显式游标当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取数据,关闭。下表显示了显式游标和隐式游标的差别:表1 隐式游标和显式游标隐式游标显式游标PL/SQL维护,当执行查询时自动打开和关闭 在程序中显式定义、打开、关闭,游标有一个名字。游标属性前缀是SQL 游标属性的前缀是游标名属性%ISOPEN总是为FALSE %ISOPEN根据游标的状态确定值SELECT语句带有INTO子串,只有一行数据被处理可以处理多行数据,在程序中设置循环,取出每一行数据。使用游标这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。声明游标语法:CURSOR cursor_name IS select_statement;在PL/SQL中游标名是一个未声明变量,不能给游标名赋值或用于表达式中。例:DELCARECURSOR C_EMP IS SELECT empno,ename,salaryFROM empWHERE salary2000ORDER BY ename;.BEGIN在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列 。打开游标使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:OPEN cursor_namecursor_name是在声明部分定义的游标名。例:OPEN C_EMP;关闭游标语法:CLOSE cursor_name例:CLOSE C_EMP;从游标提取数据从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下:FETCH cursor_name INTO variable,variable,.对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。例:SET SERVERIUTPUT ONDECLAREv_ename EMP.ENAME%TYPE;v_salary EMP.SALARY%TYPE;CURSOR c_emp IS SELECT ename,salary FROM emp;BEGINOPEN c_emp;FETCH c_emp INTO v_ename,v_salary;DBMS_OUTPUT.PUT_LINE(Salary of Employee| v_ename|is| v_salary);FETCH c_emp INTO v_ename,v_salary;DBMS_OUTPUT.PUT_LINE(Salary of Employee| v_ename|is| v_salary);FETCH c_emp INTO v_ename,v_salary;DBMS_OUTPUT.PUT_LINE(Salary of Employee| v_ename|is| v_salary);CLOSE c_emp;END这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面的程序:SET SERVERIUTPUT ONDECLAREv_ename EMP.ENAME%TYPE;v_salary EMP.SALARY%TYPE;CURSOR c_emp IS SELECT ename,salary FROM emp;BEGINOPEN c_emp;LOOPFETCH c_emp INTO v_ename,v_salary;EXIT WHEN c_emp%NOTFOUND;DBMS_OUTPUT.PUT_LINE(Salary of Employee| v_ename|is| v_salary);END 记录变量定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要安全得多。例:SET SERVERIUTPUT ONDECLARER_emp EMP%ROWTYPE;CURSOR c_emp IS SELECT * FROM emp;BEGINOPEN c_emp;LOOPFETCH c_emp INTO r_emp;EXIT WHEN c_emp%NOTFOUND;DBMS_OUT.PUT.PUT_LINE(Salary of Employee|r_emp.ename|is| r_emp.salary);END LOOP;CLOSE c_emp;END;%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:SET SERVERIUTPUT ONDECLARECURSOR c_emp IS SELECT ename,salary FROM emp;R_emp c_emp%ROWTYPE;BEGINOPEN c_emp;LOOPFETCH c_emp INTO r_emp;EXIT WHEN c_emp%NOTFOUND;DBMS_OUT.PUT.PUT_LINE(Salary of Employee|r_emp.ename|is| r_emp.salary);END LOOP;CLOSE c_emp;END; 带参数的游标与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:CURSOR cursor_name(parameter,parameter,.) IS select_statement;定义参数的语法如下:Parameter_name IN data_type:=|DEFAULT value与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。 另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。在打开游标时给参数赋值,语法如下:OPEN cursor_namevalue,value.;参数值可以是文字或变量。例:DECALRECURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;CURSOR c_emp (p_dept VARACHAR2) ISSELECT ename,salaryFROM empWHERE deptno=p_deptORDER BY enamer_dept DEPT%ROWTYPE;v_ename EMP.ENAME%TYPE;v_salary EMP.SALARY%TYPE;v_tot_salary EMP.SALARY%TYPE;BEGINOPEN c_dept;LOOPFETCH c_dept INTO r_dept;EXIT WHEN c_dept%NOTFOUND;DBMS_OUTPUT.PUT_LINE(Department:| r_dept.deptno|-|r_dept.dname);v_tot_salary:=0;OPEN c_emp(r_dept.deptno);LOOPFETCH c_emp INTO v_ename,v_salary;EXIT WHEN c_emp%NOTFOUND;DBMS_OUTPUT.PUT_LINE(Name:| v_ename| salary:|v_salary);v_tot_salary:=v_tot_salary+v_salary;END LOOP;CLOSE c_emp;DBMS_OUTPUT.PUT_LINE(Toltal Salary for dept:| v_tot_salary);END LOOP;CLOSE c_dept;END;游标FOR循环在大多数时候我们在设计程序的时候都遵循下面的步骤:1、打开游标2、开始循环3、从游标中取值4、检查那一行被返回5、处理6、关闭循环7、关闭游标可以简单的把这一类代码称为游标用于循环。但还有一种循环与这种类型不相同,这就是FOR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下:FOR record_name IN(corsor_name(parameter,parameter.)| (query_difinition)LOOPstatementsEND LOOP;下面我们用for循环重写上面的例子:DECALRECURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;CURSOR c_emp (p_dept VARACHAR2) ISSELECT ename,salary FROM emp WHERE deptno=p_dept ORDER BY enamev_tot_salary EMP.SALARY%TYPE;BEGINFOR r_dept IN c_dept LOOPDBMS_OUTPUT.PUT_LINE(Department:| r_dept.deptno|-|r_dept.dname);v_tot_salary:=0;FOR r_emp IN c_emp(r_dept.deptno) LOOPDBMS_OUTPUT.PUT_LINE(Name:| v_ename| salary:|v_salary);v_tot_salary:=v_tot_salary+v_salary;END LOOP;DBMS_OUTPUT.PUT_LINE(Toltal Salary for dept:| v_tot_salary);END LOOP;END; 在游标FOR循环中使用查询在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。DECALREv_tot_salary EMP.SALARY%TYPE;BEGINFOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOPDBMS_OUTPUT.PUT_LINE(Department:| r_dept.deptno|-|r_dept.dname);v_tot_salary:=0;FOR r_emp IN (SELECT ename,salary FROM emp WHERE deptno=p_deptORDER BY ename) LOOPDBMS_OUTPUT.PUT_LINE(Name:| v_ename| salary:|v_salary);v_tot_salary:=v_tot_salary+v_salary;END LOOP;DBMS_OUTPUT.PUT_LINE(Toltal Salary for dept:| v_tot_salary);END LOOP;END; 游标中的子查询语法如下:CURSOR C1 IS SELECT * FROM empWHERE deptno NOT IN (SELECT deptnoFRO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年高一上学期开学第一课生涯规划始业教育主题班会课件
- 铁路局员工管理办法
- 股骨颈骨折的治疗和护理
- 企业高管安全生产培训课件
- 税务风险管理办法试行
- 推动新质生产力加快发展的实践路径
- 畜牧兽医基础期末考试试题及答案
- 客服主管岗位招聘笔试题及解答(某大型集团公司)
- 党务岗位考试知识题库及答案
- 冲压生产线安全培训课件
- 塔吊出租安全协议书范本
- 2025年国家统一司法考试真题及答案
- 绿色矿山培训课件
- 2025四川宜宾五粮液集团旗下环球集团招聘75人笔试参考题库附答案解析
- 纪念抗美援朝队会课件
- 2025-2026学年人教版(2024)小学数学三年级上册(全册)教学设计(附目录P296)
- 2025广东茂名市信宜市供销合作联社招聘基层供销社负责人2人笔试模拟试题及答案解析
- 医院护理人文关怀实践规范专家共识
- 成人反流误吸高危人群全身麻醉管理专家共识(2025版)解读
- 初二体育课程教学计划及实施
- 2025年山东省临沂市、枣庄市、聊城市、菏泽市、济宁市中考语文试题解读
评论
0/150
提交评论