我这样写的,
CREATE PROCEDURE OR PROCEDURE varrtest
AS
TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
v_fieldlist FieldList;
BEGIN
v_fieldlist(1):='AAAA';
v_fieldlist(2):='BBB';
v_fieldlist(3):='CCC';
FOR v_i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
END LOOP;
END;运行后抱错:
ERROR 位于第 1 行:
ORA-06531: Reference to uninitialized collection请问该如何呢?
CREATE PROCEDURE OR PROCEDURE varrtest
AS
TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
v_fieldlist FieldList;
BEGIN
v_fieldlist(1):='AAAA';
v_fieldlist(2):='BBB';
v_fieldlist(3):='CCC';
FOR v_i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
END LOOP;
END;运行后抱错:
ERROR 位于第 1 行:
ORA-06531: Reference to uninitialized collection请问该如何呢?
解决方案 »
- 年 月 季度 统计问题
- 高手请进,合并列数据,wm_concat显示乱码?有没有其它方法合并列
- oracle 判断表空间是否存在 如果存在就删除,不存在就创建
- orcale表分区自动创建问题
- 怎么用DOS命令登录 Oracle-- sqlplus wmzhyz/rzaizhyz@NMCXZX 初始口令更改后怎么登录
- javax.management.MalformedObjectNameException
- round取小数的疑问
- [非常急]虚拟机上安装9i执行部分SQL时报ora-03113错误
- 卸载ORACLE后还有services不能卸掉怎么办
- 求帮写一个简单的触发器
- JDBC连ORACLE数据库问题
- 为什么在ORACLE 8.1.6中,建立了数据库链接DBLINK,测试时,提示:数据库链路未处于活动状态。不知道问题出在哪里?
2 type t_varr is varray(21) of varchar2(2);
3 v_varr t_varr:=t_varr(null);
4 begin
5 for i in 1..20 loop
6 v_varr.extend;
7 v_varr(i):=to_char(i);
8 dbms_output.put_line(v_varr(i));
9 end loop;
10 end;
11 /
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20PL/SQL procedure successfully completed
请问,就我上面写的过程哪里错了??应该如何改呢?谢谢
CREATE PROCEDURE OR PROCEDURE varrtest
AS
TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
v_fieldlist FieldList := FieldList('a','b','c'); -- 这里初始化
BEGIN
FOR v_i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
END LOOP;
END;或者你可以像楼上的那样,在定义时,构造数组为null,在循环中用方法extend,去扩充。
2 TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
3 v_fieldlist FieldList:=FieldList('aaa','bbb','ccc');
4 BEGIN
5
6 FOR v_i IN 1..3 LOOP
7 DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
8 END LOOP;
9 end;
10 /
aaa
bbb
ccc
改为以下语句
v_varr t_varr:=t_varr();--构造没有元素
而这里却存一个元素
v_varr t_varr:=t_varr(null);--构造一个元素,为空.
按照你说的改后,
TYPE FieldList IS VARRAY(3) OF VARCHAR2(30)
v_fieldlist FieldList:=FieldList();
--或者v_fieldlist FieldList:=FieldList(NULL);
其他不变,运行都抱错:
ERROR 位于第 1 行:
ORA-06533: Subscript beyond count我的目的是构造好数组后,在后面的过程中,根据不同情况给予不同的值。
应该如何构造呢??谢谢
我试了下如果写成v_fieldlist FieldList:=FieldList(1,2,3);运行就没错的,
但是如果我要声明个50个的数组,难道要写(1,2,3,..50)么??
FieldList := FieldList();
FieldList.Extend(3); 3 是数组的大小,建议使用变量代替,这样更改数组大小时不必修改很多SQL语句。然后就可以利用for循环等对数组进行赋值操作了。当你想重新利用数组时,进行清空操作也只要调用上面两句即可。
type t_index_table is table of varchar2(1000) index by binary_integer.
这个不需要初始化,直接用。下标从-2147483648到2147483648
v_fieldlist FieldList:=FieldList();--此处根本没有元素,若强行给数组赋值会错SQL> declare
2 TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
3 v_fieldlist FieldList:=FieldList('AAA','BBB','CCC');--构造没有元素的数组
4 BEGIN
5 FOR v_i IN 1..3 LOOP
6 DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
7 END LOOP;
8 end;
9 /
AAA
BBB
CCC若有五十个元素,像我那样,用一个循环赋值.就以了.
.....
TYPE FieldList IS VARRAY(50) OF VARCHAR2(3);
v_fieldlist FieldList:=FieldList();
BEGIN
FOR v_i IN 1..50 LOOP
v_fieldlist.extend;
v_fieldlist(v_i):=to_char(v_i);
--DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
END LOOP;
......
如果我开始 TYPE FieldList IS VARRAY(50) OF VARCHAR2(3);
构造时:FieldList := FieldList();
FieldList.Extend(3); 就3个,
这样会有什么不妥的地方么?
type t_varr is varray(20) of varchar2(2);
v_varr t_varr:=t_varr();--构造空数组,没有元素
begin
v_varr.extend(20);--把20个null元素添加到表的末端
for i in 1..20 loop
v_varr(i):=to_char(i);
dbms_output.put_line(v_varr(i));
end loop;
end;
/