我在PL / SQL
中将变量放入数组时遇到问题有可能以这种方式吗?我只想把它像C ++或其他语言一样只是迭代循环并动态添加值?
DECLARE
type grades is varray(5) of integer;
marks grades;
BEGIN
FOR i in 1 ..10 LOOP
marks(i):=grades(i);
dbms_output.put_line(' Marks: ' || marks(i));
END LOOP;
END;
我有另一个问题,是否可以在数组中添加字符串(单词)?
DECLARE
type namesarray is varray(10) of varchar2(10);
names namesarray;
BEGIN
FOR i in 1 ..10 LOOP
marks(i):=namesarray('client' || i);
dbms_output.put_line(' Marks: ' || marks(i));
END LOOP;
END;
是否可以添加客户端名称+迭代号码以获得类似的结果(" client1"," client2",...," client10&# 34;?)
答案 0 :(得分:1)
嗯 - 你在这里有选择 - 但在所有情况下,如果你有一个整数数组,你必须将整数分配给数组元素
原始
SQL> DECLARE
2 type grades is varray(5) of integer;
3 marks grades;
4 BEGIN
5 FOR i in 1 ..10 LOOP
6 marks(i):=grades(i);
7 dbms_output.put_line(' Marks: ' || marks(i));
8 END LOOP;
9 END;
10 /
marks(i):=grades(i);
*
ERROR at line 6:
ORA-06550: line 6, column 15:
PLS-00382: expression is of wrong type
ORA-06550: line 6, column 5:
PL/SQL: Statement ignored
已更正(我已将循环限制为5,因为您的数组大小为5)
SQL>
SQL> set serverout on
SQL> DECLARE
2 type grades is varray(5) of integer;
3 marks grades := grades();
4 BEGIN
5 FOR i in 1 ..5 LOOP
6 marks.extend;
7 marks(i):= i*20;
8 dbms_output.put_line(' Marks: ' || marks(i));
9 END LOOP;
10 END;
11 /
Marks: 20
Marks: 40
Marks: 60
Marks: 80
Marks: 100
PL/SQL procedure successfully completed.
如果您想要无限大小,可以使用“嵌套表”类型,如下所示
SQL>
SQL>
SQL> set serverout on
SQL> DECLARE
2 type grades is table of integer;
3 marks grades := grades();
4 BEGIN
5 FOR i in 1 ..20 LOOP
6 marks.extend;
7 marks(i):= i*20;
8 dbms_output.put_line(' Marks: ' || marks(i));
9 END LOOP;
10 END;
11 /
Marks: 20
Marks: 40
Marks: 60
Marks: 80
Marks: 100
Marks: 120
Marks: 140
Marks: 160
Marks: 180
Marks: 200
Marks: 220
Marks: 240
Marks: 260
Marks: 280
Marks: 300
Marks: 320
Marks: 340
Marks: 360
Marks: 380
Marks: 400
PL/SQL procedure successfully completed.
或者,有一个“关联数组”,您可以在其中指定数组索引的数据类型
SQL>
SQL>
SQL> set serverout on
SQL> DECLARE
2 type grades is table of integer index by pls_integer;
3 marks grades;
4 BEGIN
5 FOR i in 1 ..20 LOOP
6 marks(i):= i*20;
7 dbms_output.put_line(' Marks: ' || marks(i));
8 END LOOP;
9 END;
10 /
Marks: 20
Marks: 40
Marks: 60
Marks: 80
Marks: 100
Marks: 120
Marks: 140
Marks: 160
Marks: 180
Marks: 200
Marks: 220
Marks: 240
Marks: 260
Marks: 280
Marks: 300
Marks: 320
Marks: 340
Marks: 360
Marks: 380
Marks: 400
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL>
希望有所帮助
答案 1 :(得分:0)
我认为你正在尝试这样的事情。
SET SERVEROUTPUT ON
DECLARE
type namesarray is varray(10) of varchar2(10);
type grades is varray(10) of integer;
names namesarray := namesarray(); --initialization
marks grades := grades(70,65,56,45,89,60,34,78,90,100);--initialization
BEGIN
FOR i in 1 ..10 LOOP
names.extend; -- append a null array element
names(i) := 'client' || i; --assign the value for name
dbms_output.put_line('Client: '||names(i)||'| Marks: ' || marks(i));
END LOOP;
END;
/
Client: client1| Marks: 70
Client: client2| Marks: 65
Client: client3| Marks: 56
Client: client4| Marks: 45
Client: client5| Marks: 89
Client: client6| Marks: 60
Client: client7| Marks: 34
Client: client8| Marks: 78
Client: client9| Marks: 90
Client: client10| Marks: 100
PL/SQL procedure successfully completed.