• 1. PL/SQL从入门到精通 第二讲:PL/SQL基础主讲人:Wonder华章培训网、[www.hztraining.com]华章培训网版权所有
  • 2. 上节回顾Oracle数据库的发展历史 PL/SQL的优势 PL/SQL的架构 准备学习环境
  • 3. 学习PL/SQL的基础知识 学会如何使用PL/SQL Developer工具 学会如何调试PL/SQL 程序 介绍PL/SQL的内存表本节内容第3页
  • 4. PL/SQL块的结构 声明 代码执行 异常处理 PL/SQL块的类型 匿名块:执行一次 子程序:命名的PL/SQL块 每行语句以“;”结尾 没有代码块语句无法编译,可以使用null替代基础知识—PL/SQL块第4页declare -- 在此声明PL/SQL用到的变量、类型及游标 i integer; begin -- PL/SQL代码 null; exception -- 异常处理 end;
  • 5. 基础知识—PL/SQL块结构和组成元素(1)第5页PL/SQL块的结构如下: DECLARE /* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */ BEGIN /* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */ EXCEPTION /* 执行异常部分: 错误处理 */ END; 其中 执行部分是必须的。
  • 6. 基础知识—PL/SQL块结构和组成元素(2)第6页PL/SQL块可以分成三类: 匿名块:动态构造,只能执行一次 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序
  • 7. 声明变量基础知识—PL/SQL中的变量和常量(1)第7页在语句块的声明部分对变量声明,声明一个变量的语法是: variable_name [ constant ] type [ not null ] [:=value] 其中: variable_name 为变量名 type 为类型 value 为变量的初值 注意:如果变量在声明时使用了NOT NULL选项则必须为变量指定初值。 如果变量在声明时使用了CONSTANT选项则必须为变量指定初值,并且该初值不能被改变。
  • 8. 变量赋值 赋值操作符 := DECLARE bonus number(8,2); BEGIN bonus := 10; Select into 进行变量赋值 DECLARE bonus NUMBER(8,2); emp_id NUMBER(6) := 100; BEGIN SELECT salary * 0.10 INTO bonus FROM employees WHERE employee_id = emp_id; END; 基础知识—PL/SQL中的变量和常量(2)第8页
  • 9. 基础知识—PL/SQL中的变量赋值第9页在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下: variable := expression ; variable 是一个PL/SQL变量, expression 是一个PL/SQL 表达式. BOOLEAN 型变量赋值: 布尔值只有TRUE, FALSE及 NULL 三个值。 空值加数字仍是空值:NULL + < 数字> = NULL 。 空值加(连接)字符,结果为字符:NULL || <字符串> = < 字符串>
  • 10. 绑定变量 PL/SQL中直接嵌入SELECT/UPDATE/INSERT/DELETE语句时,PL/SQL将在WHERE和VALUES语句中的变量自动转换绑定变量 'DELETE FROM employees WHERE employee_id = :id' USING emp_id; 声明常量 N_limit CONSTANT NUMBER := 500.00;基础知识—PL/SQL中的变量和常量(3)第10页
  • 11. 基础知识—变量作用范围和可见性(1)第11页PL/SQL的变量作用范围特点是: 变量的作用范围是在所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束 一个变量(标识)只能在所引用的块内是可见的 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了) 在子块中重新定义该变量后,它的作用仅在该块内
  • 12. 基础知识—变量作用范围和可见性(2)第12页例: DECLARE v_Number NUMBER(3 , 2); BEGIN DECLARE v_Character VARCHAR2(10); BEGIN …… …… END; END;v_Number的作用域v_Character的作用域
  • 13. 基础知识—注释第13页在PL/SQL里,可以使用两种符号来写注释: PL/SQL允许用双–来写注释,它的作用范围是只能在一行有效。 例: V_Sal NUMBER(12,2); -- 工资变量 使用 /* */ 来加一行或多行注释。 例: /***********************************************/ /* 文件名: department_salary.sql */ /***********************************************/
  • 14. 关系运算符基础知识—PL/SQL的运算符和表达式(1)第14页运算符 意义 = 等于 <> , != , ~= , ^= 不等于 < 小于>大于<=小于等于>=大于等于
  • 15. 一般运算符基础知识—PL/SQL的运算符和表达式(2)第15页运算符 意义 +加号-减号*乘号/除号:=赋值号|| 连接符..范围运算符
  • 16. 逻辑运算符基础知识—PL/SQL的运算符和表达式(3)第16页运算符 意义 IS NULL 空值BETWEEN AND介于两者之间IN 在一个值列表之中AND逻辑与 OR逻辑或 NOT取返,如 IS NOT NULL, NOT IN
  • 17. 基础知识—标识符限制第17页PL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同 标识符名不能超过30字符 第一个字符必须为字母 不能用’-‘(减号) 不分大小写 不能是SQL保留字 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果
  • 18. 基础知识—常用变量类型第18页类型 说明CHAR(n)定长字符串,长度可选,缺省1。最大可达2000字节VARCHAR2(n) 可变字符串,长度不能缺省,最大可达4000字节,如果作为变量,最大可以保存32KBINARY_INTEGER 带符号整数,为整数计算优化性能,Oracle9.2之前广泛使用PLS_INTEGER带符号整数,比BINARY_INTEGER提供更好的性能。[-2147483648..+2147483647]SIMPLE_INTEGER带符号整数,[-2147483648..+2147483647]比PLS_INTEGER提供了更好的性能,不能包含null,不提供overflow,Oracle11g开始提供。NUMBER(p,s) 数值,p代表刻度,s代表精度。1 <= p <=38, -84 <= s <= 127,有效位,从左边第一个不为0的数开始的位数(负号、小数点不算位数)。
  • 19. 基础知识—常用变量类型(续)第19页类型 说明LONG 变长字符串,最大可到2G。Oracle建议使用CLOB或BLOB来替换LONG或LONG RAW类型DATE 日期BOOLEAN 布尔ROWID 存放数据库行号
  • 20. 我们创建一个HelloWorld的PL/SQL程序,输出Hello World! 使用的包,DBMS_OUTPUT.PUT_LINE从HelloWorld开始第20页
  • 21. SQL Developer SQLPLUS PL/SQL Developer Toad … …工欲善其事,必先利其器—工具介绍第21页
  • 22. 执行SQL语句,替代SQLPlusPL/SQL Developer—命令窗口第22页
  • 23. 非常方便的SQL窗口,支持数据修改和导入导出,查询排序PL/SQL Developer—SQL窗口第23页
  • 24. 提供了匿名PL/SQL块的模板,可以查看变量和输入输出值PL/SQL Developer—Test窗口第24页
  • 25. 创建一个Test Window 编写代码 -- Created on 2010-9-25 by USER declare -- Local variables here v_name varchar2(10); begin -- Test statements here v_name:='张三'; dbms_output.put_line('Hello World'||v_name); end; 运行代码,在DBMS_OUTPUT页面查看输出结果完成HelloWorld程序第25页
  • 26. 基础知识—PL/SQL流程控制第26页条件语句: IF 语句 循环语句: LOOP语句, EXIT语句 顺序语句: GOTO语句, NULL语句
  • 27. IF语句 IF <布尔表达式> THEN PL/SQL 和 SQL语句 END IF; 或 IF <布尔表达式> THEN PL/SQL 和 SQL语句 ELSE 其它语句 END IF; 基础知识—PL/SQL流程控制(1)第27页IF <布尔表达式> THEN PL/SQL 和 SQL语句 ELSIF < 其它布尔表达式> THEN 其它语句 ELSIF < 其它布尔表达式> THEN 其它语句 …… …… ELSE 其它语句 END IF;示例:DECLARE v_empno emp.empno%TYPE :=&empno; V_salary emp.sal%TYPE; V_comment VARCHAR2(35); BEGIN SELECT sal INTO v_salary FROM emp WHERE empno=v_empno; IF v_salary<1500 THEN V_comment:= ‘A’; ELSIF v_salary <3000 THEN V_comment:= ‘B’; ELSE V_comment:= ‘C’; END IF; DBMS_OUTPUT.PUT_LINE(V_comment); END;
  • 28. CASE语句 CASE selector WHEN expression1 THEN result1 WHEN expression2 THEN result2 WHEN expressionN THEN resultN [ ELSE resultN+1] END; 其中:ELSE子句是可选的,但是当检测表达式与任何一个检测值都不匹配时,PL/SQL会产生预定义错误CASE_NOT_FOUND,其错误号是ORA-6592 基础知识—PL/SQL流程控制(2)第28页例 :DECLARE V_grade char(1) := UPPER(‘&p_grade’); V_appraisal VARCHAR2(20); BEGIN V_appraisal := CASE v_grade WHEN ‘A’ THEN ‘Excellent’ WHEN ‘B’ THEN ‘Very Good’ WHEN ‘C’ THEN ‘Good’ ELSE ‘No such grade’ END; DBMS_OUTPUT.PUT_LINE(‘Grade:‘||v_grade||’ Appraisal: ‘|| v_appraisal); END;
  • 29. 循环语句 LOOP 要执行的语句; EXIT WHEN <条件语句> /*条件满足,退出循环语句*/ END LOOP; 其中:EXIT WHEN 子句是必须的,否则循环将无法停止。 例: DECLARE int NUMBER(2) :=0; BEGIN LOOP int := int + 1; DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||int); EXIT WHEN int =10; END LOOP; END; 基础知识—PL/SQL流程控制(3)第29页
  • 30. 循环语句 WHILE <布尔表达式> LOOP 要执行的语句; END LOOP; 其中:循环语句执行的顺序是先判断<布尔表达式>的真假,如果为真则循环执行,否则退出循环。在WHILE循环语句中仍然可以使用EXIT或EXIT WHEN子句 例:DECLARE x NUMBER :=1; BEGIN WHILE x<=10 LOOP DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x); x:= x+1; END LOOP; END; 基础知识—PL/SQL流程控制(3)第30页
  • 31. 循环语句 FOR 循环计数器 IN [ REVERSE ] 下限 .. 上限 LOOP 要执行的语句; END LOOP; 其中: 每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1 跟在IN REVERSE 后面的数字必须是从小到大的顺序,但不一定是整数,可以是能够转换成整数的变量或表达式 可以使用EXIT或者EXIT WHEN子句退出循环 FOR v_counter IN 20 .. 25 LOOP INSERT INTO temp_table (num_col ) VALUES ( v_counter ); END LOOP; 基础知识—PL/SQL流程控制(3)第31页
  • 32. Goto语句 GOTO label; . . . . . . <
  • 33. NULL语 在PL/SQL 程序中,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符,可以使某些语句变得有意义,提高程序的可读性句 例:DECLARE . . . BEGIN … IF v_num IS NULL THEN GOTO print1; END IF; … <> NULL; -- 不需要处理任何数据。 END; 基础知识—PL/SQL流程控制(5)第33页
  • 34. Continue语句,自Oracle11g引入基础知识—PL/SQL流程控制(6)第34页
  • 35. 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现。 为了处理 SQL 语句,ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处理的行的数目,一个指向语句被分析以后的表示形式的指针以及查询的活动集(active set)。 游标是一个指向上下文的句柄( handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。 基础知识—游标第35页
  • 36. 游标的使用情况基础知识—游标(续)第36页SQL语句游标非查询语句 隐式的 结果是单行的查询语句 隐式的或显示的 结果是多行的查询语句 显示的
  • 37. 处理显式游标需要四个 PL/SQL步骤: 定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句 ,其一般形式为: CURSOR cursor_name IS select_statement; 其中: 游标声明部分是唯一可以出现在模块声明部分的步骤,其他三个步骤都在执行或异常处理部分中 游标名是标识符,所以也有作用域,并且必须在使用前进行说明 任何SELECT语句都是合法的,但是SELECT …INTO语句是非法的 在声明部分的末尾声明游标 基础知识—显式游标(1)第37页
  • 38. 2.打开游标:就是执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。 OPEN cursor_name PL/SQL 程序不能用OPEN 语句重复打开同一个游标 3.读取游标:就是检索结果集合中的数据行,放入指定的输出变量中。 FETCH cursor_name INTO {variable_list | record_variable }; 基础知识—显式游标(2)第38页
  • 39. 4.关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN语句重新打开。 CLOSE cursor_name; 基础知识—显式游标(3)第39页例:查询10名员工的信息。 DECLARE v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11; BEGIN OPEN c_cursor; FETCH c_cursor INTO v_ename, v_sal; WHILE c_cursor %FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) ); FETCH c_cursor INTO v_ename, v_sal; END LOOP; CLOSE c_cursor; END;
  • 40. 游标传递参数基础知识—显式游标(4)第40页例:DECLARE v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; CURSOR c_cursor(P_sal emp.sal%type) IS SELECT ename, sal FROM emp WHERE sal >= P_sal; BEGIN OPEN c_cursor(1000); FETCH c_cursor INTO v_ename, v_sal; WHILE c_cursor %FOUND LOOP …… FETCH c_cursor INTO v_ename, v_sal; END LOOP; CLOSE c_cursor; END;
  • 41. 基础知识—游标的属性第41页属性描述%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE; %NOTFOUND 布尔型属性,与%FOUND相反 %ISOPEN 布尔型属性,当游标已打开时返回 TRUE;游标要确认关闭,应在出现异常时检查游标是否仍然打开。 %ROWCOUNT 数字型属性,返回已从游标中读取的记录数。
  • 42. 基础知识—游标各阶段%FOUND的属性第42页DECLATE CURSOR C_cursor is …… BEGIN OPEN C_cursor FETCH C_cursor INTO …… FETCH C_cursor INTO …… FETCH C_cursor INTO …… CLOSE C_cursor END;%FOUND返回错误%FOUND为NULL%FOUND为TRUE%FOUND为TRUE%FOUND返回错误%FOUND为FALSE
  • 43. 基础知识—游标各阶段%NOTFOUND的属性第43页DECLATE CURSOR C_cursor is …… BEGIN OPEN C_cursor FETCH C_cursor INTO …… FETCH C_cursor INTO …… FETCH C_cursor INTO …… CLOSE C_cursor END;%NOTFOUND返回错误%NOTFOUND为NULL%NOTFOUND为FALSE%NOTFOUND为FALSE%NOTFOUND返回错误%NOTFOUND为TRUE
  • 44. 基础知识—游标各阶段%ISOPEN的属性第44页DECLATE CURSOR C_cursor is …… BEGIN OPEN C_cursor FETCH C_cursor INTO …… FETCH C_cursor INTO …… FETCH C_cursor INTO …… CLOSE C_cursor END;%ISOPEN为FALSE%ISOPEN为TRUE%ISOPEN为TRUE%ISOPEN为TRUE%ISOPEN为FALSE%ISOPEN为TRUE
  • 45. 基础知识—游标各阶段%ROWCOUNT的属性第45页DECLATE CURSOR C_cursor is …… BEGIN OPEN C_cursor FETCH C_cursor INTO …… FETCH C_cursor INTO …… FETCH C_cursor INTO …… CLOSE C_cursor END;%ROWCOUNT返回错误%ROWCOUNT为0%ROWCOUNT为1%ROWCOUNT为2%ROWCOUNT返回错误%ROWCOUNT为2
  • 46. 显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的 对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。INSERT, UPDATE, DELETE, SELECT INTO语句中不必明确定义游标 基础知识—隐式游标第46页
  • 47. 基础知识—隐式游标属性第47页属性描述%FOUND 布尔型属性,至少有一行被INSERT,DELETE或UPDATE时返回TRUE。%NOTFOUND 布尔型属性,与%FOUND相反; %ISOPEN 布尔型属性, 取值总是FALSE。SQL命令执行完毕立即关闭隐式游标。 %ROWCOUNT 数字型属性, 返回已从游标中读取得记录数;
  • 48. 例:删除EMP 表中20号部门的所有员工,如果该部门中已没有员工可删除,则在DEPT 表中删除该部门 DECLARE V_deptno emp.deptno%TYPE :=20; BEGIN DELETE FROM emp WHERE deptno=v_deptno; IF SQL%NOTFOUND THEN DELETE FROM dept WHERE deptno= 20; END IF; END; 基础知识—处理隐式游标第48页
  • 49. 例:DECLARE v_empno emp.empno%TYPE; v_sal emp.sal%TYPE; CURSOR c_cursor IS SELECT empno, sal FROM emp; BEGIN OPEN c_cursor; LOOP FETCH c_cursor INTO v_empno, v_sal; EXIT WHEN c_cursor %NOTFOUND; IF v_sal<=1200 THEN UPDATE emp SET sal=sal+50 WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'工资已更新!'); END IF; DBMS_OUTPUT.PUT_LINE('记录数:'|| c_cursor %ROWCOUNT); END LOOP; CLOSE c_cursor; END; 基础知识—游标的例子第49页
  • 50. PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能; 当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标基础知识—游标For循环第50页
  • 51. 例:DECLARE CURSOR c_cursor(dept_no NUMBER DEFAULT 10) IS SELECT dname, loc FROM dept WHERE deptno <= dept_no; BEGIN DBMS_OUTPUT.PUT_LINE(‘dept_no参数值为30:’); FOR c1_rec IN c_cursor (30) LOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname||’---‘||c1_rec.loc); END LOOP; DBMS_OUTPUT.PUT_LINE(CHR(10)||’使用默认的dept_no参数值10:’); FOR c1_rec IN c_cursor LOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname||’---‘||c1_rec.loc); END LOOP; END; 第51页
  • 52. SELECT … INTO 语句触发 NO_DATA_FOUND;(必须用Exception捕捉) 当一个显式游标的WHERE子句未找到时触发%NOTFOUND; 当UPDATE或DELETE 语句的WHERE子句未找到时触发 SQL%NOTFOUND; 在提取循环中要用 %NOTFOUND 或%FOUND 来确定循环的退出条件,不要用 NO_DATA_FOUND. 基础知识—NO_DATA_FOUND和%NOTFOUND第52页
  • 53. 游标修改和删除操作是指在游标定位下,修改或删除表中指定的数据行。这时,要求游标查询语句中必须使用FOR UPDATE选项,以便在打开游标时锁定游标结果集合在表中对应数据行的所有列和部分列。 为了对正在处理(查询)的行不被另外的用户改动,ORACLE 提供一个 FOR UPDATE 子句来对所选择的行进行锁住。该需求迫使ORACLE锁定游标结果集合的行,可以防止其他事务处理更新或删除相同的行,直到您的事务处理提交或回滚为止。基础知识—SELECT FOR UPDATE(1)第53页
  • 54. SELECT . . . FROM … FOR UPDATE [OF column[, column]…] [NOWAIT] 注意: 如果另一个会话已对活动集中的行加了锁,那么SELECT FOR UPDATE操作一直等待到其它的会话释放这些锁后才继续自己的操作,对于这种情况,当加上NOWAIT子句时,如果这些行真的被另一个会话锁定,则OPEN立即返回并给出: ORA-0054 :resource busy and acquire with nowait specified. 如果使用 FOR UPDATE 声明游标,则可在DELETE和UPDATE 语句中使用WHERE CURRENT OF cursor_name子句,修改或删除游标结果集合当前行对应的数据库表中的数据行。 基础知识—SELECT FOR UPDATE(2)第54页
  • 55. 例:从EMP表中查询10号部门的员工情况,将其工资最低定为 1500; DECLARE V_deptno emp.deptno%TYPE :=10; CURSOR emp_cursor IS SELECT empno, sal FROM emp WHERE deptno=v_deptno FOR UPDATE NOWAIT; BEGIN FOR emp_record IN emp_cursor LOOP IF emp_record.sal < 1500 THEN UPDATE emp SET sal=1500 WHERE CURRENT OF emp_cursor; END IF; END LOOP; -- COMMIT; END; 第55页
  • 56. 记录类型 :记录类型是把逻辑相关的数据作为一个单元存储起来 定义记录类型语法如下: TYPE record_type IS RECORD( Field1 type1 [NOT NULL] [:= exp1 ], Field2 type2 [NOT NULL] [:= exp2 ], . . . . . . Fieldn typen [NOT NULL] [:= expn ] ) ; PL/SQL的记录类型(1)第56页
  • 57. %TYPE:定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE 例:DECLARE -- 用 %TYPE 类型定义与表相配的字段 TYPE t_Record IS RECORD( T_no emp.empno%TYPE, T_name emp.ename%TYPE, T_sal emp.sal%TYPE ); -- 声明接收数据的变量 v_emp t_Record; PL/SQL的记录类型(2)第57页
  • 58. %ROWTYPE:返回一个记录类型, 其数据类型和数据库表的数据结构相一致。 例:DECLARE v_empno emp.empno%TYPE :=&no; rec emp%ROWTYPE; BEGIN SELECT * INTO rec FROM emp WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE('姓名:'||rec.ename||'工资:'||rec.sal||'工作时间:'||rec.hiredate); END; PL/SQL的记录类型(3)第58页
  • 59. PL/SQL内存表或者称为索引表(index-table),是可以在PL/SQL 程序中引用、能够模仿数组的非永久表。用户可以定义一个表类型,然后声明这种类型的变量。接下来,用户就可以将记录添加到用户的PL/SQL 表中,并且采用与引用数组元素大体相同的方法引用他们。 内存表包括两个基本成分: 数据处理类型为BINARY_INTEGER主键 标量或记录数据类型的列 PL/SQL内存表(1)第59页
  • 60. 定义一个表: TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE } [NOT NULL] | table%ROWTYPE INDEX BY BINARY_INTEGER; 例: DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; my_dname_table dept_table_type; PL/SQL内存表(2)第60页
  • 61. 表元素的引用PL/SQL内存表(3)第61页例: DECLARE type dept_table_type is table of dept%ROWTYPE index by binary_integer; my_dname_table dept_table_type; int number(3); BEGIN int := -10; my_dname_table(int).dname := 'searching'; dbms_output.put_line(my_dname_table(int).dname); int := 0; my_dname_table(int).dname := 'market'; dbms_output.put_line(my_dname_table(int).dname); int := 10; my_dname_table(int).dname := 'finance'; dbms_output.put_line(my_dname_table(int).dname); END;
  • 62. 注意: Index-by表中的元素不一定要按任何特定的顺序排序 用于Index-by表的关键字没有必要是顺序的 关键字唯一允许的类型是BINARY_INTERGER(9.2之前) Oracle9.2之后: type v_name is table of number index by pls_integer; type v_name is table of number index by varchar2(4000);PL/SQL内存表(4)第62页
  • 63. PL/SQL内存表(5)第63页属性返回类型描述有效范围Exists(n)boolean指定索引为n的元素在集合中是否存在表、可变数组countnumber返回集合中元素的数目表、可变数组limitnumber返回集合中最大元素数可变数组First&lastBinary_integer返回第一个(最后一个)元素的索引表、可变数组Next&priorBinary_integer返回当前元素的下一个(前一个)元素的索引表、可变数组extendN/A向集合末尾添加一个元素可变数组trimN/A从集合的最后删除一个元素可变数组Delete(n)N/A删除元素下标为n的元素 表
  • 64. 使用隐式游标for c in (select …)输出每个人的工资等级(emp表和salgrade表)练习第64页
  • 65. 掌握异常处理 存储过程 函数 包 触发器 序列 XMLTYPE类型操作下节预告第65页
  • 66. 感谢您对华章培训网的支持!http://www. hztraining.com