【问题标题】:How to manually initialize a collection of RECORDs in PL/SQL?如何手动初始化 PL/SQL 中的记录集合?
【发布时间】:2011-04-12 01:13:42
【问题描述】:

伙计们。这是一个简单的 PL/SQL 二维数组示例,它运行良好。

declare
  type a is table of number;
  type b is table of a;

  arr b := b(a(1, 2), a(3, 4));
begin
  for i in arr.first .. arr.last loop
    for j in arr(i).first .. arr(i).last loop
      dbms_output.put_line(arr(i) (j));
    end loop;
  end loop;
end;

我需要做的是为 RECORDS 的表创建类似的东西。像这样:

 type a is record(a1 number, a2 number);
 type b is table of a;

问题是,我可以手动初始化这种数组,还是应该由bulk collects或类似的填充?与上面相同的语法似乎不起作用,我无法在手册中找到任何初始化示例。

【问题讨论】:

    标签: arrays oracle plsql multidimensional-array oracle9i


    【解决方案1】:

    RECORD 没有“构造函数”语法,因此您必须像这样填充它们:

    declare
     type a is record(a1 number, a2 number);
     type b is table of a;
     arr b := b();
    begin
     arr.extend(2);
     arr(1).a1 := 1;
     arr(1).a2 := 2;
     arr(2).a1 := 3;
     arr(2).a2 := 4;
    end;
    

    【讨论】:

    • 是的。我很少使用 RECORD 结构,除了那些使用 %ROWTYPE 与表或游标相关联并且便于 FETCHing 进入的结构。
    • hm,好吧,当我需要具有已知数据结构的临时数据存储时,我会使用它们——这使得代码具有某种自我注释功能。也许这是一种不好的做法。
    【解决方案2】:

    这可以在没有对象的情况下使用,但是您必须为类型 'a' 值声明构造函数。

    declare  
      type a is record(a1 number, a2 number);
      type b is table of a;
    
      arr b;
    
      --Constructor for type a
      function a_(a1 number, a2 number) return a is
        r_a a;
      begin
        r_a.a1 := a1;
        r_a.a2 := a2;
    
        return(r_a);
      end;
    
    begin
      arr := b(a_(1, 2), a_(3, 4), a_(5, 6), a_(7, 8));
    
      for i in arr.first .. arr.last loop
        dbms_output.put_line(arr(i).a1||', '||arr(i).a2);
      end loop;
    end;
    

    【讨论】:

    • 可爱!请注意任何重用它的人,函数定义必须是 declare 块中的最后一件事(否则你得到的编译错误是完全没有帮助的)。
    • 另外,如果你遇到PLS-00222: no function with name 'b' exists in this scope,你可能在表定义中添加了`index by pls_integer'。就像我一样 :) 谢谢@Shallow。
    【解决方案3】:

    自 18c 版以来,Qualified Expressions 提供了另一种定义复杂数据类型值的方法。引用:

    从 Oracle 数据库版本 18c 开始,任何 PL/SQL 值都可以由表达式(例如,对于记录或关联数组)提供,就像构造函数提供抽象数据类型值一样。在 PL/SQL 中,我们使用术语“限定表达式”和“聚合”而不是 SQL 术语“类型构造函数”,但功能是相同的。

    这是一个工作示例:

    declare 
        type a is record (a1 number, a2 number);
        type b is table of a index by varchar2 (16);
        arr b := b ('key1' => a (1, 2), 'key2' => a (3, 4)); 
    begin 
        declare key varchar2 (16) := arr.first; begin 
        <<foreach>> loop
            dbms_output.put_line (arr(key).a1||','||arr (key).a2);
            key := arr.next (key);
            exit foreach when key is null;
        end loop; end;
    end;
    /
    PL/SQL procedure successfully completed.
    
    1,2
    3,4
    

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多