PLSQL入门到精通(第13章:集合类型和变量)
这次就和上次的记录变量一样,作为构造复杂的变量,对集合变量进行说明。 集合变量是可以存储多个数据类型值的变量。 数据类型可以是基本简单的数据类型,如NUMBER, 也可以是用户定义的记录类型等复杂的数据类型。 作为集合变量的一个应用示例,游表关闭后,无法再次提取游标得值的时候, 可以在游标处理中使用集合变量保存数据。 否则的话,反复使用游标数据的话,就需要把游标暂时关闭, 然后重新打开,反复读到需要的数据为止,这是非常不合理的逻辑。 这种时候,如果使用集合鼻梁的话,可以优雅地解决该问题。 也就是说,如果将提取的行保存在集合游标变量中,即使游标关闭后, 也可以参照和使用游标变量的值。 集合变量的语法: 集合变量首先声明类型,然后使用该类型声明集合变量。 集合类型有三种: ・组合排列(也称为PL/SQL表、索引附表) ・嵌套表 ・可变排列(也称为VARRAY) 虽然有各自的特征和区分使用,但是这里介绍最容易操作的结合排列(也叫PL/SQL表、索引附表)。 在组合数组中,可以自由存储两个键和值,而不限制数量。 键值可以不连续。
首先,宣言分为“类型声明”和“变量声明”两个阶段。 <类型声明> TYPE 类型 IS TABLE OF 数据类型 INDEXBY 键数据类型; <声明变量> 变量名称 类型;
键的数据类型是整数或字符串。 键为整数时,指定PLS INTER或BINARY INTERGER。 键为字符串时,指定VACHAR2(n)。(n为大小) 即使键为整数,也可以是不连续的键值。键值是负数也可以是整数。 如果需要,也可以将字符串用作键。
如您所看到的,键值不需要连续的数值。
下面将介绍与游标处理相结合的应用实例。 1 DECLARE 2 CURSOR C1 IS SELECT DEPTNO, DNAME FROM DEPT; 3 REC C1%ROWTYPE; 4 TYPE REC_TAB_TYPE IS TABLE OF C1%ROWTYPE INDEX BY BINARY_INTEGER; 5 REC_TAB REC_TAB_TYPE; 6 I BINARY_INTEGER := 1; 7 BEGIN 8 OPEN C1; 9 LOOP 10 FETCH C1 INTO REC; 11 EXIT WHEN C1%NOTFOUND; 12 DBMS_OUTPUT.PUT_LINE(‘从游标开始’||REC.DNAME); 13 REC_TAB(I) := REC; 14 I := I + 1; 15 END LOOP; 16 CLOSE C1; 17 DBMS_OUTPUT.PUT_LINE(’------------------------------------------------’); 18 FOR I IN 1…REC_TAB.COUNT LOOP 19 DBMS_OUTPUT.PUT_LINE( ‘从集合开始·’||REC TAB(I).DNPAME); 20 END LOOP; 21* END; SQL> /
从游标开始ONE 从游标开始TWO 从游标开始THTEE ----------------------------------------------- 从集合开始ONE 从集合开始TWO 从集合开始THTEE
PL/SQL过程成功完成。 SQL>
上面例子的说明如下: 第二行声明显式游标(就是定义过的游标) 第三行声明游标的记录类型变量 第四行声明游标的记录类型集合类型(这样也可以收集记录类型) 第五行声明其类型的集合变量 第六行集合中键的变量声明 第8~15行明示游标逐行相识到画面上,并保存在集合变量中 第16行关闭显式游标 18~20集合变量的内容各自显示到画面上 ※第18行TAB.COUNT”表示集合元素的数量。 在上述例子中是3。 因此,FOR I IN 1.RECTAB.COUNT LOOP键I是从1到3循环的意思。 总结:在集合变量中存储显式游标取得的行记录, 并关闭显式游标后,可以再次确认是否使用了这些数据。 在上面的例子中,集合的键使用了从1号开始连续的整数, 但是连续不是必须的。 因此,像部门编号那样,10、20、30等不连续的数值也可以。
这就是集合变量用法。会了么。亲。