【问题标题】:How to add values to a VARRAY using a loop如何使用循环向 VARRAY 添加值
【发布时间】:2017-01-30 23:59:33
【问题描述】:

我有一个 VARRAY,我想通过使用循环向这个 VARRAY 添加元素。这是我迄今为止尝试过的。

DECLARE
TYPE code_array_  IS VARRAY(26) OF VARCHAR2(6);
codes_ code_array_;

BEGIN
FOR i IN 1..26 LOOP    
    codes_(i) := dbms_random.string('U',6);
  END LOOP;
END;

上面的代码给了我一个错误

“ORA-06531:引用未初始化的集合”

【问题讨论】:

  • 你确定你需要一个可变数组,而不是一个嵌套表吗? 26 的限制是否非常有用,可以弥补嵌套表所失去的功能?
  • @William_Robertson VArray 维护元素顺序,而嵌套表和关联数组则没有。在需要元素顺序的应用程序中,varray 是您唯一的选择。

标签: plsql oracle11g varray


【解决方案1】:

正如错误信息所说,你需要initialise the collection variable:

...
BEGIN
  codes_ := code_array_();
  ...

但是您还需要调整它的大小,或者每次在循环中使用一个扩展:

  FOR i IN 1..26 LOOP    
    codes_.extend;
    ...

或者在开始之前一次性扩展:

...
BEGIN
  codes_ := code_array_();
  ...
  codes_.extend(26);
  FOR i IN 1..26 LOOP    
    ...

您也可以使用后扩展大小来控制循环,再次保存硬编码 26:

DECLARE
  TYPE code_array_ IS VARRAY(26) OF VARCHAR2(6);
  codes_ code_array_;
BEGIN
  codes_ := code_array_();
  codes_.extend(26);
  FOR i IN 1..codes_.count LOOP    
    codes_(i) := dbms_random.string('U',6);
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Read more about collections.

【讨论】:

    【解决方案2】:

    在将值分配给集合变量的特定元素之前,您必须使用构造函数初始化 varray 并对其进行扩展。 在 PLSQL 上下文中,最好使用关联集合。

    declare
        type code_array_ is varray(26) of varchar2(6);
        codes_ code_array_ := code_array_();
    begin
        <<init_codes>> begin codes_.extend(26);
            for i in codes_.first..codes_.last loop codes_(i) := dbms_random.string('U',6);
        end loop; end init_codes;
    end;
    /
    

    或者您可以使用 sql 来初始化整个集合,例如像这样:

    declare
        type code_array_ is varray(26) of varchar2(6);
        codes_ code_array_;
    begin
        select dbms_random.string('U',6) bulk collect into codes_ from dual connect by level<=26;
    end;
    /
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2019-05-02
      • 2021-02-18
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多