如何将varchar添加到数组pl sql

时间:2018-06-15 08:36:37

标签: oracle plsql

我在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;?)

2 个答案:

答案 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.